diff --git a/.dev/up_deps.jl b/.dev/up_deps.jl index 2ca708eb..446ed1a5 100644 --- a/.dev/up_deps.jl +++ b/.dev/up_deps.jl @@ -8,9 +8,8 @@ dirs = ( root, joinpath(root, "test"), joinpath(root, ".dev"), - joinpath(root, "perf"), joinpath(root, "docs"), - joinpath(root, "examples"), + joinpath(root, "experiments"), ) cd(root) do diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..1aaf1346 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,46 @@ +name: ci +on: + push: + branches: + - main + - trying + - staging + tags: '*' + pull_request: + +jobs: + test: + name: ci ${{ matrix.version }} - ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + version: + - '1.9' + os: + - ubuntu-latest + - macOS-latest + arch: + - x64 + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: ${{ matrix.version }} + arch: ${{ matrix.arch }} + - uses: actions/cache@v1 + env: + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v1 + with: + file: lcov.info \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 26c9ad58..8bd7a61c 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v2 - uses: julia-actions/setup-julia@latest with: - version: 1.8 + version: 1.9 - name: Install dependencies run: julia --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()' - name: Build and deploy diff --git a/.github/workflows/julia_formatter.yml b/.github/workflows/julia_formatter.yml index 706dd84f..2dae8be0 100644 --- a/.github/workflows/julia_formatter.yml +++ b/.github/workflows/julia_formatter.yml @@ -31,7 +31,7 @@ jobs: - uses: julia-actions/setup-julia@latest if: steps.filter.outputs.julia_file_change == 'true' with: - version: '1.8' + version: '1.9' - name: Apply JuliaFormatter if: steps.filter.outputs.julia_file_change == 'true' diff --git a/.gitignore b/.gitignore index 6427032f..48b17b83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,12 @@ -# Simulation outputs -*.png -*.hdf5 +# Simulation outputs and logs output/* +test/test_init/iteration* +*.out +*.lock +*.hdf5 +*.h5 +*.nc +!experiments/*/*.hdf5 # System-specific files and directories generated by the BinaryProvider and BinDeps packages # They contain absolute paths specific to the host computer, and so should not be committed @@ -17,7 +22,10 @@ docs/site/ # Julia package dependencies /Manifest.toml -/*/Manifest.toml +.dev/Manifest.toml +plot/Manifest.toml +test/Manifest.toml +docs/Manifest.toml # misc .DS_Store \ No newline at end of file diff --git a/Project.toml b/Project.toml index 206f5745..00e348c3 100644 --- a/Project.toml +++ b/Project.toml @@ -9,6 +9,7 @@ ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" EnsembleKalmanProcesses = "aa8a2aa5-91d8-4396-bcef-d4f2ec43552d" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" diff --git a/docs/make.jl b/docs/make.jl index 732dd020..df070e61 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -1,24 +1,32 @@ using Documenter using Documenter: doctest +using CalibrateAtmos using Base.CoreLogging using DocumenterCitations disable_logging(Base.CoreLogging.Info) # Hide doctest's `@info` printing +bib = CitationBibliography(joinpath(@__DIR__, "bibliography.bib")) + +doctest(CalibrateAtmos; plugins = [bib]) disable_logging(Base.CoreLogging.BelowMinLevel) # Re-enable all logging makedocs( - CitationBibliography(joinpath(@__DIR__, "bibliography.bib")), - modules = Vector{Module}(), + plugins = [bib], + modules = [CalibrateAtmos], sitename = "CalibrateAtmos.jl", authors = "Clima", - strict = true, checkdocs = :exports, format = Documenter.HTML( prettyurls = !isempty(get(ENV, "CI", "")), collapselevel = 1, mathengine = MathJax3(), ), - pages = ["Home" => "index.md"], + pages = [ + "Home" => "index.md", + "Getting Started" => "quickstart.md", + "Experiment Setup Guide" => "experiment_setup_guide.md", + "API" => "api.md", + ], ) deploydocs( diff --git a/docs/src/api.md b/docs/src/api.md new file mode 100644 index 00000000..7955a287 --- /dev/null +++ b/docs/src/api.md @@ -0,0 +1,13 @@ +# API + +## ClimaAtmos Interface +```@docs +CalibrateAtmos.get_atmos_config +CalibrateAtmos.run_forward_model +``` + +## EnsembleKalmanProcesses Interface +```@docs +CalibrateAtmos.initialize +CalibrateAtmos.update_ensemble +``` diff --git a/docs/src/assets/sphere_held_suarez_rhoe_equilmoist_convergence.png b/docs/src/assets/sphere_held_suarez_rhoe_equilmoist_convergence.png new file mode 100644 index 00000000..93b26e5b Binary files /dev/null and b/docs/src/assets/sphere_held_suarez_rhoe_equilmoist_convergence.png differ diff --git a/docs/src/experiment_setup_guide.md b/docs/src/experiment_setup_guide.md new file mode 100644 index 00000000..d864f7cf --- /dev/null +++ b/docs/src/experiment_setup_guide.md @@ -0,0 +1,241 @@ +# Experiment Set Up Guide + +Please read this entire guide before setting up an experiment. +This guide assumes familiarity with ClimaAtmos and a basic understanding of Ensemble Kalman Inversion. + +## Summary + +The overall pipeline is as follows: + +For a perfect model scenario, observations are generated by running the model and then processing the diagnostic output through the constructed observation map. + +For the example experiment, `sphere_held_suarez_rhoe_equilmoist`, this is done by running +`sbatch experiments/sphere_held_suarez_rhoe_equilmoist/generate_observations.sbatch`. This script runs the model, passes the output through the observation map, and saves the result. + +Once the observations have been processed and saved, the actual calibration pipeline can be run via +`bash experiments/pipeline.sh sphere_held_suarez_rhoe_equilmoist 8`. + +!!! note + The command line interface for `pipeline.sh` will change. For now, the first entry is the experiment id and the second is the number of tasks to use per ensemble member. + +This consists of three `sbatch` scripts: +- `initialize.sbatch` initializes the Julia project and the ensemble +- `model_run.sbatch` runs an individual forward model +- `update.sbatch` performs the update step and sets up the next iteration + +To calibrate parameters, you need: +- Atmos model configuration +- Steady-state restart file +- EKP configuration +- Prior parameter distributions +- Truth and noise data +- Observation map script with a function `observation_map(iteration)` + +These components are detailed in the guide below. Examples of all of these can also be found in `experiments/sphere_held_suarez_rhoe_equilmoist` + +First, create a folder for your experiment with a descriptive experiment id in the `experiments/` folder. All of the components described below will be stored in this folder. + +## Atmos Configuration File +This is the ClimaAtmos configuration which will be used to run all simulations in the calibration. The only changes between model runs are the parameters selected for calibration. +This file is a typical Atmos YAML file with a few restrictions. It must: + +- be named `atmos_config.yml`. +- include an `output_dir` to store model output. +- include the path to the restart file. This is detailed in the next section. +Here is an example of the arguments you will need: +``` +output_dir: output/experiment_name +restart_file: experiments/experiment_name/restart_file.hdf5 +``` + +If your configuration requires a parameter TOML file, add this file to the experiment folder and set the `toml` entry in the configuration to the relative file path from the base directory of `CalibrateAtmos.jl`. + +!!! note + When targeting a global or otherwise costly simulation, it may be worth it to optimize your timestep `dt` as well as your timestepping algorithm, `ode_algo`. + +## Restart File +The restart file is a model snapshot which will be used to spin-off all ensemble members' forward model runs. + +Once you have settled on a configuration, follow these steps to generate a restart file: + +1. Run ClimaAtmos with your configuration to determine the time it takes for the simulation to reach an equilibrium state. +2. Generate a restart file by setting `dt_save_restart` in the model configuration to the equilibrium timestamp. +3. Transfer the file to your experiment directory and enter the relative path into your atmosphere configuration file: +``` +restart_file: experiments/experiment_name/restart_file.hdf5 +``` + +!!! note + A restarted simulation starts from the saved date of the restart file. A restart file saved at 200 days and a `t_end` of 201 days will only run for 1 simulated day: + ``` + restart_file: experiments/experiment_name/day200.hdf5 + t_end: 201 days + ``` + +## Prior Distribution File +First, create your TOML file in your experiment folder. +For each calibrated parameter, create a prior distribution with the following format: +```toml +[long_name] +alias = "alias_name" +type = "float" +prior = "Parameterized(Normal(0,1))" +constraint = "[bounded(0,5)]" +``` +Note that the prior distribution here is in unconstrained space - the `constraint` list constrains the distribution in parameter space. + +!!! note "Why two parameter spaces?" + The calibration tools are effective when working with unconstrained parameters (`u`), whereas physical models typically require (partially-)bounded parameters (`φ`). + To satisfy both conditions the `ParameterDistribution` object contains maps between these two spaces. The drawback is that the prior must be defined in the unconstrained space. + +An easy way to generate prior distributions in constrained parameter space is with the [constrained_gaussian](https://clima.github.io/EnsembleKalmanProcesses.jl/dev/API/ParameterDistributions/#EnsembleKalmanProcesses.ParameterDistributions.constrained_gaussian) constructor from `EnsembleKalmanProcesses.ParameterDistributions`. Here is an example: +```julia +using EnsembleKalmanProcesses.ParameterDistributions +physical_mean = 125 +physical_std = 40 +lower_bound = -50 +upper_bound = Inf +constrained_gaussian("name", physical_mean, physical_std, lower_bound, upper_bound) +``` +This constructor will provide a Normal distribution, which, when transformed will approximate the target mean and standard deviation provided. +``` +ParameterDistribution with 1 entries: +'name' with Constraint{BoundedBelow}[Bounds: (-50, ∞)] over distribution +Parameterized(Distributions.Normal{Float64}(μ=5.1393230339433345, σ=0.2256676316186263)) +``` +Copy the mean and standard deviation values into the constructor for the prior distribution in your TOML file like so: +```toml +[long_name] +alias = "alias_name" +type = "float" +prior = "Parameterized(Normal(5.1393230, 0.225667))" +constraint = "bounded_below(-50)" +description = " this prior has approximate (mean,std) = (125,40) and is bounded below by -50" +``` + +You can also ensure that the bounds match the `constraint` entry in your TOML file. +Since `constraint` is a TOML string parsed to a vector in Julia, ensure that you have quotes around the square brackets for the constraint list. + +Constraint constructors: +- Lower bound: `bounded_below(0)` +- Upper bound: `bounded_above(2)` +- Upper and lower bounds: `bounded(0, 2)` + +!!! note + The API for constrained_gaussian priors in TOML files is coming soon. This page will be updated accordingly. + +## Observation Map +The observation map is applied to process model output diagnostics into the exact observable used to fit to observations. In a perfect model setting it is used also to generate the observation. + +This component is inflexible for now. Your observation map file must be a script with the name `observation_map.jl` which exports a function `observation_map(iteration)`. +These requirements arise from the update step, which runs: +```julia +include("experiments/$experiment_id/observation_map.jl") +observation_map(iteration) +``` +This function must load in model diagnostics for each ensemble member in the iteration and construct an array `arr = Array{Float64}(undef, dims..., ensemble_size)` such that +`arr[:, i]` will return the i-th ensemble member's observation map output. + +In the update step of EKI, the array will be saved in a JLD2 file named `observation_map.jld2` in the iteration folder of the output directory. + +As an example, in `observation_map(iteration)` in the `sphere_held_suarez_rhoe_equilmoist` experiment, we have the following sequence: + +`observation_map(iteration)` constructs the array to store the ensemble's observations. Then, for each ensemble member `m`: +- it loads in the model diagnostic output, in this case 60-day air temperature averages. +- it calls `process_member_data(m)` and stores the result in the output array. +Pseudocode for `observation_map(iteration)`: +```julia +function observation_map(iteration) + # Get Configuration + experiment_id = "sphere_held_suarez_rhoe_equilmoist" + config = load_config(experiment_id) + ensemble_size = config["ensemble_size"] + + # Setup output array + # dims = size of individual member observation map output + dims = 1 + G_ensemble = Array{Float64}(undef, dims..., ensemble_size) + + for m in 1:ensemble_size + ta = load_member_diagnostics(m) + # Compute observation map for the member + G_ensemble[:, m] = process_member_data(ta) + end + return G_ensemble +end +``` + +`process_member_data(m)` then does the following: +1. Removes the first two samples to ensure an equilibrium state +2. Averages across latitude and longitude +3. Extracts the second height slice +4. Returns the third sample in an array + +Pseudocode for `process_member_data(m)`: +```julia +function process_member_data(ta; output_variance = false) + # Cut off first two points to ensure equilibrium, grab second height slice + ta_second_height = ta[3:size(ta)[1], :, :, 2] + # Average over long and latitude + area_avg_ta_second_height = + longitudinal_avg(latitudinal_avg(ta_second_height)) + # Take the third sample + observation = [area_avg_ta_second_height[3]] + return observation +end +``` + +If you are running a perfect-model experiment and generating truth data from ClimaAtmos itself, you may find it useful to create a kernel function to compute the observation map for each ensemble member. You can use this to run the default simulation's diagnostic output through the observation map and save the truth data and noise. + +## Generating Truth Data +The truth data must be an array of observations with the same dimensions as an individual ensemble member's entry in the observation map (`arr[:, i]` from above). + +The noise is the sample covariance of the truth data. The dimension of each truth data sample determines how many samples you need to generate. Covariance estimation techniques may be required for high dimensional truth data. + +Save a single sample from the observations and the noise in separate JLD2 files. These will be read in when constructing the EKP object. +For `sphere_held_suarez_rhoe_equilmoist`, these are saved as `obs_mean.jld2` and `obs_noise_cov.jld2` respectively. +To inspect them, start `julia --project=experiments` and run: +```julia +import JLD2 +experiment_path = joinpath("experiments", "sphere_held_suarez_rhoe_equilmoist") +truth = JLD2.load_object(joinpath(experiment_path, "obs_mean.jld2")) +noise = JLD2.load_object(joinpath(experiment_path, "obs_noise_cov.jld2")) +``` + +!!! note + + For full reproducibility, create and store a script that generates the truth data. + If running a perfect-model scenario, the script should run the model and use the resulting diagnostic output to generate the truth data. + +## EKP Configuration File + +For now, your EKP configuration file must be named `ekp_config.yml` +The EKP configuration file must contain the following: + +- `n_iterations`, the number of iterations to run +- `ensemble_size`, the ensemble size +- `prior_path`, the path to the TOML file with the prior parameter distributions +- `parameter_names`, a list of the long names of the parameters being calibrated +- `truth_data`, the truth data +- `truth_noise`, the covariance of the truth data +- `output_dir`, the folder where you want calibration data and logs to be output. This must be the same as the `output_dir` in the model configuration file. +Example: +``` +output_dir: output/sphere_held_suarez_rhoe_equilmoist +prior_path: experiments/sphere_held_suarez_rhoe_equilmoist/prior.toml +parameter_names: ["equator_pole_temperature_gradient_wet"] +ensemble_size: 10 +n_iterations: 3 +truth_data: experiments/sphere_held_suarez_rhoe_equilmoist/obs_mean.jld2 +truth_noise: experiments/sphere_held_suarez_rhoe_equilmoist/obs_noise_cov.jld2 +``` + +## Plotting Results + +A function `convergence_plot(eki, prior, theta_star)` is included in `plot/convergence_plots.jl`. +Given the EKI object, prior, and goal parameter `theta_star`, it will output plots with +error, spread, and parameter values over iterations. + +Sample plot from `sphere_held_suarez_rhoe_equilmoist`: +![Convergence Plot](assets/sphere_held_suarez_rhoe_equilmoist_convergence.png) + diff --git a/docs/src/quickstart.md b/docs/src/quickstart.md new file mode 100644 index 00000000..5aa5c2dd --- /dev/null +++ b/docs/src/quickstart.md @@ -0,0 +1,13 @@ +# Getting Started + +A good way to get started is to run the initial experiment, `sphere_held_suarez_rhoe_equilmoist`. +It is a perfect-model calibration, serving as a test case for the initial pipeline. + +This experiment runs the Held-Suarez configuration, estimating the parameter `equator_pole_temperature_gradient_wet`. +By default, it runs 10 ensemble members for 3 iterations. + +To run this experiment: +1. Log onto the Caltech HPC +2. Clone CalibrateAtmos.jl and `cd` into the repository. +3. Run: `bash experiments/pipeline.sh sphere_held_suarez_rhoe_equilmoist 8`. This will run the `sphere_held_suarez_rhoe_equilmoist` experiment with 8 tasks per ensemble member. + diff --git a/examples/moist_held_suarez/moist_held_suarez.yml b/examples/moist_held_suarez/moist_held_suarez.yml deleted file mode 100644 index 402f7a6d..00000000 --- a/examples/moist_held_suarez/moist_held_suarez.yml +++ /dev/null @@ -1,12 +0,0 @@ -dt: 200secs -t_end: 200secs -# t_end: 2days -ode_algo: ARS343 -# dt_save_to_disk: Inf -dt_save_to_disk: 200secs -# vert_diff: "true" -moist: equil -forcing: held_suarez -precip_model: 0M -job_id: sphere_held_suarez_rhoe_equilmoist -output_dir: output/moist_held_suarez diff --git a/examples/moist_held_suarez/priors/moist_held_suarez.toml b/examples/moist_held_suarez/priors/moist_held_suarez.toml deleted file mode 100644 index 0d8a8bac..00000000 --- a/examples/moist_held_suarez/priors/moist_held_suarez.toml +++ /dev/null @@ -1,4 +0,0 @@ -["ΔT_y_wet"] -prior = "Parameterized(Normal(65,20.0))" -constraint = "[bounded_below(0)]" - diff --git a/experiments/Manifest.toml b/experiments/Manifest.toml new file mode 100644 index 00000000..ac019b0f --- /dev/null +++ b/experiments/Manifest.toml @@ -0,0 +1,1705 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.9.3" +manifest_format = "2.0" +project_hash = "485aa82afda9010cace6de708120f829dc18ba1a" + +[[deps.ADTypes]] +git-tree-sha1 = "5d2e21d7b0d8c22f67483ef95ebdc39c0e6b6003" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "0.2.4" + +[[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 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.4" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "68c4c187a232e7abe00ac29e3b03e09af9d77317" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.7.0" +weakdeps = ["StaticArrays"] + + [deps.Adapt.extensions] + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgParse]] +deps = ["Logging", "TextWrap"] +git-tree-sha1 = "3102bce13da501c9104df33549f511cd25264d7d" +uuid = "c7e460c6-2fb9-53a9-8c5b-16f535851c63" +version = "1.1.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[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", "Requires", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "f83ec24f76d4c8f525099b2ac475fc098138ec31" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.4.11" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + 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" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra"] +git-tree-sha1 = "9a731850434825d183af39c6e6cd0a1c32dd7e20" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.4.2" +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" + +[[deps.AtmosphericProfilesLibrary]] +deps = ["Dierckx", "LinearAlgebra"] +git-tree-sha1 = "c6be1ce28b7870a60400c51c75dc1b08d6a8dd73" +uuid = "86bc3604-9858-485a-bdbe-831ec50de11d" +version = "0.1.4" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "0.1.0" + +[[deps.AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + +[[deps.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random", "Test"] +git-tree-sha1 = "dbf84058d0a8cbbadee18d25cf606934b22d7c66" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.4.2" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] +git-tree-sha1 = "8f32ba3789b29880901748dce28f7d5c1d4ae86a" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "1.1.0" +weakdeps = ["SparseArrays"] + + [deps.BandedMatrices.extensions] + BandedMatricesSparseArraysExt = "SparseArrays" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.BenchmarkTools]] +deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "d9a9701b899b30332bbcb3e1679c41cce81fb0e8" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.3.2" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + +[[deps.BlockArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"] +git-tree-sha1 = "54cd829dd26330c42e1cf9df68470dd4df602c61" +uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" +version = "0.16.38" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[deps.CEnum]] +git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.4.2" + +[[deps.CFTime]] +deps = ["Dates", "Printf"] +git-tree-sha1 = "ed2e76c1c3c43fd9d0cb9248674620b29d71f2d1" +uuid = "179af706-886a-5703-950a-314cd64e0468" +version = "0.1.2" + +[[deps.CLIMAParameters]] +deps = ["DocStringExtensions", "TOML", "Test"] +git-tree-sha1 = "d7fc796a407bfe7cc1f8ffdb386c55d60a801a63" +uuid = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" +version = "0.7.24" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.4" + +[[deps.CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "Preferences", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "SpecialFunctions", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "968c1365e2992824c3e7a794e30907483f8469a9" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "4.4.1" + +[[deps.CUDA_Driver_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "498f45593f6ddc0adff64a9310bb6710e851781b" +uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" +version = "0.5.0+1" + +[[deps.CUDA_Runtime_Discovery]] +deps = ["Libdl"] +git-tree-sha1 = "bcc4a23cbbd99c8535a5318455dcf0f2546ec536" +uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" +version = "0.2.2" + +[[deps.CUDA_Runtime_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "5248d9c45712e51e27ba9b30eebec65658c6ce29" +uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" +version = "0.6.0+0" + +[[deps.Calculus]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" +uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" +version = "0.5.1" + +[[deps.CalibrateAtmos]] +deps = ["ClimaAtmos", "ClimaComms", "ClimaCore", "Distributions", "EnsembleKalmanProcesses", "JLD2", "LinearAlgebra", "Random", "TOML", "YAML"] +path = ".." +uuid = "4347a170-ebd6-470c-89d3-5c705c0cacc2" +version = "0.1.0" + +[[deps.CatIndices]] +deps = ["CustomUnitRanges", "OffsetArrays"] +git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" +uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" +version = "0.2.2" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "e0af648f0692ec1691b5d094b8724ba1346281cf" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.18.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.ClimaAtmos]] +deps = ["ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "CLIMAParameters", "CUDA", "ClimaComms", "ClimaCore", "ClimaTimeSteppers", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FastGaussQuadrature", "ImageFiltering", "Insolation", "Interpolations", "IntervalSets", "JLD2", "Krylov", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "Test", "Thermodynamics", "YAML"] +git-tree-sha1 = "ce681442e025c59bfce30aca4d95ed8c455b574d" +repo-rev = "gb/diagnostics_ready" +repo-url = "https://github.com/CliMA/ClimaAtmos.jl.git" +uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717" +version = "0.16.2" + +[[deps.ClimaComms]] +deps = ["CUDA", "MPI"] +git-tree-sha1 = "88613e2098c9aaf134ac01a2139fac835661bd04" +uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" +version = "0.5.5" + +[[deps.ClimaCore]] +deps = ["Adapt", "BandedMatrices", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "LinearAlgebra", "PkgVersion", "RecursiveArrayTools", "Requires", "RootSolvers", "SparseArrays", "Static", "StaticArrays", "Statistics", "UnPack"] +git-tree-sha1 = "4a5138604b65cfa2d30b90ddf5252106874940c3" +uuid = "d414da3d-4745-48bb-8d80-42e94e092884" +version = "0.10.55" + +[[deps.ClimaTimeSteppers]] +deps = ["CUDA", "ClimaComms", "Colors", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "KernelAbstractions", "Krylov", "LinearAlgebra", "LinearOperators", "NVTX", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "0294e5f032a1d578094431082600e864eb8554cf" +uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79" +version = "0.7.14" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + +[[deps.CloudMicrophysics]] +deps = ["CLIMAParameters", "DocStringExtensions", "ForwardDiff", "KernelAbstractions", "RootSolvers", "SpecialFunctions", "Thermodynamics"] +git-tree-sha1 = "153238dfeb7bed07fa8f10c535d78e2340f3c882" +uuid = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" +version = "0.14.0" + +[[deps.CodecBzip2]] +deps = ["Bzip2_jll", "Libdl", "TranscodingStreams"] +git-tree-sha1 = "c0ae2a86b162fb5d7acc65269b469ff5b8a73594" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.8.1" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "cd67fc487743b2f0fd4380d4cbd3a24660d0eec8" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.3" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.4" + +[[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 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.10" + +[[deps.CommonDataModel]] +deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf"] +git-tree-sha1 = "7f5717cbb2c1ce650cfd454451f282df33103596" +uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" +version = "0.2.5" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.0" + +[[deps.Compat]] +deps = ["UUIDs"] +git-tree-sha1 = "8a62af3e248a8c4bad6b32cbbe663ae02275e32c" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.10.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.0.5+0" + +[[deps.ComputationalResources]] +git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" +uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" +version = "0.3.2" + +[[deps.ConstructionBase]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "c53fc348ca4d40d7b371e71fd52251839080cbc9" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.5.4" +weakdeps = ["IntervalSets", "StaticArrays"] + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseStaticArraysExt = "StaticArrays" + +[[deps.Convex]] +deps = ["AbstractTrees", "BenchmarkTools", "LDLFactorizations", "LinearAlgebra", "MathOptInterface", "OrderedCollections", "SparseArrays", "Test"] +git-tree-sha1 = "af4188609c0620ed4b0e4493ed416d3c8b2dadeb" +uuid = "f65535da-76fb-5f13-bab9-19810c17039a" +version = "0.15.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.CubedSphere]] +deps = ["Elliptic", "FFTW", "Printf", "ProgressBars", "SpecialFunctions", "TaylorSeries", "Test"] +git-tree-sha1 = "253193dfb0384646936c5ff3230b27a20d91261e" +uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" +version = "0.2.4" + +[[deps.CustomUnitRanges]] +git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" +uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" +version = "1.0.2" + +[[deps.DataAPI]] +git-tree-sha1 = "8da84edb865b0b5b0100c0666a9bc9a0b71c553c" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.15.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3dbd312d370723b6bb43ba9d02fc36abade4518d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.15" + +[[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" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.Dierckx]] +deps = ["Dierckx_jll"] +git-tree-sha1 = "d1ea9f433781bb6ff504f7d3cb70c4782c504a3a" +uuid = "39dd38d3-220a-591b-8e3c-4c3a8c710a94" +version = "0.5.3" + +[[deps.Dierckx_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6596b96fe1caff3db36415eeb6e9d3b50bfe40ee" +uuid = "cd4c43a9-7502-52ba-aa6d-59fb2a88580b" +version = "0.1.0+0" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "ChainRulesCore", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces", "ZygoteRules"] +git-tree-sha1 = "36a590efdbee58b38f903ffc3b378f4a5336bc3f" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.134.0" + + [deps.DiffEqBase.extensions] + DiffEqBaseDistributionsExt = "Distributions" + DiffEqBaseEnzymeExt = "Enzyme" + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + DiffEqBaseZygoteExt = "Zygote" + + [deps.DiffEqBase.weakdeps] + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + 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" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.DiffEqCallbacks]] +deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "Functors", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "6cb07ea2557f425a5464ab1bd21c50464368c1a2" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "2.33.1" + + [deps.DiffEqCallbacks.weakdeps] + OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" + Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4" + +[[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 = ["OffsetArrays"] +git-tree-sha1 = "1bfa9de80f35ac63c6c381b2d43c590875896a1f" +uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3" +version = "0.3.22" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "5225c965635d8c21168e32a12954675e7bea1151" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.10" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[deps.Distributions]] +deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "3d5873f811f582873bb9871fc9c451784d5dc8c7" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.102" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + +[[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.DualNumbers]] +deps = ["Calculus", "NaNMath", "SpecialFunctions"] +git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" +uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" +version = "0.6.8" + +[[deps.Elliptic]] +git-tree-sha1 = "71c79e77221ab3a29918aaf6db4f217b89138608" +uuid = "b305315f-e792-5b7a-8f41-49f472929428" +version = "1.0.1" + +[[deps.EnsembleKalmanProcesses]] +deps = ["Convex", "Distributions", "DocStringExtensions", "GaussianRandomFields", "LinearAlgebra", "MathOptInterface", "Optim", "QuadGK", "Random", "RecipesBase", "SCS", "SparseArrays", "Statistics", "StatsBase", "TOML"] +git-tree-sha1 = "75f13790b7d251c604c850e75d45af302d97a5e4" +uuid = "aa8a2aa5-91d8-4396-bcef-d4f2ec43552d" +version = "1.1.3" + +[[deps.EnumX]] +git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.4" + +[[deps.EnzymeCore]] +deps = ["Adapt"] +git-tree-sha1 = "d8701002a745c450c03b890f10d53636d1a8a7ea" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.6.2" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.FFTViews]] +deps = ["CustomUnitRanges", "FFTW"] +git-tree-sha1 = "cbdf14d1e8c7c8aacbe8b19862e0179fd08321c2" +uuid = "4f61f5a4-77b1-5117-aa51-3ab5ef4ef0cd" +version = "0.3.2" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "b4fbdd20c889804969571cc589900803edda16b7" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.7.1" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "9d77cb1caf03e67514ba60bcfc47c6e131b1950c" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.2.7" + +[[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 = "0f478d8bad6f52573fb7658a263af61f3d96e43a" +uuid = "442a2c76-b920-505d-bb47-c5924d526838" +version = "0.5.1" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "299dc33549f68299137e51e6d49a13b5b1da9673" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.16.1" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FillArrays]] +deps = ["LinearAlgebra", "Random"] +git-tree-sha1 = "35f0c0f345bff2c6d636f95fdb136323b5a796ef" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.7.0" +weakdeps = ["SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] +git-tree-sha1 = "c6e4a1fbe73b31a3dea94b1da449503b8830c306" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.21.1" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[deps.Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "0.10.36" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[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.Functors]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9a68d75d466ccc1218d0552a8e1631151c569545" +uuid = "d9f16b24-f501-4c13-a1f2-28368ffc5196" +version = "0.4.5" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] +git-tree-sha1 = "2e57b4a4f9cc15e85a24d603256fe08e527f48d1" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "8.8.1" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "2d6ca471a6c7b536127afccfa7564b5b39227fe0" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.1.5" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"] +git-tree-sha1 = "72b2e3c2ba583d1a7aa35129e56cf92e07c083e3" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "0.21.4" + +[[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", "Random", "RecipesBase", "SpecialFunctions", "Statistics", "StatsBase"] +git-tree-sha1 = "055849d7a602c31eda477a0b0b86c9473a3e4fb9" +uuid = "e4b2fa32-6e09-5554-b718-106ed5adafe9" +version = "2.2.4" + +[[deps.GilbertCurves]] +git-tree-sha1 = "3e076ca96e34a47e98a46657b2bec2655a366d80" +uuid = "88fa7841-ef32-4516-bb70-c6ec135699d9" +version = "0.1.0" + +[[deps.HDF5]] +deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] +git-tree-sha1 = "26407bd1c60129062cec9da63dc7d08251544d53" +uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" +version = "0.17.1" +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.HypergeometricFunctions]] +deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.23" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.ImageBase]] +deps = ["ImageCore", "Reexport"] +git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +uuid = "c817782e-172a-44cc-b673-b171935fbb9e" +version = "0.1.7" + +[[deps.ImageCore]] +deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "fc5d1d3443a124fde6e92d0260cd9e064eba69f8" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.1" + +[[deps.ImageFiltering]] +deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "PrecompileTools", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] +git-tree-sha1 = "432ae2b430a18c58eb7eca9ef8d0f2db90bc749c" +uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" +version = "0.7.8" + +[[deps.Insolation]] +deps = ["Artifacts", "Dates", "DelimitedFiles", "Interpolations"] +git-tree-sha1 = "36fe16ea725ed8c8eb5fd066fd8d0ef14adc80dd" +uuid = "e98cc03f-d57e-4e3c-b70c-8d51efe9e0d8" +version = "0.6.0" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ad37c091f7d7daf900963171600d7c1c5c3ede32" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2023.2.0+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Interpolations]] +deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "721ec2cf720536ad005cb38f50dbba7b02419a15" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.14.7" + +[[deps.IntervalSets]] +deps = ["Dates", "Random"] +git-tree-sha1 = "3d8866c029dd6b16e69e0d4a939c4dfcb98fac47" +uuid = "8197267c-284f-5f27-9208-e0e47529a953" +version = "0.7.8" +weakdeps = ["Statistics"] + + [deps.IntervalSets.extensions] + IntervalSetsStatisticsExt = "Statistics" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.2" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] +git-tree-sha1 = "ebec83429b5dea3857e071d927156207ebd6d617" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.4.37" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[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", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] +git-tree-sha1 = "5f1ecfddb6abde48563d08b2cc7e5116ebcd6c27" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.10" +weakdeps = ["EnzymeCore"] + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "17e462054b42dcdda73e9a9ba0c67754170c88ae" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.9.4" + +[[deps.LDLFactorizations]] +deps = ["AMD", "LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "70f582b446a1c3ad82cf87e62b878668beef9d13" +uuid = "40e66cde-538c-5869-a4ad-c39174c6795b" +version = "0.10.1" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] +git-tree-sha1 = "4ea2928a96acfcf8589e6cd1429eff2a3a82c366" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "6.3.0" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "e7c01b69bcbcb93fd4cbc3d0fea7d229541e18d2" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.26+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f689897ccbe049adb19a065c495e75f372ecd42b" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "15.0.4+0" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "88b8f66b604da079a627b6fb2860d3704a6729a1" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.14" + +[[deps.Lazy]] +deps = ["MacroTools"] +git-tree-sha1 = "1370f8202dac30758f3c345f9909b97f53d87d3f" +uuid = "50d2b5c4-7a5e-59d5-8109-a42b560f39c0" +version = "0.15.1" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.3" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "7.84.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.10.2+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.2.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[deps.LinearOperators]] +deps = ["FastClosures", "LDLFactorizations", "LinearAlgebra", "Printf", "SparseArrays", "TimerOutputs"] +git-tree-sha1 = "a58ab1d18efa0bcf9f0868c6d387e4126dad3e72" +uuid = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125" +version = "2.5.2" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "7d6dd4e9212aebaeed356de34ccf262a3cd415aa" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.26" + + [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" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "2ce8695e1e699b68702c03402672a69f54b8aca9" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2022.2.0+0" + +[[deps.MPI]] +deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] +git-tree-sha1 = "b4d8707e42b693720b54f0b3434abee6dd4d947a" +uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" +version = "0.20.16" + + [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", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "8a5b4d2220377d1ece13f49438d71ad20cf1ba83" +uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" +version = "4.1.2+0" + +[[deps.MPIPreferences]] +deps = ["Libdl", "Preferences"] +git-tree-sha1 = "781916a2ebf2841467cda03b6f1af43e23839d85" +uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" +version = "0.1.9" + +[[deps.MPItrampoline_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "6979eccb6a9edbbb62681e158443e79ecc0d056a" +uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" +version = "5.3.1+0" + +[[deps.MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "9ee1618cbf5240e6d4e0371d6f24065083f60c48" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.11" + +[[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" + +[[deps.MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test", "Unicode"] +git-tree-sha1 = "13b3d40084d04e609e0509730f05215fb2a2fba4" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "1.21.0" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+0" + +[[deps.MicrosoftMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "a7023883872e52bc29bcaac74f19adf39347d2d5" +uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" +version = "10.1.4+0" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.1.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[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 = "2022.10.11" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "6985021d02ab8c509c841bb8b2becd3145a7b490" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.3.3" + +[[deps.NCDatasets]] +deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] +git-tree-sha1 = "7fcb4378f9c648a186bcb996fa29acc929a179ed" +uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" +version = "0.13.1" + +[[deps.NLSolversBase]] +deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.8.3" + +[[deps.NLsolve]] +deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] +git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" +uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +version = "4.5.1" + +[[deps.NVTX]] +deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] +git-tree-sha1 = "8bc9ce4233be3c63f8dcd78ccaf1b63a9c0baa34" +uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" +version = "0.3.3" + +[[deps.NVTX_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ce3269ed42816bf18d500c9f63418d4b0d9f5a3b" +uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" +version = "3.1.0+2" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.0.2" + +[[deps.NetCDF]] +deps = ["DiskArrays", "Formatting", "NetCDF_jll"] +git-tree-sha1 = "328178762645783b20495d408ab317b4c2d25b1a" +uuid = "30363a11-5582-574a-97bb-aa9a979735b9" +version = "0.11.7" + +[[deps.NetCDF_jll]] +deps = ["Artifacts", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "XML2_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "10c612c81eaffdd6b7c28a45a554cdd9d2f40ff1" +uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" +version = "400.902.208+0" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "2ac17d29c523ce1cd38e27785a7d23024853a4bb" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.12.10" + +[[deps.OpenBLAS32_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "2fb9ee2dc14d555a6df2a714b86b7125178344c2" +uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2" +version = "0.3.21+0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.21+4" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.1+0" + +[[deps.OpenMPI_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "e25c1778a98e34219a00455d6e4384e017ea9762" +uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" +version = "4.1.6+0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ceeda72c9fd6bbebc4f4f598560789145a8b6c4c" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.11+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[deps.Optim]] +deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "01f85d9269b13fedc61e63cc72ee2213565f7a72" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.7.8" + +[[deps.OrderedCollections]] +git-tree-sha1 = "2e73fe17cac3c62ad1aebe70d44c963c3cfdc3e3" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.6.2" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "66b2fcd977db5329aa35cac121e5b94dd6472198" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.28" + +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + +[[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 = "716e24b21538abc91f6205fd1d8363f39b442851" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.7.2" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.9.2" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "398f91235beaac50445557c937ecb0145d171842" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.8" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "ForwardDiff", "Requires"] +git-tree-sha1 = "f739b1b3cc7b9949af3b35089931f2b58c289163" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.12" + + [deps.PreallocationTools.extensions] + PreallocationToolsReverseDiffExt = "ReverseDiff" + + [deps.PreallocationTools.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.0" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.1" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + +[[deps.ProgressBars]] +deps = ["Printf"] +git-tree-sha1 = "b437cdb0385ed38312d91d9c00c20f3798b30256" +uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" +version = "1.5.1" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9ebcd48c498668c7fa0e97a9cae873fbee7bfee1" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.9.1" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.RRTMGP]] +deps = ["Adapt", "CUDA", "ClimaComms", "DocStringExtensions", "GaussQuadrature", "Random", "StaticArrays"] +git-tree-sha1 = "52a01d4a1963925ec60c76413d8c557e153c5e5e" +uuid = "a01a1ee8-cea4-48fc-987c-fc7878d79da1" +version = "0.9.2" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "552f30e847641591ba3f39fd1bed559b9deb0ef3" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.6.1" + +[[deps.RandomNumbers]] +deps = ["Random", "Requires"] +git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.5.3" + +[[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", "Requires", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] +git-tree-sha1 = "d7087c013e8a496ff396bae843b1e16d9a30ede8" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "2.38.10" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + 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.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 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.1" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.4.0+0" + +[[deps.RootSolvers]] +deps = ["ForwardDiff"] +git-tree-sha1 = "833d9914e748ca9329b762a82ec912897975f8d8" +uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" +version = "0.4.1" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "6aacc5eefe8415f47b3e34214c1d79d2674a0ba2" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.12" + +[[deps.SCS]] +deps = ["MathOptInterface", "Requires", "SCS_GPU_jll", "SCS_MKL_jll", "SCS_jll", "SparseArrays"] +git-tree-sha1 = "ed2d560f71649c3fcaa6f98a8578df70ea634a44" +uuid = "c946c3f1-0d1f-5ce8-9dea-7daa1f7e2d13" +version = "1.3.1" + +[[deps.SCS_GPU_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenBLAS32_jll"] +git-tree-sha1 = "6a61274837cfa050bd996910d347e876bef3a6b3" +uuid = "af6e375f-46ec-5fa0-b791-491b0dfa44a4" +version = "3.2.3+1" + +[[deps.SCS_MKL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "MKL_jll"] +git-tree-sha1 = "1ca6e41193c08fb345b58a05a6cfa8e309939313" +uuid = "3f2553a9-4106-52be-b7dd-865123654657" +version = "3.2.3+1" + +[[deps.SCS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenBLAS32_jll"] +git-tree-sha1 = "e4902566d6207206c27fe6f45e8c2d28c34889df" +uuid = "f4f2fc5b-1d94-523c-97ea-2ab488bedf4b" +version = "3.2.3+0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SciMLBase]] +deps = ["ADTypes", "ArrayInterface", "ChainRulesCore", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FillArrays", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PrecompileTools", "Preferences", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables", "TruncatedStacktraces", "ZygoteRules"] +git-tree-sha1 = "151c322c309d879d114d1c0bee69c61d5933357f" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.4.3" + + [deps.SciMLBase.extensions] + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseZygoteExt = "Zygote" + + [deps.SciMLBase.weakdeps] + 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 = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"] +git-tree-sha1 = "65c2e6ced6f62ea796af251eb292a0e131a3613b" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "0.3.6" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "30449ee12237627992a99d5e30ae63e4d78cd24a" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.1" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "5165dfb9fd131cf0c6957a3a7605dede376e7b63" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.0" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.3.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.Static]] +deps = ["IfElse"] +git-tree-sha1 = "f295e0a1da4ca425659c57441bcb59abb035a4bc" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "0.8.8" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] +git-tree-sha1 = "03fec6800a986d191f64f5c0996b59ed526eda25" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.4.1" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "Random", "StaticArraysCore"] +git-tree-sha1 = "0adf069a2a490c47273727e029371b31d44b72b2" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.6.5" +weakdeps = ["Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.2" + +[[deps.Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.9.0" + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.0" + +[[deps.StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.2" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "f625d686d5a88bcd2b15cd81f18f98186fdc0c9a" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.3.0" + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + + [deps.StatsFuns.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f02eb61eb5c97b48c153861c72fbbfdddc607e06" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.4.17" + +[[deps.StringEncodings]] +deps = ["Libiconv_jll"] +git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" +uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" +version = "0.3.7" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "5.10.1+6" + +[[deps.SurfaceFluxes]] +deps = ["CLIMAParameters", "DocStringExtensions", "Logging", "RootSolvers", "Thermodynamics"] +git-tree-sha1 = "7f83013a0654d6504226d93ba0cba94d94e1b0b0" +uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" +version = "0.8.0" + +[[deps.SymbolicIndexingInterface]] +deps = ["DocStringExtensions"] +git-tree-sha1 = "f8ab052bfcbdb9b48fad2c80c873aa0d0344dfe5" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.2.2" + +[[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", "LinearAlgebra", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.11.1" + +[[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 = "50718b4fc1ce20cecf28d85215028c78b4d875c2" +uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" +version = "0.15.2" + + [deps.TaylorSeries.extensions] + TaylorSeriesIAExt = "IntervalArithmetic" + + [deps.TaylorSeries.weakdeps] + IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" + +[[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" + +[[deps.TextWrap]] +git-tree-sha1 = "9250ef9b01b66667380cf3275b3f7488d0e25faf" +uuid = "b718987f-49a8-5099-9789-dcd902bef87d" +version = "1.0.1" + +[[deps.Thermodynamics]] +deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"] +git-tree-sha1 = "2de4b5ccc71baf3578959928c295a2fa13105db7" +uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" +version = "0.11.2" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TiledIteration]] +deps = ["OffsetArrays", "StaticArrayInterface"] +git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.5.0" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "f548a9e9c490030e545f72074a41edfd0e5bcdd7" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.23" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "49cbf7c74fafaed4c529d47d48c8f7da6a19eb75" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.10.1" +weakdeps = ["Random", "Test"] + + [deps.TranscodingStreams.extensions] + TestExt = ["Test", "Random"] + +[[deps.Tricks]] +git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.8" + +[[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" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.2.1" + +[[deps.UnsafeAtomicsLLVM]] +deps = ["LLVM", "UnsafeAtomics"] +git-tree-sha1 = "323e3d0acf5e78a56dfae7bd8928c989b4f3083e" +uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" +version = "0.1.3" + +[[deps.WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "24b81b59bd35b3c42ab84fa589086e19be919916" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.11.5+0" + +[[deps.YAML]] +deps = ["Base64", "Dates", "Printf", "StringEncodings"] +git-tree-sha1 = "e6330e4b731a6af7959673621e91645eb1356884" +uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" +version = "0.4.9" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+0" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.5+0" + +[[deps.ZygoteRules]] +deps = ["ChainRulesCore", "MacroTools"] +git-tree-sha1 = "9d749cd449fb448aeca4feee9a2f4186dbb5d184" +uuid = "700de1a5-db45-46bc-99cf-38207098b444" +version = "0.2.4" + +[[deps.libaec_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eddd19a8dea6b139ea97bdc8a0e2667d4b661720" +uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" +version = "1.0.6+1" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.8.0+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" diff --git a/experiments/Project.toml b/experiments/Project.toml new file mode 100644 index 00000000..313bf911 --- /dev/null +++ b/experiments/Project.toml @@ -0,0 +1,34 @@ +[deps] +CLIMAParameters = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" +CalibrateAtmos = "4347a170-ebd6-470c-89d3-5c705c0cacc2" +ClimaAtmos = "b2c96348-7fb7-4fe0-8da9-78d88439e717" +ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" +ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +EnsembleKalmanProcesses = "aa8a2aa5-91d8-4396-bcef-d4f2ec43552d" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +NetCDF = "30363a11-5582-574a-97bb-aa9a979735b9" +TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" + +[compat] +ClimaAtmos = "0.16" + +[extras] +CUDA_Runtime_jll = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" +HDF5_jll = "0234f1f7-429e-5d53-9886-15a909be8d59" +MPIPreferences = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" + +[preferences.CUDA_Runtime_jll] +version = "local" + +[preferences.HDF5_jll] +libhdf5_hl_path = "libhdf5_hl" +libhdf5_path = "libhdf5" + +[preferences.MPIPreferences] +_format = "1.0" +abi = "OpenMPI" +binary = "system" +libmpi = "libmpi" +mpiexec = "mpiexec" diff --git a/experiments/initialize.sbatch b/experiments/initialize.sbatch new file mode 100644 index 00000000..d523c8bd --- /dev/null +++ b/experiments/initialize.sbatch @@ -0,0 +1,16 @@ +#!/bin/sh +#SBATCH --time=00:30:00 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=1 +#SBATCH --job init_calibration + +experiment_id=$1 + +echo "Initializing calibration for experiment $experiment_id" +julia --project=experiments -e 'using Pkg; Pkg.instantiate(;verbose=true)' +julia --project=experiments -e " +import CalibrateAtmos +using Distributions +using EnsembleKalmanProcesses.ParameterDistributions +CalibrateAtmos.initialize(\"$experiment_id\")" +echo "Calibration initialized." \ No newline at end of file diff --git a/experiments/model_run.sbatch b/experiments/model_run.sbatch new file mode 100644 index 00000000..09af096e --- /dev/null +++ b/experiments/model_run.sbatch @@ -0,0 +1,22 @@ +#!/bin/bash +#SBATCH --time=2:00:00 +#SBATCH --cpus-per-task=8 +#SBATCH --mem-per-cpu=8G + +# Extract command-line arguments +experiment_id=$1 +iteration=$2 + +# Find output directory +format_i=$(printf "iteration_%03d" "$iteration") +member=$(printf "member_%03d" "$SLURM_ARRAY_TASK_ID") +output=output/$experiment_id/$format_i/$member/model_log.out + +# Run the forward model +srun --output=$output julia --project=experiments -e " + using ClimaComms + ClimaComms.init(ClimaComms.context()) + import CalibrateAtmos + atmos_config = CalibrateAtmos.get_atmos_config($SLURM_ARRAY_TASK_ID, $iteration, \"$experiment_id\") + CalibrateAtmos.run_forward_model(atmos_config) +" diff --git a/experiments/pipeline.sh b/experiments/pipeline.sh new file mode 100755 index 00000000..67d52ed0 --- /dev/null +++ b/experiments/pipeline.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# Configure for cluster +module load julia/1.9.3 cuda/12.2 ucx/1.14.1_cuda-12.2 openmpi/4.1.5_cuda-12.2 hdf5/1.12.2-ompi415 +export OMPI_MCA_opal_warn_on_missing_libcuda=0 +export JULIA_NUM_PRECOMPILE_TASKS=8 +export JULIA_CPU_TARGET='broadwell;skylake' + +# Parse command line +experiment_id=${1?Error: no experiment ID given} +tasks_per_model_run=${2?Error: no tasks per model run given} + +echo "Running experiment $experiment_id with $tasks_per_model_run tasks per model run." +echo 'Initializing ensemble for calibration.' +init_id=$(sbatch --parsable \ + --output=init_$experiment_id.out \ + experiments/initialize.sbatch $experiment_id) + +# Get ensemble size and the number of iterations from configuration file +ensemble_size=$(grep "ensemble_size:" experiments/$experiment_id/ekp_config.yml | awk '{print $2}') +n_iterations=$(grep "n_iterations:" experiments/$experiment_id/ekp_config.yml | awk '{print $2}') + +# Loop over iterations +dependency="afterok:$init_id" +for i in $(seq 0 $((n_iterations - 1))) +do + echo "Scheduling iteration $i" + format_i=$(printf "iteration_%03d" "$i") + + ensemble_array_id=$( + sbatch --dependency=$dependency --kill-on-invalid-dep=yes \ + --parsable \ + --output=/dev/null \ + --job=model-$i \ + --ntasks=$tasks_per_model_run \ + --array=1-$ensemble_size \ + experiments/model_run.sbatch $experiment_id $i) + + dependency=afterany:$ensemble_array_id + echo "Iteration $i job id: $ensemble_array_id" + + update_id=$( + sbatch --dependency=$dependency --kill-on-invalid-dep=yes \ + --job=update-$i \ + --output=output/$experiment_id/$format_i/update_log.out \ + --parsable \ + experiments/update.sbatch $experiment_id $i) + + dependency=afterany:$update_id + echo "Update $i job id: $update_id" +done diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/atmos_config.yml b/experiments/sphere_held_suarez_rhoe_equilmoist/atmos_config.yml new file mode 100644 index 00000000..1d83dd82 --- /dev/null +++ b/experiments/sphere_held_suarez_rhoe_equilmoist/atmos_config.yml @@ -0,0 +1,16 @@ +dt: 500secs +t_end: 560days +ode_algo: ARS343 +dt_save_to_disk: 50days +moist: equil +forcing: held_suarez +precip_model: 0M +job_id: sphere_held_suarez_rhoe_equilmoist +output_dir: output/sphere_held_suarez_rhoe_equilmoist +restart_file: experiments/sphere_held_suarez_rhoe_equilmoist/day200.0.hdf5 +output_default_diagnostics: false +diagnostics: + - reduction_time: average + short_name: ta + period: 60days + writer: nc diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/day200.0.hdf5 b/experiments/sphere_held_suarez_rhoe_equilmoist/day200.0.hdf5 new file mode 100644 index 00000000..89794eff Binary files /dev/null and b/experiments/sphere_held_suarez_rhoe_equilmoist/day200.0.hdf5 differ diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/ekp_config.yml b/experiments/sphere_held_suarez_rhoe_equilmoist/ekp_config.yml new file mode 100644 index 00000000..9142b399 --- /dev/null +++ b/experiments/sphere_held_suarez_rhoe_equilmoist/ekp_config.yml @@ -0,0 +1,7 @@ +output_dir: output/sphere_held_suarez_rhoe_equilmoist +prior_path: experiments/sphere_held_suarez_rhoe_equilmoist/prior.toml +parameter_names: ["equator_pole_temperature_gradient_wet"] +ensemble_size: 10 +n_iterations: 3 +truth_data: experiments/sphere_held_suarez_rhoe_equilmoist/obs_mean.jld2 +truth_noise: experiments/sphere_held_suarez_rhoe_equilmoist/obs_noise_cov.jld2 diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/generate_observations.sbatch b/experiments/sphere_held_suarez_rhoe_equilmoist/generate_observations.sbatch new file mode 100644 index 00000000..ad5aa316 --- /dev/null +++ b/experiments/sphere_held_suarez_rhoe_equilmoist/generate_observations.sbatch @@ -0,0 +1,40 @@ +#!/bin/bash +#SBATCH --time=24:00:00 +#SBATCH --ntasks=32 +#SBATCH --cpus-per-task=8 +#SBATCH --output="experiments/sphere_held_suarez_rhoe_equilmoist/truth_simulation/model_log.out" + +module load julia/1.9.3 cuda/12.2 ucx/1.14.1_cuda-12.2 openmpi/4.1.5_cuda-12.2 hdf5/1.12.2-ompi415 +export OMPI_MCA_opal_warn_on_missing_libcuda=0 +export JULIA_NUM_PRECOMPILE_TASKS=8 +export JULIA_CPU_TARGET='broadwell;skylake' + +echo "Generating truth observations." + +srun --open-mode=append julia --project=experiments -e ' +using ClimaComms +ClimaComms.init(ClimaComms.context()) +import ClimaAtmos as CA +import YAML +using NetCDF +import JLD2 + +experiment_dir = joinpath("experiments", "sphere_held_suarez_rhoe_equilmoist") +output_dir = joinpath(experiment_dir, "truth_simulation") + +config_dict = YAML.load_file(joinpath(experiment_dir, "atmos_config.yml")) +config_dict["t_end"] = "3000days" +config_dict["output_dir"] = output_dir + +config = CA.AtmosConfig(config_dict) +integrator = CA.get_integrator(config) +CA.solve_atmos!(integrator) + +ta = ncread(joinpath(output_dir, "ta_60.0d_average.nc"), "ta") +include(joinpath(experiment_dir, "observation_map.jl")) +(; observation, variance) = process_member_data(ta; output_variance = true) +@show observation +@show variance +JLD2.save_object(joinpath(experiment_dir, "obs_mean.jld2"), observation) +JLD2.save_object(joinpath(experiment_dir, "obs_noise_cov.jld2"), variance) +' diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/obs_mean.jld2 b/experiments/sphere_held_suarez_rhoe_equilmoist/obs_mean.jld2 new file mode 100644 index 00000000..21b5044a Binary files /dev/null and b/experiments/sphere_held_suarez_rhoe_equilmoist/obs_mean.jld2 differ diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/obs_noise_cov.jld2 b/experiments/sphere_held_suarez_rhoe_equilmoist/obs_noise_cov.jld2 new file mode 100644 index 00000000..d6ac4ee6 Binary files /dev/null and b/experiments/sphere_held_suarez_rhoe_equilmoist/obs_noise_cov.jld2 differ diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/observation_map.jl b/experiments/sphere_held_suarez_rhoe_equilmoist/observation_map.jl new file mode 100644 index 00000000..0ec4dd41 --- /dev/null +++ b/experiments/sphere_held_suarez_rhoe_equilmoist/observation_map.jl @@ -0,0 +1,74 @@ +using NetCDF +using Statistics +import YAML +import EnsembleKalmanProcesses: TOMLInterface +import JLD2 +import CalibrateAtmos + +export observation_map + +function longitudinal_avg(arr) + dims = 2 + for (idx, dim_size) in enumerate(size(arr)) + if dim_size == 180 + dims = idx + end + end + return dropdims(mean(arr; dims); dims) +end + +function latitudinal_avg(arr) + dims = 3 + for (idx, dim_size) in enumerate(size(arr)) + if dim_size == 80 + dims = idx + end + end + return dropdims(mean(arr; dims); dims) +end + +function height_avg(arr) + dims = 4 + return dropdims(mean(arr; dims); dims) +end + +function time_avg(arr) + dims = 1 + return dropdims(mean(arr; dims); dims) +end + +function observation_map(iteration) + experiment_id = "sphere_held_suarez_rhoe_equilmoist" + config = + YAML.load_file(joinpath("experiments", experiment_id, "ekp_config.yml")) + output_dir = config["output_dir"] + ensemble_size = config["ensemble_size"] + model_output = "ta_60.0d_average.nc" + + dims = 1 + G_ensemble = Array{Float64}(undef, dims..., ensemble_size) + for m in 1:ensemble_size + member_path = + TOMLInterface.path_to_ensemble_member(output_dir, iteration, m) + ta = ncread(joinpath(member_path, model_output), "ta") + G_ensemble[:, m] = process_member_data(ta) + end + return G_ensemble +end + +function process_member_data(ta; output_variance = false) + # Cut off first 120 days to get equilibrium, take second level slice + level_slice = 2 + ta_second_height = ta[3:size(ta)[1], :, :, level_slice] + # Average over long and latitude + area_avg_ta_second_height = + longitudinal_avg(latitudinal_avg(ta_second_height)) + observation = Float64[area_avg_ta_second_height[3]] + if !(output_variance) + return observation + else + variance = Matrix{Float64}(undef, 1, 1) + variance[1] = var(area_avg_ta_second_height) + return (; observation, variance) + end +end diff --git a/experiments/sphere_held_suarez_rhoe_equilmoist/prior.toml b/experiments/sphere_held_suarez_rhoe_equilmoist/prior.toml new file mode 100644 index 00000000..4d70f130 --- /dev/null +++ b/experiments/sphere_held_suarez_rhoe_equilmoist/prior.toml @@ -0,0 +1,6 @@ +["equator_pole_temperature_gradient_wet"] +prior = "Parameterized(Normal(4.779568,0.31223328))" +constraint = "[bounded_below(0)]" +# EKP.ParameterDistributions.constrained_gaussian("name", 125, 40, 0, Inf) +type = "float" +alias = "ΔT_y_wet" diff --git a/experiments/update.sbatch b/experiments/update.sbatch new file mode 100644 index 00000000..c0b5da28 --- /dev/null +++ b/experiments/update.sbatch @@ -0,0 +1,24 @@ +#!/bin/sh +#SBATCH --time=00:30:00 + +experiment_id=$1 +i=$2 + +echo "Iteration $i" + +julia --project=experiments -e ' + import YAML + import CalibrateAtmos + using Distributions + using EnsembleKalmanProcesses.ParameterDistributions + + experiment_id = "'${experiment_id}'" + i = '$i' + include("experiments/$experiment_id/observation_map.jl") + G_ensemble = observation_map(i) + config = YAML.load_file(joinpath("experiments", experiment_id, "ekp_config.yml")) + output_dir = config["output_dir"] + iter_path = CalibrateAtmos.path_to_iteration(output_dir, i) + JLD2.save_object(joinpath(iter_path, "observation_map.jld2"), G_ensemble) + CalibrateAtmos.update_ensemble(experiment_id, i) +' diff --git a/plot/Project.toml b/plot/Project.toml index 50f1320c..64153284 100644 --- a/plot/Project.toml +++ b/plot/Project.toml @@ -2,3 +2,9 @@ CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +EnsembleKalmanProcesses = "aa8a2aa5-91d8-4396-bcef-d4f2ec43552d" +JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +NetCDF = "30363a11-5582-574a-97bb-aa9a979735b9" +TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +YAML = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" diff --git a/plot/convergence_plots.jl b/plot/convergence_plots.jl new file mode 100644 index 00000000..fd434fb4 --- /dev/null +++ b/plot/convergence_plots.jl @@ -0,0 +1,71 @@ +import EnsembleKalmanProcesses as EKP +using EnsembleKalmanProcesses.ParameterDistributions +using EnsembleKalmanProcesses.TOMLInterface +using Distributions +import JLD2 +import Statistics: mean +import YAML +import TOML +import CairoMakie: Makie + +function convergence_plot(eki, prior, theta_star, output_dir = "output") + u_vec = EKP.get_u(eki) + + error_vec = Float64[] + spread_vec = Float64[] + for ensemble in u_vec + ensemble_error = 0 + ensemble_spread = 0 + ensemble_mean = mean(ensemble) + for i in ensemble + ensemble_error += abs(i - theta_star)^2 + ensemble_spread += abs(i - ensemble_mean)^2 + + end + ensemble_error /= length(ensemble) + ensemble_spread /= length(ensemble) + + push!(error_vec, ensemble_error) + push!(spread_vec, ensemble_spread) + end + + phi_vec = transform_unconstrained_to_constrained(prior, u_vec) + u_series = [getindex.(u_vec, i) for i in 1:10] + phi_series = [getindex.(phi_vec, i) for i in 1:10] + + f = Makie.Figure(title = "Convergence Plot", resolution = (800, 800)) + + ax = Makie.Axis( + f[1, 1], + xlabel = "Iteration", + ylabel = "Error", + xticks = 0:50, + ) + Makie.lines!(ax, 0.0:(length(error_vec) - 1), error_vec) + + ax = Makie.Axis( + f[1, 2], + xlabel = "Iteration", + ylabel = "Spread", + xticks = 0:50, + ) + Makie.lines!(ax, 0.0:(length(spread_vec) - 1), spread_vec) + + ax = Makie.Axis( + f[2, 1], + xlabel = "Iteration", + ylabel = "Unconstrained Parameters", + xticks = 0:50, + ) + Makie.lines!.(ax, tuple(0.0:(length(u_series[1]) - 1)), u_series) + + ax = Makie.Axis( + f[2, 2], + xlabel = "Iteration", + ylabel = "Constrained Parameters", + xticks = 0:50, + ) + Makie.lines!.(ax, tuple(0.0:(length(phi_series[1]) - 1)), phi_series) + Makie.hlines!(ax, [65.0], color = :red, linestyle = :dash) + Makie.save(joinpath(output_dir, "convergence.png"), f) +end diff --git a/plot/latitude_contour_plots.jl b/plot/latitude_contour_plots.jl deleted file mode 100644 index 4ccd99a4..00000000 --- a/plot/latitude_contour_plots.jl +++ /dev/null @@ -1,125 +0,0 @@ -import CairoMakie: Makie -import ClimaComms -import ClimaCore: Fields, Geometry, Spaces, InputOutput -import Statistics: mean - -# Adapted from contours_and_plots.jl in ClimaAtmos - -function time_from_filename(file) - arr = split(basename(file), ".") - day = parse(Float64, replace(arr[1], "day" => "")) - sec = parse(Float64, arr[2]) - return day * (60 * 60 * 24) + sec -end - -function read_hdf5_file(file_path) - reader = InputOutput.HDF5Reader( - file_path, - ClimaComms.SingletonCommsContext(ClimaComms.CPUSingleThreaded()), - ) - diagnostics = InputOutput.read_field(reader, "diagnostics") - close(reader) - return diagnostics -end - -horizontal_space(diagnostics) = - Spaces.horizontal_space(axes(diagnostics.temperature)) - -is_on_sphere(diagnostics) = - eltype(Fields.coordinate_field(horizontal_space(diagnostics))) <: - Geometry.LatLongPoint - -get_column_1(diagnostics) = - isnothing(diagnostics) ? (nothing, nothing) : - column_view_diagnostics(diagnostics, ((1, 1), 1)) - -function column_view_diagnostics(diagnostics, column) - ((i, j), h) = column - is_extruded_field(object) = - axes(object) isa Spaces.ExtrudedFiniteDifferenceSpace - column_view(field) = Fields.column(field, i, j, h) - column_zs(object) = - is_extruded_field(object) ? - vec(parent(Fields.coordinate_field(column_view(object)).z)) / 1000 : - nothing - column_values(object) = - is_extruded_field(object) ? vec(parent(column_view(object))) : nothing - objects = Fields._values(diagnostics) - - column_zs_and_values = map(column_zs, objects), map(column_values, objects) - - # Assume that all variables have the same horizontal coordinates. - coords = Fields.coordinate_field(column_view(diagnostics.temperature)) - - coord_strings = map(filter(!=(:z), propertynames(coords))) do symbol - # Add 0 to every horizontal coordinate value so that -0.0 gets - # printed without the unnecessary negative sign. - value = round(mean(getproperty(coords, symbol)); sigdigits = 6) + 0 - return "$symbol = $value" - end - col_string = "column data from $(join(coord_strings, ", "))" - - return column_zs_and_values, col_string -end - -column_at_coord_getter(latitude, longitude) = - diagnostics -> begin - isnothing(diagnostics) && return (nothing, nothing) - column = if is_on_sphere(diagnostics) - horz_space = horizontal_space(diagnostics) - horz_coords = Fields.coordinate_field(horz_space) - FT = eltype(eltype(horz_coords)) - target_column_coord = - Geometry.LatLongPoint(FT(latitude), FT(longitude)) - distance_to_target(((i, j), h)) = - Geometry.great_circle_distance( - Spaces.column(horz_coords, i, j, h)[], - target_column_coord, - horz_space.global_geometry, - ) - argmin(distance_to_target, Spaces.all_nodes(horz_space)) - else - ((1, 1), 1) # If the data is not on a sphere, extract column 1. - end - return column_view_diagnostics(diagnostics, column) - end - -""" - latitude_contour_plot(file_path, variable; longitude = 0, out_path = nothing) - -Saves a contour plot of latitude versus height for the given variable at the -given longitude. Default longitude = 0 -""" -function latitude_contour_plot( - file_path, - variable; - longitude = 0, - out_path = nothing, -) - diagnostics = read_hdf5_file(file_path) - latitudes = -90:5:90 - cols = map(latitudes) do lat - column_at_coord_getter(lat, longitude)(diagnostics)[1] - end - variable_cols = map(cols) do (zs, values) - getproperty(values, variable) - end - zs = getproperty(cols[1][1], variable) - values = hcat(variable_cols...) - - figure = Makie.Figure() - axis = Makie.Axis( - figure[1, 1], - xlabel = "Latitude", - ylabel = "Height (km)", - title = "$variable at $longitude long", - ) - Makie.contourf!(axis, latitudes, zs, values') - Makie.contourf!(axis, latitudes, zs, values') - if isnothing(out_path) - out_path = - chop(file_path, head = 0, tail = 5) * "_$(variable)_$longitude.png" - end - Makie.save(out_path, figure) - return nothing -end diff --git a/src/CalibrateAtmos.jl b/src/CalibrateAtmos.jl index ee8f7256..3773bbd7 100644 --- a/src/CalibrateAtmos.jl +++ b/src/CalibrateAtmos.jl @@ -1,4 +1,6 @@ module CalibrateAtmos +include("ekp_interface.jl") +include("atmos_interface.jl") end # module CalibrateAtmos diff --git a/src/atmos_interface.jl b/src/atmos_interface.jl new file mode 100644 index 00000000..cc843d34 --- /dev/null +++ b/src/atmos_interface.jl @@ -0,0 +1,56 @@ +import EnsembleKalmanProcesses as EKP +import ClimaAtmos as CA +import YAML + +function get_atmos_config(member, iteration, experiment_id::AbstractString) + config_dict = YAML.load_file("experiments/$experiment_id/atmos_config.yml") + return get_atmos_config(member, iteration, config_dict) +end + +""" + get_atmos_config(member, iteration, experiment_id::AbstractString) + get_atmos_config(member, iteration, config_dict::AbstractDict) + +Returns an AtmosConfig object for the given member and iteration. +If given an experiment id string, it will load the config from the corresponding YAML file. +Turns off default diagnostics and sets the TOML parameter file to the member's path. +This assumes that the config dictionary has `output_dir` and `restart_file` keys. +""" +function get_atmos_config(member, iteration, config_dict::AbstractDict) + # Specify member path for output_dir + # Set TOML to use EKP parameter(s) + output_dir = config_dict["output_dir"] + member_path = + EKP.TOMLInterface.path_to_ensemble_member(output_dir, iteration, member) + config_dict["output_dir"] = member_path + parameter_path = joinpath(member_path, "parameters.toml") + if haskey(config_dict, "toml") + push!(config_dict["toml"], parameter_path) + else + config_dict["toml"] = [parameter_path] + end + + # Turn off default diagnostics + config_dict["output_default_diagnostics"] = false + + # Set restart file for initial equilibrium state + ENV["RESTART_FILE"] = config_dict["restart_file"] + return CA.AtmosConfig(config_dict) +end + +""" + run_forward_model(atmos_config::CA.AtmosConfig) + +Runs the atmosphere model with the given an AtmosConfig object. +Currently only has basic error handling. +""" +function run_forward_model(atmos_config::CA.AtmosConfig) + integrator = CA.get_integrator(atmos_config) + sol_res = CA.solve_atmos!(integrator) + if sol_res.ret_code == :simulation_crashed + # TODO: Handle error properly - overwrite data + error( + "The ClimaAtmos simulation has crashed. See the stack trace for details.", + ) + end +end diff --git a/src/ekp_interface.jl b/src/ekp_interface.jl new file mode 100644 index 00000000..51d477e5 --- /dev/null +++ b/src/ekp_interface.jl @@ -0,0 +1,119 @@ +import TOML, YAML +import JLD2 +import Random +using Distributions +import EnsembleKalmanProcesses as EKP +using EnsembleKalmanProcesses.ParameterDistributions +using EnsembleKalmanProcesses.TOMLInterface + +""" + path_to_iteration(output_dir, iteration) +Returns the path to the iteration folder within `output_dir` for the given iteration number. +""" +path_to_iteration(output_dir, iteration) = + joinpath(output_dir, join(["iteration", lpad(iteration, 3, "0")], "_")) + +""" + initialize( + experiment_id; + config = YAML.load_file("experiments/\$experiment_id/ekp_config.yml"), + Γ = JLD2.load(config["truth_noise"]), + y = JLD2.load(config["truth_data"]), + rng_seed = 1234, + ) +Initializes the EKP object and the model ensemble. + +Takes in + - `experiment_id`: the name of the experiment, which corresponds to the name of the subfolder in `experiments/` + - `config`: a dictionary of configuration values +""" +function initialize( + experiment_id; + config = YAML.load_file("experiments/$experiment_id/ekp_config.yml"), + Γ = JLD2.load_object(config["truth_noise"]), + y = JLD2.load_object(config["truth_data"]), + rng_seed = 1234, +) + Random.seed!(rng_seed) + rng_ekp = Random.MersenneTwister(rng_seed) + + output_dir = config["output_dir"] + prior_path = config["prior_path"] + param_names = config["parameter_names"] + ensemble_size = config["ensemble_size"] + # Save in EKI object in iteration_000 folder + eki_path = joinpath(output_dir, "iteration_000", "eki_file.jld2") + + param_dict = TOML.parsefile(prior_path) + prior_vec = [get_parameter_distribution(param_dict, n) for n in param_names] + prior = combine_distributions(prior_vec) + + initial_ensemble = + EKP.construct_initial_ensemble(rng_ekp, prior, ensemble_size) + eki = EKP.EnsembleKalmanProcess( + initial_ensemble, + y, + Γ, + EKP.Inversion(); + rng = rng_ekp, + ) + + save_parameter_ensemble( + EKP.get_u_final(eki), # constraints applied when saving + prior, + param_dict, + output_dir, + "parameters.toml", + 0, # Initial iteration = 0 + ) + JLD2.save_object(eki_path, eki) + return eki +end + +""" + update_ensemble( + experiment_id, + iteration; + config = YAML.load_file("experiments/\$experiment_id/ekp_config.yml"), + ) +Updates the EKI object and saves parameters for the next iteration. +Assumes that the observation map has been run and saved in the current iteration folder. +""" +function update_ensemble( + experiment_id, + iteration; + config = YAML.load_file("experiments/$experiment_id/ekp_config.yml"), +) + output_dir = config["output_dir"] + names = config["parameter_names"] + # Load EKI object from iteration folder + iter_path = path_to_iteration(output_dir, iteration) + eki_path = joinpath(iter_path, "eki_file.jld2") + eki = JLD2.load_object(eki_path) + + # Load data from the ensemble + G_ens = JLD2.load_object(joinpath(iter_path, "observation_map.jld2")) + + # Update + EKP.update_ensemble!(eki, G_ens) + iteration += 1 + + # Update and save parameters for next iteration + prior_path = config["prior_path"] + param_dict = TOML.parsefile(prior_path) + prior_vec = [get_parameter_distribution(param_dict, n) for n in names] + prior = combine_distributions(prior_vec) + save_parameter_ensemble( + EKP.get_u_final(eki), # constraints applied when saving + prior, + param_dict, + output_dir, + "parameters.toml", + iteration, + ) + + # Save EKI object for next iteration + iter_path = path_to_iteration(output_dir, iteration) + eki_path = joinpath(iter_path, "eki_file.jld2") + JLD2.save_object(eki_path, eki) +end diff --git a/test/Project.toml b/test/Project.toml new file mode 100644 index 00000000..84a24c9e --- /dev/null +++ b/test/Project.toml @@ -0,0 +1,9 @@ +[deps] +CLIMAParameters = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" +CalibrateAtmos = "4347a170-ebd6-470c-89d3-5c705c0cacc2" +ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884" +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +EnsembleKalmanProcesses = "aa8a2aa5-91d8-4396-bcef-d4f2ec43552d" +LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/test/runtests.jl b/test/runtests.jl index 8b137891..ece451f8 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1 +1,4 @@ +using Test +include("test_init.jl") +include("test_atmos_config.jl") diff --git a/test/test_atmos_config.jl b/test/test_atmos_config.jl new file mode 100644 index 00000000..8816f3ba --- /dev/null +++ b/test/test_atmos_config.jl @@ -0,0 +1,33 @@ +import CalibrateAtmos +using Test + +# Tests for ensuring CalibrateAtmos sets AtmosConfig correctly. + +member_path = joinpath("test_output", "iteration_001", "member_001") +file_path = joinpath(member_path, "parameters.toml") +mkpath(dirname(file_path)) +touch(file_path) + +config_dict = Dict{Any, Any}( + "restart_file" => joinpath( + "experiments", + "sphere_held_suarez_rhoe_equilmoist", + "day200.0.hdf5", + ), + "dt_save_to_disk" => "100days", + "moist" => "equil", + "forcing" => "held_suarez", + "output_dir" => "test_output", +) + +atmos_config = CalibrateAtmos.get_atmos_config(1, 1, config_dict) +(; parsed_args) = atmos_config + +@testset "Atmos Configuration" begin + @test parsed_args["moist"] == "equil" + @test parsed_args["toml"] == [file_path] + @test parsed_args["output_dir"] == member_path + @test ENV["RESTART_FILE"] == config_dict["restart_file"] +end + +rm(file_path) diff --git a/test/test_case_inputs/prior.toml b/test/test_case_inputs/prior.toml new file mode 100644 index 00000000..41195374 --- /dev/null +++ b/test/test_case_inputs/prior.toml @@ -0,0 +1,12 @@ +["one"] +prior = "Parameterized(Normal(0,1))" +constraint = "[bounded(0,5)]" +type = "float" +alias = "one" + + +["two"] +prior = "Parameterized(Normal(0,1))" +constraint = "[bounded(4,6)]" +type = "float" +alias = "two" diff --git a/test/test_init.jl b/test/test_init.jl new file mode 100644 index 00000000..c9a12330 --- /dev/null +++ b/test/test_init.jl @@ -0,0 +1,32 @@ +using Distributions +using EnsembleKalmanProcesses.ParameterDistributions +import CalibrateAtmos +import CLIMAParameters as CP +import LinearAlgebra: I +using Test + +FT = Float64 +output_dir = "test_init" +prior_path = joinpath("test_case_inputs", "prior.toml") +param_names = ["one", "two"] +config = Dict( + "output_dir" => output_dir, + "prior_path" => prior_path, + "parameter_names" => param_names, + "ensemble_size" => 10, +) +Γ = 0.1 * I +y = zeros(Float64, 1) + +CalibrateAtmos.initialize("test"; config, Γ, y) + +override_file = + joinpath(output_dir, "iteration_000", "member_001", "parameters.toml") +td = CP.create_toml_dict(FT; override_file) +params = (; CP.get_parameter_values(td, param_names)...) + +@testset "Initialized parameter values" begin + # This checks for random seed as well + @test params.one == 3.520967031258908 + @test params.two == 4.726862935348823 +end