From 24e6152bbcb9846c84be88e8c0e5d0673490a59e Mon Sep 17 00:00:00 2001 From: Julia Sloan Date: Fri, 26 May 2023 17:48:19 -0700 Subject: [PATCH] rm exp dirs --- docs/make.jl | 4 +- .../AMIP/moist_mpi_aquaplanet/Manifest.toml | 1618 ------------- .../AMIP/moist_mpi_aquaplanet/Project.toml | 22 - .../AMIP/moist_mpi_aquaplanet/README.md | 147 -- .../moist_mpi_aquaplanet/atmos/atmos_init.jl | 87 - .../atmos/coupled_atmos.jl | 123 - .../checkout_ClimaAtmos.sh | 3 - .../moist_mpi_aquaplanet/coupler_driver.jl | 88 - .../coupler_utils/conservation_checker.jl | 55 - .../coupler_utils/flux_calculator.jl | 111 - .../coupler_utils/regridder.jl | 4 - .../AMIP/moist_mpi_aquaplanet/mpi/mpi_init.jl | 33 - .../mpi/mpi_postprocess.jl | 37 - .../AMIP/moist_mpi_aquaplanet/sbatch_job.sh | 21 - .../moist_mpi_aquaplanet/slab/slab_init.jl | 83 - .../AMIP/moist_mpi_earth/Artifacts.toml | 11 - .../AMIP/moist_mpi_earth/Manifest.toml | 2155 ----------------- experiments/AMIP/moist_mpi_earth/Project.toml | 95 - experiments/AMIP/moist_mpi_earth/README.md | 159 -- .../AMIP/moist_mpi_earth/atmos/atmos_init.jl | 30 - .../moist_mpi_earth/bucket/bucket_init.jl | 249 -- .../moist_mpi_earth/bucket/bucket_utils.jl | 143 -- .../AMIP/moist_mpi_earth/cli_options.jl | 551 ----- .../AMIP/moist_mpi_earth/coupler_driver.jl | 527 ---- .../moist_mpi_earth/coupler_driver_modular.jl | 527 ---- .../coupler_utils/amip_visualizer.jl | 62 - .../coupler_utils/bcfile_reader.jl | 203 -- .../coupler_utils/calendar_timer.jl | 61 - .../coupler_utils/conservation_checker.jl | 172 -- .../coupler_utils/diagnostics_gatherer.jl | 60 - .../coupler_utils/flux_calculator.jl | 63 - .../coupler_utils/general_helper.jl | 28 - .../moist_mpi_earth/coupler_utils/masker.jl | 114 - .../coupler_utils/ncep_visualizer.jl | 138 -- .../coupler_utils/offline_postprocessor.jl | 112 - .../moist_mpi_earth/coupler_utils/plotter.jl | 52 - .../coupler_utils/regridder.jl | 232 -- .../coupler_utils/unit_tester.jl | 178 -- .../coupler_utils/variable_definer.jl | 61 - .../coupler_utils/viz_explorer.jl | 75 - .../AMIP/moist_mpi_earth/mpi/mpi_init.jl | 20 - .../moist_mpi_earth/mpi/mpi_postprocess.jl | 37 - experiments/AMIP/moist_mpi_earth/push_pull.jl | 181 -- .../AMIP/moist_mpi_earth/sbatch_job.sh | 31 - .../AMIP/moist_mpi_earth/slab/slab_init.jl | 146 -- .../AMIP/moist_mpi_earth/slab/slab_utils.jl | 19 - .../moist_mpi_earth/slab_ice/slab_init.jl | 81 - .../moist_mpi_earth/slab_ocean/slab_init.jl | 75 - .../AMIP/moist_mpi_earth/user_diagnostics.jl | 86 - .../user_plots/amip_visualizer.jl | 76 - .../user_plots/ncep_visualizer.jl | 146 -- .../moist_mpi_earth/user_plots/plot_helper.jl | 95 - 52 files changed, 2 insertions(+), 9485 deletions(-) delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/Manifest.toml delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/Project.toml delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/README.md delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/atmos/atmos_init.jl delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/atmos/coupled_atmos.jl delete mode 100755 experiments/AMIP/moist_mpi_aquaplanet/checkout_ClimaAtmos.sh delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/coupler_driver.jl delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/conservation_checker.jl delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/flux_calculator.jl delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/regridder.jl delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_init.jl delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_postprocess.jl delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/sbatch_job.sh delete mode 100644 experiments/AMIP/moist_mpi_aquaplanet/slab/slab_init.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/Artifacts.toml delete mode 100644 experiments/AMIP/moist_mpi_earth/Manifest.toml delete mode 100644 experiments/AMIP/moist_mpi_earth/Project.toml delete mode 100644 experiments/AMIP/moist_mpi_earth/README.md delete mode 100644 experiments/AMIP/moist_mpi_earth/atmos/atmos_init.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/bucket/bucket_init.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/bucket/bucket_utils.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/cli_options.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_driver.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_driver_modular.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/amip_visualizer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/bcfile_reader.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/calendar_timer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/conservation_checker.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/diagnostics_gatherer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/flux_calculator.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/general_helper.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/masker.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/ncep_visualizer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/offline_postprocessor.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/plotter.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/regridder.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/unit_tester.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/variable_definer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/coupler_utils/viz_explorer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/mpi/mpi_init.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/mpi/mpi_postprocess.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/push_pull.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/sbatch_job.sh delete mode 100644 experiments/AMIP/moist_mpi_earth/slab/slab_init.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/slab/slab_utils.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/slab_ice/slab_init.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/slab_ocean/slab_init.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/user_diagnostics.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/user_plots/amip_visualizer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/user_plots/ncep_visualizer.jl delete mode 100644 experiments/AMIP/moist_mpi_earth/user_plots/plot_helper.jl diff --git a/docs/make.jl b/docs/make.jl index aac339b104..d6de55f844 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -10,7 +10,7 @@ const OUTPUT_DIR = joinpath(@__DIR__, "src/generated") # sea breeze tutorial TUTORIAL_DIR_SB = joinpath(EXPERIMENTS_DIR, "ClimaCore/sea_breeze/") -TUTORIAL_DIR_AMIP = joinpath(EXPERIMENTS_DIR, "AMIP/moist_mpi_earth/") +TUTORIAL_DIR_AMIP = joinpath(EXPERIMENTS_DIR, "AMIP/modular/") # Pkg.activate(TUTORIAL_DIR) # Pkg.instantiate() @@ -19,7 +19,7 @@ TUTORIAL_DIR_AMIP = joinpath(EXPERIMENTS_DIR, "AMIP/moist_mpi_earth/") # execute Literate on all julia files tutorial_files_sb = filter(x -> last(x, 3) == ".jl", readdir(TUTORIAL_DIR_SB)) -tutorial_files_amip = filter(x -> last(x, 9) == "driver.jl", readdir(TUTORIAL_DIR_AMIP)) +tutorial_files_amip = filter(x -> last(x, 17) == "driver_modular.jl", readdir(TUTORIAL_DIR_AMIP)) # Literate generates markdown files and stores them in docs/src/generated/sea_breeze map( diff --git a/experiments/AMIP/moist_mpi_aquaplanet/Manifest.toml b/experiments/AMIP/moist_mpi_aquaplanet/Manifest.toml deleted file mode 100644 index 4b12df475e..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/Manifest.toml +++ /dev/null @@ -1,1618 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.7.2" -manifest_format = "2.0" - -[[deps.AbstractFFTs]] -deps = ["ChainRulesCore", "LinearAlgebra"] -git-tree-sha1 = "6f1d9bc1c08f9f4a8fa92e3ea3cb50153a1b40d4" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.1.0" - -[[deps.AbstractTrees]] -git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.3.4" - -[[deps.Adapt]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "af92965fb30777147966f58acb05da51c5616b5f" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "3.3.3" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" - -[[deps.ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.2.0" - -[[deps.ArrayInterface]] -deps = ["Compat", "IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"] -git-tree-sha1 = "1ee88c4c76caa995a885dc2f22a5d548dfbbc0ba" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "3.2.2" - -[[deps.ArrayLayouts]] -deps = ["FillArrays", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c23473c60476e62579c077534b9643ec400f792b" -uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "0.8.6" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[deps.BFloat16s]] -deps = ["LinearAlgebra", "Printf", "Random", "Test"] -git-tree-sha1 = "a598ecb0d717092b5539dbbe890c98bac842b072" -uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" -version = "0.2.0" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[deps.BitTwiddlingConvenienceFunctions]] -deps = ["Static"] -git-tree-sha1 = "28bbdbf0354959db89358d1d79d421ff31ef0b5e" -uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" -version = "0.1.3" - -[[deps.BlockArrays]] -deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"] -git-tree-sha1 = "18f1eda0090a516927c5bede54c1ea36b5bf13d5" -uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" -version = "0.16.16" - -[[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.CLIMAParameters]] -deps = ["Test"] -git-tree-sha1 = "17ece0add9940728f8120a1561fc3361be6a6f26" -uuid = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" -version = "0.4.3" - -[[deps.CPUSummary]] -deps = ["CpuId", "IfElse", "Static"] -git-tree-sha1 = "0eaf4aedad5ccc3e39481db55d72973f856dc564" -uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.1.22" - -[[deps.CUDA]] -deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CompilerSupportLibraries_jll", "ExprTools", "GPUArrays", "GPUCompiler", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "SpecialFunctions", "TimerOutputs"] -git-tree-sha1 = "19fb33957a5f85efb3cc10e70cf4dd4e30174ac9" -uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "3.10.0" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.16.1+1" - -[[deps.Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[deps.Cassette]] -git-tree-sha1 = "063b2e77c5537a548c5bf2f44161f1d3e1ab3227" -uuid = "7057c7e9-c182-5462-911a-8362d720325c" -version = "0.3.10" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "9950387274246d08af38f6eef8cb5480862a435f" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.14.0" - -[[deps.ChangesOfVariables]] -deps = ["ChainRulesCore", "LinearAlgebra", "Test"] -git-tree-sha1 = "1e315e3f4b0b7ce40feded39c73049692126cf53" -uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" -version = "0.1.3" - -[[deps.ClimaComms]] -deps = ["CUDA", "KernelAbstractions", "StaticArrays"] -git-tree-sha1 = "50fbb76557f11e28ec21ad2fbe5e7547f1b1f432" -uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" -version = "0.3.0" - -[[deps.ClimaCommsMPI]] -deps = ["ClimaComms", "KernelAbstractions", "MPI"] -git-tree-sha1 = "2a1857a51eab7e1b15dd709ccef3c3ccabd7a6f6" -uuid = "5f86816e-8b66-43b2-912e-75384f99de49" -version = "0.3.2" - -[[deps.ClimaCore]] -deps = ["Adapt", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DiffEqBase", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "InteractiveUtils", "IntervalSets", "LinearAlgebra", "RecursiveArrayTools", "RootSolvers", "Rotations", "SparseArrays", "Static", "StaticArrays", "Statistics", "UnPack"] -git-tree-sha1 = "1ee4c1d754635729c0ac3f1137b0647cf0fb7330" -uuid = "d414da3d-4745-48bb-8d80-42e94e092884" -version = "0.10.4" - -[[deps.ClimaCorePlots]] -deps = ["ClimaCore", "RecipesBase", "StaticArrays", "TriplotBase"] -git-tree-sha1 = "fb369432478d010ba9a2bd06b288d7a40467903b" -uuid = "cf7c7e5a-b407-4c48-9047-11a94a308626" -version = "0.2.3" - -[[deps.ClimaCoreVTK]] -deps = ["ClimaCore", "WriteVTK"] -git-tree-sha1 = "2a0f6f12ccdf50089e708b68e73b1fe08fb53cd8" -uuid = "c8b6d40d-e815-466f-95ae-c48aefa668fa" -version = "0.7.1" - -[[deps.CloseOpenIntervals]] -deps = ["ArrayInterface", "Static"] -git-tree-sha1 = "f576084239e6bdf801007c80e27e2cc2cd963fe0" -uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.6" - -[[deps.CloudMicrophysics]] -deps = ["CLIMAParameters", "DocStringExtensions", "SpecialFunctions", "Thermodynamics"] -git-tree-sha1 = "25d3f2d97cfae8b2326a7bb2f37fb274d2df0a73" -uuid = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" -version = "0.4.0" - -[[deps.CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "ded953804d019afa9a3f98981d99b33e3db7b6da" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.0" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Random"] -git-tree-sha1 = "7297381ccb5df764549818d9a7d57e45f1057d30" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.18.0" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "a985dc37e357a3b22b260a5def99f3530fb415d3" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.2" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "SpecialFunctions", "Statistics", "TensorCore"] -git-tree-sha1 = "3f1f500312161f1ae067abe07d13b40f78f32e07" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.9.8" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.8" - -[[deps.CommonSolve]] -git-tree-sha1 = "68a0743f578349ada8bc911a5cbd5a2ef6ed6d1f" -uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.0" - -[[deps.CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[deps.Compat]] -deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "b153278a25dd42c65abbf4e62344f9d22e59191b" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.43.0" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" - -[[deps.ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.3.0" - -[[deps.Contour]] -deps = ["StaticArrays"] -git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.5.7" - -[[deps.CpuId]] -deps = ["Markdown"] -git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" -uuid = "adafc99b-e345-5852-983c-f28acb93d879" -version = "0.3.1" - -[[deps.CubedSphere]] -deps = ["Elliptic", "Printf", "Rotations", "TaylorSeries", "Test"] -git-tree-sha1 = "f66fabd1ee5df59a7ba47c7873a6332c19e0c03f" -uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" -version = "0.2.0" - -[[deps.DEDataArrays]] -deps = ["ArrayInterface", "DocStringExtensions", "LinearAlgebra", "RecursiveArrayTools", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "5e5f8f363c8c9a2415ef9185c4e0ff6966c87d52" -uuid = "754358af-613d-5f8d-9788-280bf1605d4c" -version = "0.2.2" - -[[deps.DataAPI]] -git-tree-sha1 = "fb5f5316dd3fd4c5e7c30a24d50643b73e37cd40" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.10.0" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "cc1a8e22627f33c789ab60b36a9132ac050bbf75" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.12" - -[[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"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[deps.DensityInterface]] -deps = ["InverseFunctions", "Test"] -git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" -uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" -version = "0.4.0" - -[[deps.DiffEqBase]] -deps = ["ArrayInterface", "ChainRulesCore", "DEDataArrays", "DataStructures", "Distributions", "DocStringExtensions", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "IterativeSolvers", "LabelledArrays", "LinearAlgebra", "Logging", "MuladdMacro", "NonlinearSolve", "Parameters", "PreallocationTools", "Printf", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "StaticArrays", "Statistics", "SuiteSparse", "ZygoteRules"] -git-tree-sha1 = "bd3812f2be255da87a2438c3b87a0a478cdbd050" -uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" -version = "6.84.0" - -[[deps.DiffEqCallbacks]] -deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "LinearAlgebra", "NLsolve", "OrdinaryDiffEq", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "c4b99e3a199e293e7290eea94ba89364d47ee557" -uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" -version = "2.22.0" - -[[deps.DiffResults]] -deps = ["StaticArrays"] -git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.0.3" - -[[deps.DiffRules]] -deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "28d605d9a0ac17118fe2c5e9ce0fbb76c3ceb120" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.11.0" - -[[deps.Distances]] -deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.7" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[deps.Distributions]] -deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] -git-tree-sha1 = "8a6b49396a4058771c5c072239b2e0a76e2e898c" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.58" - -[[deps.DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.6" - -[[deps.Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" - -[[deps.DualNumbers]] -deps = ["Calculus", "NaNMath", "SpecialFunctions"] -git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" -uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" -version = "0.6.8" - -[[deps.EarCut_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d" -uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" -version = "2.2.3+0" - -[[deps.Elliptic]] -git-tree-sha1 = "71c79e77221ab3a29918aaf6db4f217b89138608" -uuid = "b305315f-e792-5b7a-8f41-49f472929428" -version = "1.0.1" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.4.8+0" - -[[deps.ExponentialUtilities]] -deps = ["ArrayInterface", "GenericSchur", "LinearAlgebra", "Printf", "Requires", "SparseArrays", "libblastrampoline_jll"] -git-tree-sha1 = "789a5aaec6856ad774a95cdb558806afeeb256f9" -uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" -version = "1.15.0" - -[[deps.ExprTools]] -git-tree-sha1 = "56559bbef6ca5ea0c0818fa5c90320398a6fbf8d" -uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.8" - -[[deps.FFMPEG]] -deps = ["FFMPEG_jll"] -git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" -uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.1" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "d8a578692e3077ac998b50c0217dfd67f21d1e5f" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.0+0" - -[[deps.FastBroadcast]] -deps = ["LinearAlgebra", "Polyester", "Static"] -git-tree-sha1 = "b6bf57ec7a3f294c97ae46124705a9e6b906a209" -uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" -version = "0.1.15" - -[[deps.FastClosures]] -git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" -uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" -version = "0.3.2" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "9267e5f50b0e12fdfd5a2455534345c4cf2c7f7a" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.14.0" - -[[deps.FillArrays]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] -git-tree-sha1 = "246621d23d1f43e3b9c368bf3b72b2331a27c286" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "0.13.2" - -[[deps.FiniteDiff]] -deps = ["ArrayInterface", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays"] -git-tree-sha1 = "51c8f36c81badaa0e9ec405dcbabaf345ed18c84" -uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.11.1" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.93+0" - -[[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", "StaticArrays"] -git-tree-sha1 = "89cc49bf5819f0a10a7a3c38885e7c7ee048de57" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.29" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.10.4+0" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.10+0" - -[[deps.FunctionWrappers]] -git-tree-sha1 = "241552bc2209f0fa068b6415b1942cc0aa486bcc" -uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" -version = "1.1.2" - -[[deps.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] -git-tree-sha1 = "51d2dfe8e590fbd74e7a842cf6d13d8a2f45dc01" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.3.6+0" - -[[deps.GPUArrays]] -deps = ["Adapt", "LLVM", "LinearAlgebra", "Printf", "Random", "Serialization", "Statistics"] -git-tree-sha1 = "c783e8883028bf26fb05ed4022c450ef44edd875" -uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "8.3.2" - -[[deps.GPUCompiler]] -deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "d8c5999631e1dc18d767883f621639c838f8e632" -uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.15.2" - -[[deps.GR]] -deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] -git-tree-sha1 = "af237c08bda486b74318c8070adb96efa6952530" -uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.64.2" - -[[deps.GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "cd6efcf9dc746b06709df14e462f0a3fe0786b1e" -uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.64.2+0" - -[[deps.GaussQuadrature]] -deps = ["SpecialFunctions"] -git-tree-sha1 = "eb6f1f48aa994f3018cbd029a17863c6535a266d" -uuid = "d54b0c1a-921d-58e0-8e36-89d8069c0969" -version = "0.5.8" - -[[deps.GenericSchur]] -deps = ["LinearAlgebra", "Printf"] -git-tree-sha1 = "fb69b2a645fa69ba5f474af09221b9308b160ce6" -uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" -version = "0.5.3" - -[[deps.GeometryBasics]] -deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "83ea630384a13fc4f002b77690bc0afeb4255ac9" -uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.2" - -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.68.3+2" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.14+0" - -[[deps.Graphs]] -deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "57c021de207e234108a6f1454003120a1bf350c4" -uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.6.0" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HTTP]] -deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] -git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "0.9.17" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] -git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "2.8.1+1" - -[[deps.HostCPUFeatures]] -deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "18be5268cf415b5e27f34980ed25a7d34261aa83" -uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.7" - -[[deps.Hwloc]] -deps = ["Hwloc_jll"] -git-tree-sha1 = "92d99146066c5c6888d5a3abc871e6a214388b91" -uuid = "0e44f5e4-bd66-52a0-8798-143a42290a1d" -version = "2.0.0" - -[[deps.Hwloc_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "303d70c961317c4c20fafaf5dbe0e6d610c38542" -uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.7.1+0" - -[[deps.HypergeometricFunctions]] -deps = ["DualNumbers", "LinearAlgebra", "SpecialFunctions", "Test"] -git-tree-sha1 = "cb7099a0109939f16a4d3b572ba8396b1f6c7c31" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.10" - -[[deps.IfElse]] -git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" -uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" -version = "0.1.1" - -[[deps.Inflate]] -git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.2" - -[[deps.IniFile]] -git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" -uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" -version = "0.5.1" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[deps.IntervalSets]] -deps = ["Dates", "Statistics"] -git-tree-sha1 = "ad841eddfb05f6d9be0bff1fa48dcae32f134a2d" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.6.2" - -[[deps.InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "336cc738f03e069ef2cac55a104eb823455dca75" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.4" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.1.1" - -[[deps.IterTools]] -git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.4.0" - -[[deps.IterativeSolvers]] -deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] -git-tree-sha1 = "1169632f425f79429f245113b775a0e3d121457c" -uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" -version = "0.9.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", "Printf", "Reexport", "TranscodingStreams", "UUIDs"] -git-tree-sha1 = "81b9477b49402b47fbe7f7ae0b252077f53e4a08" -uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.4.22" - -[[deps.JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.4.1" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.3" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "2.1.2+0" - -[[deps.KernelAbstractions]] -deps = ["Adapt", "Cassette", "InteractiveUtils", "MacroTools", "SpecialFunctions", "StaticArrays", "UUIDs"] -git-tree-sha1 = "cb7d8b805413025a5bc866fc036b426223ffc059" -uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.7.2" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.1+0" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "3.0.0+1" - -[[deps.LLVM]] -deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] -git-tree-sha1 = "c8d47589611803a0f3b4813d9e267cd4e3dbcefb" -uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "4.11.1" - -[[deps.LLVMExtra_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg", "TOML"] -git-tree-sha1 = "771bfe376249626d3ca12bcd58ba243d3f961576" -uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.16+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.1+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.0" - -[[deps.LabelledArrays]] -deps = ["ArrayInterface", "ChainRulesCore", "LinearAlgebra", "MacroTools", "StaticArrays"] -git-tree-sha1 = "1cccf6d366e51fbaf80303158d49bb2171acfeee" -uuid = "2ee39098-c373-598a-b85f-a56591580800" -version = "1.9.0" - -[[deps.Latexify]] -deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] -git-tree-sha1 = "46a39b9c58749eefb5f2dc1178cb8fab5332b1ab" -uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.15.15" - -[[deps.LayoutPointers]] -deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static"] -git-tree-sha1 = "b651f573812d6c36c22c944dd66ef3ab2283dfa1" -uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.6" - -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" - -[[deps.LeftChildRightSiblingTrees]] -deps = ["AbstractTrees"] -git-tree-sha1 = "b864cb409e8e445688bc478ef87c0afe4f6d1f8d" -uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" -version = "0.1.3" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" - -[[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" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.2+1" - -[[deps.Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] -git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.7+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.3.0+3" - -[[deps.Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.42.0+0" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.16.1+1" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.35.0+0" - -[[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "c9551dd26e31ab17b86cbd00c2ede019c08758eb" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.3.0+1" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.36.0+0" - -[[deps.LightXML]] -deps = ["Libdl", "XML2_jll"] -git-tree-sha1 = "e129d9391168c677cd4800f5c0abb1ed8cb3794f" -uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" -version = "0.9.0" - -[[deps.LineSearches]] -deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] -git-tree-sha1 = "f27132e551e959b3667d8c93eae90973225032dd" -uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" -version = "7.1.1" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[deps.LogExpFunctions]] -deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "09e4b894ce6a976c354a69041a04748180d43637" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.15" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[deps.LoopVectorization]] -deps = ["ArrayInterface", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "DocStringExtensions", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "SIMDDualNumbers", "SLEEFPirates", "SpecialFunctions", "Static", "ThreadingUtilities", "UnPack", "VectorizationBase"] -git-tree-sha1 = "4392c19f0203df81512b6790a0a67446650bdce0" -uuid = "bdcacae8-1622-11e9-2a5c-532679323890" -version = "0.12.110" - -[[deps.MPI]] -deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "Pkg", "Random", "Requires", "Serialization", "Sockets"] -git-tree-sha1 = "d56a80d8cf8b9dc3050116346b3d83432b1912c0" -uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" -version = "0.19.2" - -[[deps.MPICH_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9f781ffc4020c24ca05d83fa4eb4df0d34832b18" -uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.0.2+1" - -[[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.9" - -[[deps.ManualMemory]] -git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" -uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" -version = "0.1.8" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.3" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" - -[[deps.Measures]] -git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" -uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.1" - -[[deps.MicrosoftMPI_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "a16aa086d335ed7e0170c5265247db29172af2f9" -uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" -version = "10.1.3+2" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.0.2" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" - -[[deps.MuladdMacro]] -git-tree-sha1 = "c6190f9a7fc5d9d5915ab29f2134421b12d24a68" -uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" -version = "0.2.2" - -[[deps.NLSolversBase]] -deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] -git-tree-sha1 = "50310f934e55e5ca3912fb941dec199b49ca9b68" -uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" -version = "7.8.2" - -[[deps.NLsolve]] -deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] -git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" -uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" -version = "4.5.1" - -[[deps.NaNMath]] -git-tree-sha1 = "b086b7ea07f8e38cf122f5016af580881ac914fe" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "0.3.7" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" - -[[deps.NonlinearSolve]] -deps = ["ArrayInterface", "FiniteDiff", "ForwardDiff", "IterativeSolvers", "LinearAlgebra", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "UnPack"] -git-tree-sha1 = "aeebff6a2a23506e5029fd2248a26aca98e477b3" -uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" -version = "0.3.16" - -[[deps.OffsetArrays]] -deps = ["Adapt"] -git-tree-sha1 = "e6c5f47ba51b734a4e264d7183b6750aec459fa0" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.11.1" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" - -[[deps.OpenMPI_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "19ec7d0311aa5fb5fe537dc6eeaec86942b64caf" -uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "4.1.3+0" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ab05aa4cc89736e95915b01e7279e61b1bfe33b8" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "1.1.14+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.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" - -[[deps.OrdinaryDiffEq]] -deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastClosures", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "Polyester", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] -git-tree-sha1 = "103e344075fa8fe62874a15d8016d9e0ce9f4a50" -uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -version = "5.71.1" - -[[deps.PCRE_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" -uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" -version = "8.44.0+0" - -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "027185efff6be268abbaf30cfd53ca9b59e3c857" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.10" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" - -[[deps.Parsers]] -deps = ["Dates"] -git-tree-sha1 = "1285416549ccfcdf0c50d4997a94331e88d68413" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.3.1" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.40.1+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[deps.PlotThemes]] -deps = ["PlotUtils", "Statistics"] -git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" -uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "3.0.0" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "bb16469fd5224100e422f0b027d26c5a25de1200" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.2.0" - -[[deps.Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] -git-tree-sha1 = "d457f881ea56bbfa18222642de51e0abf67b9027" -uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.29.0" - -[[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "0578fa5fde97f8cf19aa89f8373d92624314f547" -uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.6.9" - -[[deps.PolyesterWeave]] -deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "7e597df97e46ffb1c8adbaddfa56908a7a20194b" -uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.1.5" - -[[deps.PreallocationTools]] -deps = ["Adapt", "ArrayInterface", "ForwardDiff", "LabelledArrays"] -git-tree-sha1 = "6c138c8510111fa47b5d2ed8ada482d97e279bee" -uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" -version = "0.2.4" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.3.0" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.ProgressLogging]] -deps = ["Logging", "SHA", "UUIDs"] -git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" -uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -version = "0.1.4" - -[[deps.Qt5Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] -git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" -uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" -version = "5.15.3+1" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.4.2" - -[[deps.Quaternions]] -deps = ["DualNumbers", "LinearAlgebra", "Random"] -git-tree-sha1 = "b327e4db3f2202a4efafe7569fcbe409106a1f75" -uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" -version = "0.5.6" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[deps.Random]] -deps = ["SHA", "Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[deps.Random123]] -deps = ["Random", "RandomNumbers"] -git-tree-sha1 = "afeacaecf4ed1649555a19cb2cad3c141bbc9474" -uuid = "74087812-796a-5b5d-8853-05524746bad3" -version = "1.5.0" - -[[deps.RandomNumbers]] -deps = ["Random", "Requires"] -git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" -uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" -version = "1.5.3" - -[[deps.RecipesBase]] -git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.2.1" - -[[deps.RecipesPipeline]] -deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] -git-tree-sha1 = "dc1e451e15d90347a7decc4221842a022b011714" -uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.5.2" - -[[deps.RecursiveArrayTools]] -deps = ["Adapt", "ArrayInterface", "ChainRulesCore", "DocStringExtensions", "FillArrays", "GPUArrays", "LinearAlgebra", "RecipesBase", "StaticArrays", "Statistics", "ZygoteRules"] -git-tree-sha1 = "6b25d6ba6361ccba58be1cf9ab710e69f6bc96f8" -uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "2.27.1" - -[[deps.RecursiveFactorization]] -deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "StrideArraysCore", "TriangularSolve"] -git-tree-sha1 = "a9a852c7ebb08e2a40e8c0ab9830a744fa283690" -uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" -version = "0.2.10" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "cdbd3b1338c72ce29d9584fdbe9e9b70eeb5adca" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "0.1.3" - -[[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 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.7.0" - -[[deps.Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.3.0+0" - -[[deps.RootSolvers]] -deps = ["DocStringExtensions", "ForwardDiff"] -git-tree-sha1 = "08c746c1b621e88953650133e46428bfecc11058" -uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" -version = "0.3.0" - -[[deps.Rotations]] -deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays", "Statistics"] -git-tree-sha1 = "3177100077c68060d63dd71aec209373c3ec339b" -uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.3.1" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[deps.SIMDDualNumbers]] -deps = ["ForwardDiff", "IfElse", "SLEEFPirates", "VectorizationBase"] -git-tree-sha1 = "62c2da6eb66de8bb88081d20528647140d4daa0e" -uuid = "3cdde19b-5bb0-4aaf-8931-af3e248e098b" -version = "0.1.0" - -[[deps.SIMDTypes]] -git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" -uuid = "94e857df-77ce-4151-89e5-788b33177be4" -version = "0.1.0" - -[[deps.SLEEFPirates]] -deps = ["IfElse", "Static", "VectorizationBase"] -git-tree-sha1 = "ac399b5b163b9140f9c310dfe9e9aaa225617ff6" -uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" -version = "0.6.32" - -[[deps.SciMLBase]] -deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "RecipesBase", "RecursiveArrayTools", "StaticArrays", "Statistics", "Tables", "TreeViews"] -git-tree-sha1 = "8161f13168845aefff8dc193b22e3fcb4d8f91a9" -uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "1.31.5" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.1.0" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[deps.Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "Requires"] -git-tree-sha1 = "38d88503f695eb0301479bc9b0d4320b378bafe5" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "0.8.2" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.0.1" - -[[deps.SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[deps.SparseDiffTools]] -deps = ["Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"] -git-tree-sha1 = "314a07e191ea4a5ea5a2f9d6b39f03833bde5e08" -uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" -version = "1.21.0" - -[[deps.SpecialFunctions]] -deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "5ba658aeecaaf96923dce0da9e703bd1fe7666f9" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.1.4" - -[[deps.Static]] -deps = ["IfElse"] -git-tree-sha1 = "7f5a513baec6f122401abfc8e9c074fdac54f6c1" -uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.4.1" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "cd56bf18ed715e8b09f06ef8c6b781e6cdc49911" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.4.4" - -[[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "c82aaa13b44ea00134f8c9c89819477bd3986ecd" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.3.0" - -[[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "8977b17906b0a1cc74ab2e3a05faa16cf08a8291" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.33.16" - -[[deps.StatsFuns]] -deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "5783b877201a82fc0014cbf381e7e6eb130473a4" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.0.1" - -[[deps.StrideArraysCore]] -deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "Requires", "SIMDTypes", "Static", "ThreadingUtilities"] -git-tree-sha1 = "e03eacc0b8c1520e73aa84922ce44a14f024b210" -uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.3.6" - -[[deps.StructArrays]] -deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"] -git-tree-sha1 = "e75d82493681dfd884a357952bbd7ab0608e1dc3" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.7" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" - -[[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", "Test"] -git-tree-sha1 = "5ce79ce186cc678bbb5c5681ca3379d1ddae11a1" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.7.0" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" - -[[deps.TaylorSeries]] -deps = ["InteractiveUtils", "LinearAlgebra", "Markdown", "Requires", "SparseArrays"] -git-tree-sha1 = "66f4d1993bae49eeba21a1634b5f65782585a42c" -uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" -version = "0.10.13" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.TerminalLoggers]] -deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] -git-tree-sha1 = "62846a48a6cd70e63aa29944b8c4ef704360d72f" -uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -version = "0.1.5" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.Thermodynamics]] -deps = ["CLIMAParameters", "DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"] -git-tree-sha1 = "44f5a700a6b60b97663b2467f0c7b62dfe15e983" -uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" -version = "0.7.1" - -[[deps.ThreadingUtilities]] -deps = ["ManualMemory"] -git-tree-sha1 = "f8629df51cab659d70d2e5618a430b4d3f37f2c3" -uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" -version = "0.5.0" - -[[deps.TimerOutputs]] -deps = ["ExprTools", "Printf"] -git-tree-sha1 = "7638550aaea1c9a1e86817a231ef0faa9aca79bd" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.19" - -[[deps.TranscodingStreams]] -deps = ["Random", "Test"] -git-tree-sha1 = "216b95ea110b5972db65aa90f88d8d89dcb8851c" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.9.6" - -[[deps.TreeViews]] -deps = ["Test"] -git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" -uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" -version = "0.3.0" - -[[deps.TriangularSolve]] -deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "Static", "VectorizationBase"] -git-tree-sha1 = "b8d08f55b02625770c09615d96927b3a8396925e" -uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" -version = "0.1.11" - -[[deps.TriplotBase]] -git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" -uuid = "981d1d27-644d-49a2-9326-4793e63143c3" -version = "0.1.0" - -[[deps.URIs]] -git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.3.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.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.Unzip]] -git-tree-sha1 = "34db80951901073501137bdbc3d5a8e7bbd06670" -uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" -version = "0.1.2" - -[[deps.VectorizationBase]] -deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "Hwloc", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static"] -git-tree-sha1 = "ff34c2f1d80ccb4f359df43ed65d6f90cb70b323" -uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" -version = "0.21.31" - -[[deps.VertexSafeGraphs]] -deps = ["Graphs"] -git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" -uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" -version = "0.2.0" - -[[deps.Wayland_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.19.0+0" - -[[deps.Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.25.0+0" - -[[deps.WriteVTK]] -deps = ["Base64", "CodecZlib", "FillArrays", "LightXML", "TranscodingStreams"] -git-tree-sha1 = "bff2f6b5ff1e60d89ae2deba51500ce80014f8f6" -uuid = "64499a7a-5c06-52f2-abe2-ccb03c286192" -version = "1.14.2" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.9.12+0" - -[[deps.XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.34+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.6.9+4" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.9+4" - -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.0+4" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.3+4" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.4+4" - -[[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "5.0.3+4" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.7.10+4" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] -git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.4+4" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.2+4" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.10+4" - -[[deps.Xorg_libpthread_stubs_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" -uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" -version = "0.1.0+3" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.13.0+3" - -[[deps.Xorg_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.0+4" - -[[deps.Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" -uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] -git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" -uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" -uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" -uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.9+1" - -[[deps.Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" -uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.1+1" - -[[deps.Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.2+4" - -[[deps.Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.27.0+4" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.4.0+3" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" - -[[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.2+0" - -[[deps.ZygoteRules]] -deps = ["MacroTools"] -git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" -uuid = "700de1a5-db45-46bc-99cf-38207098b444" -version = "0.2.2" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.1+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.2+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.38+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+1" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" - -[[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "0.9.1+5" diff --git a/experiments/AMIP/moist_mpi_aquaplanet/Project.toml b/experiments/AMIP/moist_mpi_aquaplanet/Project.toml deleted file mode 100644 index cffed2c8f9..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/Project.toml +++ /dev/null @@ -1,22 +0,0 @@ -[deps] -ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" -ClimaCommsMPI = "5f86816e-8b66-43b2-912e-75384f99de49" -ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884" -ClimaCorePlots = "cf7c7e5a-b407-4c48-9047-11a94a308626" -IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" -LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" -OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" -TerminalLoggers = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" - -[compat] -ClimaCore = "0.10" - -[extras] -CPUSummary = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" diff --git a/experiments/AMIP/moist_mpi_aquaplanet/README.md b/experiments/AMIP/moist_mpi_aquaplanet/README.md deleted file mode 100644 index 77e88de30a..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# **Baroclinic Wave + Slab** - -# Atmosphere -The momentum equations are in the advective form, and tracers in the consevative form, namely: - -- Density: -$$ \frac{\partial \rho}{\partial t} + \nabla \cdot ({\rho \vec{u}})= 0 $$ - -- Momentum (flux form): -$$ \frac{\partial \vec{u_h}}{\partial t} + \vec{u} \cdot \nabla \vec{u_h} = - \frac{1}{\rho}\nabla_h p -+ \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} \vec{u_h} -$$ -$$ \frac{\partial w}{\partial t} + \vec{u} \cdot \nabla w= -- \frac{1}{\rho}\frac{\partial p}{\partial z} -- \nabla_z \Phi -+ \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} w -$$ - -- Total energy: -$$ \frac{\partial \rho e_{tot}}{\partial t} + \nabla \cdot (\rho h_{tot} \vec{u}) = \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} h_{tot} -$$ - -where the total specific enthalpy and total specific energy are -$$ h_{tot} = e_{tot} + \frac{p}{\rho} \,\,\,\,\,\,\,\, \,\,\,\,\,\,\,\, e_{tot} = c_v T + \Phi + \frac{1}{2}\vec{u}^2 -$$ -(note that $h_{tot} \neq h = c_vT + p/\rho = c_p T$, the specific enthalpy in the thermodynamic sense), $\Phi = gz$ is the geopotential, -$u_h$ is the horizontal velocity vector, $w$ the vertical velocity, $\rho$ the density, $p$ pressure, $K_v$ the vertical diffusivity (assumed constant here). - -## Boundary conditions (BCs) -- We implement BCs similarly to other climate models. - - First-order fluxes (i.e., advective fluxes) are always set to zero, corresponding to the *free-slip* and *impenetrable* BC, where: - $$ - w = 0 \,\,\,\,\,\,\, \partial_t w = 0 \,\,\,\,\,\,\, \nabla \times\vec{u_h}=0 \,\,\,\,\,\,\, \nabla \cdot \vec{\rho u_h}=0 \,\,\,\,\,\,\, \nabla \cdot \rho h_{tot} \vec{u_h}=0 - $$ - - Second-order fluxes (i.e., diffusive fluxes) - - `No Flux`: By default we have *impenetrable* or *insulating* BCs (no second-order fluxes) at all boundaries. - - `Bulk Formula`: Applied to tracers (e.g., temperature and moisture), this imposes a boundary fluxes (e.g., sensible and latent heat) calculated using the bulk aerodynamic formulae using prescribed surface values of ($T_{sfc}$ and $q_{sfc}^{sat}$). At the surface, the bulk sensible heat flux formula for total enthalpy essentially replaces the above: - $$ (K_v \rho \partial_z h_{tot})_{sfc}$$ - For **total energy**, we have two choices: - - 1. enthalpy flux: - $$ (K_v \rho \partial_z h_{tot})_{sfc} \rightarrow - \hat{n} \cdot \rho C_H ||u||^{1} (h^1- h_{sfc}) - = F_S - $$ - - 2. sensible (and latent) heat flux. The sensible heat flux is: - $$ (K_v \rho \partial_z h_{tot})_{sfc} \rightarrow - \hat{n} \cdot C_H c_{pd} ρ^{1} ||u||^{1} (T^{1} - T_{sfc}) - + \hat{n} \cdot C_H ρ^{1} ||u||^{1} (\Phi^{1} - \Phi_{sfc}) - = F_S - $$ - where $^{1}$ corresponds to the lowest model level, $C_H$ is the dimensionless thermal transfer coefficient, $c_{pd}$ is the specific heat capacity for dry air $||u||$ the wind speed. This is the *bulk turbulent sensible heat flux* parameterization, and $F_S$ is positive when atmosphere receives energy from the surface. - The contribution of the kinetic energy is usually O(1e4) smaller and is neglected, but it can be added to F_S as: - $$ - F_{S_{tot}} = F_S + \hat{n} \cdot C_D ρ^{1} ||u||^{1} (\vec{u_h}^{1})^2 - $$ - - `Drag Law`: essentially the bulk formula for momentum - $$ \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} \vec{u_h} \rightarrow - \hat{n} \cdot C_D ρ^{1} ||u||^{1} \vec{u_h}^{1} - = F_M - $$ - - `Coupled Bulk Formula`: same as `Bulk Formula`, but surface quantities (e.g. $T_{sfc}$) are passed from the state of the neighboring model. - - - The diffusive fluxes are applied via the `vertical_diffusion` ClimaAtmos model sub-component. To apply boundary fluxes without diffusion in the atmospheric interior, the viscosity coefficient needs to be set to zero: $ν = FT(0)$. - - We use `SurfaceFluxes.jl` to deal with the Monin Obukhov calculations - -## Current setup -- total energy and momentum - - at z=0: - - ρe: `Coupled Bulk Formula` latent heat flux + sensible heat flux (will be combined into enthalpy flux formulation in SurfaceFluxes.jl) - - uh: `Drag Law` - - the the top: - - $F_S = F_M = 0$ - - values - - simple setup: $C_D = C_H = 0.001$, interior diffusivity is set to $\nu = 5$ m^2/s - - ClimaAtmos setup ∀ p > p_pbl : $C_D = C_E = 0.0044 exp(-\frac{(p_{pbl} - p)}{p_{strato}}^2)$ - - where $p_{pbl} = 8e4$ Pa, $p_{strato} = 1e4$ Pa - -- All other boundary fluxes are set to 0. - -## Initial conditions -- we initialize with a perturbation in a balanced background state, as in: -https://climate.ucdavis.edu/pubs/UMJS2013QJRMS.pdf - -# Heat Slab -The slab solves for temperature in a single layer, whose tendency is the accumulated fluxes divided by the coupling timestep plus a parameterisation of the internal processes, $G$. -$$ -\rho c h_s \, \partial_t T_{sfc} = - F_{integ} / \Delta t_{coupler} -$$ - -# Distribution -## Julia multithreading -- we can run using multiple threads if the command line argument `enable_threading` is true. - -## MPI via ClimaComms.jl -- for AMIP we want the surface columns to be on the same processors as the atmos columns. Since all all surface domains will be on masked spheres, all of them can inherit the same distributed horizontal space from the atmos model. -- for this we need to run the `sbatch_job.sh` script, which sets up the `CLIMACORE_DISTRIBUTED` environment variable and job specifications, and runs the coupler_driver with `mpiexec` - -## Regridding -- not needed for AMIP. ClimaCoreTempestRemap can be easily re-introduced for a single processor, but will require more work for MPI runs. - -# Tests -## Conservation -- this uses the `sum` of `ClimaCore/Fields/mapreduce.jl`, which produces a sum weighted by the area Jacobian. - - one can easily check this by summing a field of ones using the domain's space: - ``` - field_of_ones = ones(center_space) - sum(field_of_ones) ≈ (4*pi*domain_radius^2) * domain_height - ``` - -## Performance -- using `@elapsed` to measure the walltime of the coupling loop -- 1. strong scaling - - increasing the number of precessing elements (MPI processes or threads) - -- 2. weak scaling - - increasing the number of precessing elements (MPI processes or threads) with job size (vertical resolution) - -- 3. comparison to stand-alone atmos - - using the original ClimaAtmos driver (using `solve!`) - -## Physical correctness -- run the default for 20 days - -# NB: -- first coupled iteration does not call rhs! -- slab `T_sfc` gets huge numbers when using `SSPRK33`. ok with `Euler` -- do not init global fields with mpi context - -# TODO -- implement drag law, mass flux, moisture flux -- ClimaAtmos: sub in newest CA interface -- interface: - - clean the way we sum over the boundary field (now need to divide by dz) - - add coupler specific abstractions -- fluxes: re-enable different ways to calculate / accumulate fluxes (at overy coupler timestep; at every atmos timestep via callback; via specification of an additional variable) -- conservation tests: add error threshold and exception, interval, show option, and make a general interface for it -- physical test -- performance check: -- SurfaceFluxes: combine LHF and SHF into enthalpy flux formulation to avoid division by zero - -# References -- [Kang et al 2021](https://arxiv.org/abs/2101.09263) -- [kth.se blog for strong and weak scaling](https://www.kth.se/blogs/pdc/2018/11/scalability-strong-and-weak-scaling/) - - - - diff --git a/experiments/AMIP/moist_mpi_aquaplanet/atmos/atmos_init.jl b/experiments/AMIP/moist_mpi_aquaplanet/atmos/atmos_init.jl deleted file mode 100644 index a920281208..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/atmos/atmos_init.jl +++ /dev/null @@ -1,87 +0,0 @@ -# atmos_init: for ClimaAtmos pre-AMIP interface - -# clone locally ClimaAtmos and checkout the checkpoint branch (this is necessary because the driver is currently not a module, and the checkpoint branch avoids the necessity for frequent updates) -CWD = pwd() -ATMOS_DIR = CWD * "/../../../../ClimaAtmos.jl_cpl/" - -run(`rm -rf $ATMOS_DIR`) -ClimaComms.barrier(comms_ctx) - - -if !is_distributed || (is_distributed && ClimaComms.iamroot(comms_ctx)) - run(`git clone https://github.com/CliMA/ClimaAtmos.jl.git $ATMOS_DIR`) - run(`chmod 775 checkout_ClimaAtmos.sh`) - run(`."/"checkout_ClimaAtmos.sh $ATMOS_DIR`) -end - -ClimaComms.barrier(comms_ctx) - -Pkg.develop(path = ATMOS_DIR) -Pkg.activate(joinpath(ATMOS_DIR, "examples")) -Pkg.instantiate() -Pkg.add(PackageSpec(name = "ClimaCore", version = "0.10.3")) - -driver_orig = ATMOS_DIR * "examples/hybrid/driver.jl" -driver_new = ATMOS_DIR * "examples/hybrid/driver_new.jl" - -# get only the chunks of the driver.jl we need (i.e. before solve!) -if !is_distributed || (is_distributed && ClimaComms.iamroot(comms_ctx)) - - run( - pipeline( - `awk '$1=="sol" {f=0;next} f{print;next} NR==1 {f=1}'`; - stdin = driver_orig, - stdout = driver_new, - append = false, - ), - ) - - # remove the hard coded tendency specifications (so that we can define a diffusion tendency that allows for the correct coupled boundary conditions) - run(`sed -i.bak -e '94,123d' $driver_new`) # yep! - - # remove hard coded MPI init (optional but neater) - run(`sed -i.bak -e '98,119d' $driver_new`) # yep! -end - -# init model using the modified driver -include(joinpath(ATMOS_DIR, "examples/hybrid/cli_options.jl")) - -s = argparse_settings() - -# add coupler-taylored CA functions -TEST_NAME = "coupled_atmos" - -coupler_atmos_file = CWD * "/atmos/" * TEST_NAME * ".jl" - -ClimaComms.barrier(comms_ctx) -include(coupler_atmos_file) - -# specify sim parameters -const FT = parsed_args["FLOAT_TYPE"] == "Float64" ? Float64 : Float32 # parsed_args["FLOAT_TYPE"] = FT -parsed_args["dt"] = string(Δt_cpl) * "secs" -parsed_args["t_end"] = string(t_end) * "secs" -parsed_args["enable_threading"] = true -parsed_args["dt_save_to_sol"] = string(saveat) * "secs" - -atoms_setup_dir = joinpath(ATMOS_DIR, "examples/hybrid/sphere/") - -if !is_distributed || (is_distributed && ClimaComms.iamroot(comms_ctx)) - run(`cp $coupler_atmos_file $atoms_setup_dir`) -end - -# init model using the modified driver -ClimaComms.barrier(comms_ctx) -include(driver_new) # this stops just before `solve!` - -spaces = (; center_space = center_space, face_space = face_space) - -struct AtmosSimulation{P, Y, D, I} - params::P - Y_init::Y - domain::D - integrator::I -end - -function atmos_init(::Type{FT}, Y, spaces, integrator; params = nothing) where {FT} - AtmosSimulation(params, Y, spaces, integrator) -end diff --git a/experiments/AMIP/moist_mpi_aquaplanet/atmos/coupled_atmos.jl b/experiments/AMIP/moist_mpi_aquaplanet/atmos/coupled_atmos.jl deleted file mode 100644 index 35ca69bede..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/atmos/coupled_atmos.jl +++ /dev/null @@ -1,123 +0,0 @@ -using ClimaCore.Geometry: ⊗ - -function vertical_diffusion_boundary_layer_coupled_tendency!(Yₜ, Y, p, t) - ᶜρ = Y.c.ρ - (; ᶜp, ᶠv_a, ᶠz_a, ᶠK_E) = p # assume ᶜts and ᶜp have been updated - (; ρ_dif_flux_h_tot, dif_flux_ρq_tot, ρ_dif_flux_uₕ) = p - ᶠgradᵥ = Operators.GradientC2F() # apply BCs to ᶜdivᵥ, which wraps ᶠgradᵥ - - Fields.field_values(ᶠv_a) .= Fields.field_values(Spaces.level(Y.c.uₕ, 1)) .* one.(Fields.field_values(ᶠz_a)) # TODO: fix VIJFH copyto! to remove this - @. ᶠK_E = eddy_diffusivity_coefficient(norm(ᶠv_a), ᶠz_a, ᶠinterp(ᶜp)) #* FT(0) - - # Total Energy - if :ρe in propertynames(Y.c) - ᶜdivᵥ = Operators.DivergenceF2C( - top = Operators.SetValue(Geometry.WVector(FT(0))), - bottom = Operators.SetValue(.-ρ_dif_flux_h_tot), - ) - @. Yₜ.c.ρe += ᶜdivᵥ(ᶠK_E * ᶠinterp(ᶜρ) * ᶠgradᵥ((Y.c.ρe + ᶜp) / ᶜρ)) - end - - # Liquid Mass and Total Mass - if :ρq_tot in propertynames(Y.c) - ᶜdivᵥ = Operators.DivergenceF2C( - top = Operators.SetValue(Geometry.WVector(FT(0))), - bottom = Operators.SetValue(.-dif_flux_ρq_tot), - ) - @. Yₜ.c.ρq_tot += ᶜdivᵥ(ᶠK_E * ᶠinterp(ᶜρ) * ᶠgradᵥ(Y.c.ρq_tot / ᶜρ)) - @. Yₜ.c.ρ += ᶜdivᵥ(ᶠK_E * ᶠinterp(ᶜρ) * ᶠgradᵥ(Y.c.ρq_tot / ᶜρ)) - end - - # Momentum - if :uₕ in propertynames(Y.c) - ᶜdivᵥ = Operators.DivergenceF2C( - top = Operators.SetValue(Geometry.Contravariant3Vector(FT(0)) ⊗ Geometry.Covariant12Vector(FT(0), FT(0))), - bottom = Operators.SetValue(.-ρ_dif_flux_uₕ), - ) - - @. Yₜ.c.uₕ += ᶜdivᵥ(ᶠK_E * ᶠgradᵥ(Y.c.uₕ)) - end - -end - -function vertical_diffusion_boundary_layer_coupled_cache(Y; Cd = FT(0.0044), Ch = FT(0.0044)) - ᶠz_a = similar(Y.f, FT) - z_bottom = Spaces.level(Fields.coordinate_field(Y.c).z, 1) - Fields.field_values(ᶠz_a) .= Fields.field_values(z_bottom) .* one.(Fields.field_values(ᶠz_a)) - # TODO: fix VIJFH copyto! to remove the one.(...) - - if :ρq_tot in propertynames(Y.c) - dif_flux_ρq_tot = similar(z_bottom, Geometry.WVector{FT}) - else - dif_flux_ρq_tot = Ref(Geometry.WVector(FT(0))) - end - - #ρ_dif_flux_uₕ = similar(z_bottom, Geometry.Contravariant3Vector{FT}) .⊗ similar(z_bottom, Geometry.Covariant12Vector{FT}) # this breaks - ρ_dif_flux_uₕ = - Geometry.Contravariant3Vector.(zeros(axes(z_bottom))) .⊗ - Geometry.Covariant12Vector.(zeros(axes(z_bottom)), zeros(axes(z_bottom))) - - if (:ρq_liq in propertynames(Y.c) && :ρq_ice in propertynames(Y.c) && :ρq_tot in propertynames(Y.c)) - ts_type = TD.PhaseNonEquil{FT} - elseif :ρq_tot in propertynames(Y.c) - ts_type = TD.PhaseEquil{FT} - else - ts_type = TD.PhaseDry{FT} - end - coef_type = SF.Coefficients{ - FT, - SF.InteriorValues{FT, Tuple{FT, FT}, ts_type}, - SF.SurfaceValues{FT, Tuple{FT, FT}, TD.PhaseEquil{FT}}, - } - - return (; - ᶠv_a = similar(Y.f, eltype(Y.c.uₕ)), - ᶠz_a, - ᶠK_E = similar(Y.f, FT), - flux_coefficients = similar(z_bottom, coef_type), - ρ_dif_flux_h_tot = similar(z_bottom, Geometry.WVector{FT}), - dif_flux_ρq_tot, - ρ_dif_flux_uₕ, - Cd, - Ch, - ) -end - -# TODO: flip order so that NamedTuple() is fallback. -additional_cache(Y, params, dt; use_tempest_mode = false) = merge( - hyperdiffusion_cache(Y; κ₄ = FT(2e17), use_tempest_mode), - sponge ? rayleigh_sponge_cache(Y, dt) : NamedTuple(), - isnothing(microphy) ? NamedTuple() : zero_moment_microphysics_cache(Y), - isnothing(forcing) ? NamedTuple() : held_suarez_cache(Y), - isnothing(rad) ? NamedTuple() : rrtmgp_model_cache(Y, params; radiation_mode, idealized_h2o), - vert_diff ? vertical_diffusion_boundary_layer_coupled_cache(Y) : NamedTuple(), - (; - tendency_knobs = (; - hs_forcing = forcing == "held_suarez", - microphy_0M = microphy == "0M", - rad_flux = !isnothing(rad), - vert_diff, - hyperdiff, - ) - ), -) - -additional_tendency!(Yₜ, Y, p, t) = begin - (; rad_flux, vert_diff, hs_forcing) = p.tendency_knobs - (; microphy_0M, hyperdiff) = p.tendency_knobs - hyperdiff && hyperdiffusion_tendency!(Yₜ, Y, p, t) - sponge && rayleigh_sponge_tendency!(Yₜ, Y, p, t) - hs_forcing && held_suarez_tendency!(Yₜ, Y, p, t) - vert_diff && vertical_diffusion_boundary_layer_coupled_tendency!(Yₜ, Y, p, t) - microphy_0M && zero_moment_microphysics_tendency!(Yₜ, Y, p, t) - rad_flux && rrtmgp_model_tendency!(Yₜ, Y, p, t) -end - -parsed_args["microphy"] = nothing -parsed_args["forcing"] = nothing -parsed_args["idealized_h2o"] = false -parsed_args["vert_diff"] = true -parsed_args["rad"] = nothing -parsed_args["hyperdiff"] = false -parsed_args["config"] = "sphere" -parsed_args["moist"] = "equil" diff --git a/experiments/AMIP/moist_mpi_aquaplanet/checkout_ClimaAtmos.sh b/experiments/AMIP/moist_mpi_aquaplanet/checkout_ClimaAtmos.sh deleted file mode 100755 index 729d3633c8..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/checkout_ClimaAtmos.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd $1 -git checkout origin/ln/stable-interface-checkpoint diff --git a/experiments/AMIP/moist_mpi_aquaplanet/coupler_driver.jl b/experiments/AMIP/moist_mpi_aquaplanet/coupler_driver.jl deleted file mode 100644 index 548b311da3..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/coupler_driver.jl +++ /dev/null @@ -1,88 +0,0 @@ -# coupeler_driver - -# import packages -using Pkg -import SciMLBase: step! -using OrdinaryDiffEq -using OrdinaryDiffEq: ODEProblem, solve, SSPRK33, savevalues!, Euler -using LinearAlgebra -import Test: @test -import ClimaCore.Spaces as Spaces - -# import coupler utils -include("coupler_utils/flux_calculator.jl") -include("coupler_utils/conservation_checker.jl") -include("coupler_utils/regridder.jl") - -# initiate spatial and temporal info -t_end = 2592000 # 100e2 -tspan = (0, t_end) -Δt_cpl = 2e2 -saveat = Δt_cpl * 1000 - -# init MPI -include("mpi/mpi_init.jl") - -# init model components -include("atmos/atmos_init.jl") -atmos_sim = atmos_init(FT, Y, spaces, integrator, params = params); - -include("slab/slab_init.jl") -boundary_space = ClimaCore.Fields.level(atmos_sim.domain.center_space, 1) -slab_sim = slab_init(FT, tspan, dt = Δt_cpl, space = boundary_space, saveat = saveat); - -# init boundary fields for regridding (TODO: technically this can be bypassed by directly rigridding on model grids) -T_S = ClimaCore.Fields.zeros(boundary_space) -F_S = ClimaCore.Fields.zeros(boundary_space) - -# init conservation info collector -CS = ConservationCheck([], []) - -# coupling loop -@show "Starting coupling loop" -walltime = @elapsed for t in (tspan[1]:Δt_cpl:tspan[end]) - @show t - - ## Atmos - # calculate surface fluxes for Atmos BCs - T_S .= FT(0) - dummmy_remap!(T_S, slab_sim.integrator.u.T_sfc) - - #atmos_sim.integrator.p.ρ_dif_flux_h_tot .= ClimaCore.Geometry.WVector.(ClimaCore.Fields.zeros(axes(atmos_sim.integrator.p.ρ_dif_flux_h_tot))) - parent(atmos_sim.integrator.p.ρ_dif_flux_h_tot) .= FT(0) - calculate_surface_fluxes_atmos_grid!(atmos_sim.integrator, T_S) - - # run - step!(atmos_sim.integrator, t - atmos_sim.integrator.t, true) # NOTE: use (t - integ_atm.t) here instead of Δt_cpl to avoid accumulating roundoff error in our timestepping. - - ## Slab - # pre: get accumulated flux from atmos - F_S .= ClimaCore.Fields.zeros(boundary_space) - dummmy_remap!(F_S, atmos_sim.integrator.p.ρ_dif_flux_h_tot) - - # save the accumulated flux - slab_F_sfc = slab_sim.integrator.p.F_sfc - @. slab_F_sfc = -F_S - - # run - step!(slab_sim.integrator, t - slab_sim.integrator.t, true) - - # conservation info "callback" - if !is_distributed - check_conservation_callback(CS, atmos_sim, slab_sim) - end - -end -@show walltime - -@show "Postprocessing" -# collect solutions -sol_atm = atmos_sim.integrator.sol -sol_slab = slab_sim.integrator.sol - -include("mpi/mpi_postprocess.jl") - -# conservation check -if !is_distributed || (is_distributed && ClimaComms.iamroot(comms_ctx)) - conservation_plot(atmos_sim, slab_sim, solu_atm, solu_slab, "conservation.png") -end diff --git a/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/conservation_checker.jl b/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/conservation_checker.jl deleted file mode 100644 index a709a81716..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/conservation_checker.jl +++ /dev/null @@ -1,55 +0,0 @@ -# generalise this into coupler-specific function - -abstract type AbstractCheck end - -struct ConservationCheck{A} <: AbstractCheck - ρe_tot_atmos::A - ρe_tot_slab::A -end - -function check_conservation_callback(cs, atmos_sim, slab_sim) - - atmos_sim.domain.center_space.vertical_topology.mesh.domain - Δz_1 = - parent(ClimaCore.Fields.coordinate_field(atmos_sim.domain.face_space).z)[2] - - parent(ClimaCore.Fields.coordinate_field(atmos_sim.domain.face_space).z)[1] - - atmos_field = atmos_sim.integrator.u.c.ρe_tot # J - slab_field = get_slab_energy(slab_sim, slab_sim.integrator.u.T_sfc) ./ Δz_1 # J [NB: sum of the boundary field inherits the depth from the first atmospheric layer, which ≂̸ slab depth] - - ρe_tot_atmos = sum(atmos_field) - ρe_tot_slab = sum(slab_field) - - push!(cs.ρe_tot_atmos, ρe_tot_atmos) - push!(cs.ρe_tot_slab, ρe_tot_slab) -end - -get_slab_energy(slab_sim, T_sfc) = slab_sim.params.ρ .* slab_sim.params.c .* T_sfc .* slab_sim.params.h #[NB: upon initialisation FT(275) was subtracted from T_0] - -using ClimaCorePlots -function plot(CS::ConservationCheck) - diff_ρe_tot_atmos = CS.ρe_tot_atmos .- CS.ρe_tot_atmos[3] - diff_ρe_tot_slab = (CS.ρe_tot_slab .- CS.ρe_tot_slab[3]) - Plots.plot(diff_ρe_tot_atmos, label = "atmos") - Plots.plot!(diff_ρe_tot_slab, label = "slab") - tot = diff_ρe_tot_atmos .+ diff_ρe_tot_slab - Plots.plot!(tot .- tot[1], label = "tot") -end - -function conservation_plot(atmos_sim, slab_sim, solu_atm, solu_slab, figname = "tst_c.png") - - atmos_e = [sum(u.c.ρe_tot) for u in solu_atm] # J - - z = parent(ClimaCore.Fields.coordinate_field(atmos_sim.domain.face_space).z) - Δz_1 = z[2] - z[1] - slab_e = [sum(get_slab_energy(slab_sim, u)) for u in solu_slab] # J [NB: sum of the boundary field inherits the depth from the first atmospheric layer, which ≂̸ slab depth] - - diff_ρe_tot_atmos = atmos_e .- atmos_e[3] - diff_ρe_tot_slab = (slab_e .- slab_e[3]) - Plots.plot(diff_ρe_tot_atmos, label = "atmos") - Plots.plot!(diff_ρe_tot_slab, label = "slab") - tot = diff_ρe_tot_atmos .+ diff_ρe_tot_slab - Plots.plot!(tot .- tot[1], label = "tot", xlabel = "time [s]", ylabel = "energy(t) - energy(t=0) [s]") - Plots.savefig(figname) - -end diff --git a/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/flux_calculator.jl b/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/flux_calculator.jl deleted file mode 100644 index c8ba8888fa..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/flux_calculator.jl +++ /dev/null @@ -1,111 +0,0 @@ -using ClimaCore.Geometry: ⊗ -""" -calculate_surface_fluxes_atmos_grid!(integrator) - -- TODO: generalize interface for regridding and take land state out of atmos's integrator.p -""" -function calculate_surface_fluxes_atmos_grid!(integrator, T_sfc) - p = integrator.p - (; ᶜts, ρ_dif_flux_h_tot, dif_flux_ρq_tot, ρ_dif_flux_uₕ, params, Cd, Ch) = p - - Y = integrator.u - - z0m, z0b = (FT(1e-3), FT(1e-5)) # roughness lengths (TODO: import from land) - # Turbulent surface flux calculation - tsf = - constant_T_saturated_surface_coefs_coupled.( - Spaces.level(ᶜts, 1), - Geometry.UVVector.(Spaces.level(Y.c.uₕ, 1)), - Spaces.level(Fields.coordinate_field(Y.c).z, 1), - FT(0), # TODO: get actual value of z_sfc - Fields.Field(Fields.field_values(T_sfc), axes(Spaces.level(Y.c, 1))), # remove when same instance issue is resolved - params, - z0m, # TODO: get these roughness lengths from land - z0b, - Cd, - Ch, - ) - - # Radiation fluxes - t = integrator.t - Rn = FT(10 * sin(t / 2π * 1000)) # TODO: link to the SW and LW fluxes from atmos - - # Total energy flux - if :ρe in propertynames(Y.c) - @. ρ_dif_flux_h_tot = Geometry.WVector(tsf.shf + tsf.shf + Rn) - end - - # Moisture mass flux - if :ρq_tot in propertynames(Y.c) - @. dif_flux_ρq_tot = Geometry.WVector(tsf.E) - end - - # Momentum flux - - u_space = axes(tsf.ρτxz) # TODO: delete when "space not the same instance" error is dealt with - normal = Geometry.WVector.(ones(u_space)) # TODO: this will need to change for topography - ρ_1 = Fields.Field(Fields.field_values(Fields.level(Y.c.ρ, 1)), u_space) # TODO: delete when "space not the same instance" error is dealt with - if :uₕ in propertynames(Y.c) - parent(ρ_dif_flux_uₕ) .= # TODO: remove parent when "space not the same instance" error is dealt with - parent( - Geometry.Contravariant3Vector.(normal) .⊗ - Geometry.Covariant12Vector.(Geometry.UVVector.(tsf.ρτxz ./ ρ_1, tsf.ρτyz ./ ρ_1)), - ) - end - - return nothing -end - -function variable_T_saturated_surface_coefs(ts_int, uₕ_int, z_int, z_sfc, T_sfc, params, z0m, z0b) # NB: this currently breaks in SF.jl for neutral conditions - - # get the near-surface thermal state - T_int = TD.air_temperature(params, ts_int) - Rm_int = TD.gas_constant_air(params, ts_int) - ρ_sfc = TD.air_density(params, ts_int) * (T_sfc / T_int)^(TD.cv_m(params, ts_int) / Rm_int) # use ideal gas law and hydrostatic balance to extrapolate for surface density - - q_sfc = TD.q_vap_saturation_generic(params, T_sfc, ρ_sfc, TD.Liquid()) # TODO: assumes all surface is water covered. Generalize! - ts_sfc = TD.PhaseEquil_ρTq(params, ρ_sfc, T_sfc, q_sfc) - - # wrap state values - sc = SF.ValuesOnly{FT}(; - state_in = SF.InteriorValues(z_int, (uₕ_int.u, uₕ_int.v), ts_int), - state_sfc = SF.SurfaceValues(z_sfc, (FT(0), FT(0)), ts_sfc), - z0m = z0m, - z0b = z0b, - ) - - # calculate all fluxes - tsf = SF.surface_conditions(params, sc, SF.UniversalFunctions.Businger()) - - _ρ_liq = FT(1e3)# TODO: use CLIMAParameters - E = SF.evaporation(sc, params, tsf.Ch) / _ρ_liq - return (; shf = tsf.shf, lhf = tsf.lhf, E = E, ρτxz = tsf.ρτxz, ρτyz = tsf.ρτyz) -end - -function constant_T_saturated_surface_coefs_coupled(ts_int, uₕ_int, z_int, z_sfc, T_sfc, params, z0m, z0b, Cd, Ch) - - # get the near-surface thermal state - T_int = TD.air_temperature(params, ts_int) - Rm_int = TD.gas_constant_air(params, ts_int) - ρ_sfc = TD.air_density(params, ts_int) * (T_sfc / T_int)^(TD.cv_m(params, ts_int) / Rm_int) # use ideal gas law and hydrostatic balance to extrapolate for surface density - - q_sfc = TD.q_vap_saturation_generic(params, T_sfc, ρ_sfc, TD.Liquid()) # TODO: assumes all surface is water covered. Generalize! - ts_sfc = TD.PhaseEquil_ρTq(params, ρ_sfc, T_sfc, q_sfc) - - # wrap state values - sc = SF.Coefficients{FT}(; - state_in = SF.InteriorValues(z_int, (uₕ_int.u, uₕ_int.v), ts_int), - state_sfc = SF.SurfaceValues(z_sfc, (FT(0), FT(0)), ts_sfc), - z0m = z0m, #FT(1e-3), - z0b = z0b, #FT(1e-5), - Cd = Cd, #FT(0.001), - Ch = Ch, #FT(0.0001), - ) - - # calculate all fluxes - tsf = SF.surface_conditions(params, sc, SF.UniversalFunctions.Businger()) # here can specify tol, maxiter - - _ρ_liq = FT(1e3)# TODO: use CLIMAParameters - E = SF.evaporation(sc, params, tsf.Ch) / _ρ_liq - return (; shf = tsf.shf, lhf = tsf.lhf, E = E, ρτxz = tsf.ρτxz, ρτyz = tsf.ρτyz) -end diff --git a/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/regridder.jl b/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/regridder.jl deleted file mode 100644 index cf885c352c..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/coupler_utils/regridder.jl +++ /dev/null @@ -1,4 +0,0 @@ -# for AMIP we don't need regridding. WHen we do we re-introduce the ClimaCoreTempestRemap -function dummmy_remap!(target, source) # TODO: bring back Tempest regrid - parent(target) .= parent(source) -end diff --git a/experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_init.jl b/experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_init.jl deleted file mode 100644 index 94ef7f6dc3..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_init.jl +++ /dev/null @@ -1,33 +0,0 @@ -import Pkg; -Pkg.add("ClimaComms"); -import Pkg; -Pkg.add("ClimaCommsMPI"); - -using ClimaComms -using ClimaCommsMPI - - -is_distributed = get(ENV, "CLIMACORE_DISTRIBUTED", "") == "MPI" - -using Logging -if is_distributed - using ClimaComms - if ENV["CLIMACORE_DISTRIBUTED"] == "MPI" - using ClimaCommsMPI - const comms_ctx = ClimaCommsMPI.MPICommsContext() - else - error("ENV[\"CLIMACORE_DISTRIBUTED\"] only supports the \"MPI\" option") - end - const pid, nprocs = ClimaComms.init(comms_ctx) - logger_stream = ClimaComms.iamroot(comms_ctx) ? stderr : devnull - prev_logger = global_logger(ConsoleLogger(logger_stream, Logging.Info)) - @info "Setting up distributed run on $nprocs \ - processor$(nprocs == 1 ? "" : "s")" -else - const comms_ctx = nothing - using TerminalLoggers: TerminalLogger - prev_logger = global_logger(TerminalLogger()) -end -atexit() do - global_logger(prev_logger) -end diff --git a/experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_postprocess.jl b/experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_postprocess.jl deleted file mode 100644 index cd39d9a496..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/mpi/mpi_postprocess.jl +++ /dev/null @@ -1,37 +0,0 @@ - -# function mpi_collapse_solu()# (comms_ctx, horizontal_mesh, quad, z_max, z_elem, z_stretch, Y) # TODO: it's using the global scope here -if is_distributed # replace sol.u on the root processor with the global sol.u - - if ClimaComms.iamroot(comms_ctx) - global_h_space = make_horizontal_space(horizontal_mesh, quad, nothing) - global_center_space, global_face_space = make_hybrid_spaces(global_h_space, z_max, z_elem, z_stretch) - global_Y_c_type = Fields.Field{typeof(Fields.field_values(Y.c)), typeof(global_center_space)} - global_Y_f_type = Fields.Field{typeof(Fields.field_values(Y.f)), typeof(global_face_space)} - global_Y_type = Fields.FieldVector{FT, NamedTuple{(:c, :f), Tuple{global_Y_c_type, global_Y_f_type}}} - global_Y_slab_type = - Fields.Field{typeof(Fields.field_values(slab_sim.integrator.u.T_sfc)), typeof(global_h_space)} - global_sol_u_atmos = similar(sol_atm.u, global_Y_type) - global_sol_u_slab = similar(sol_slab.u, global_Y_slab_type) - end - for i in 1:length(sol_atm.u) - global_Y_c = DataLayouts.gather(comms_ctx, Fields.field_values(sol_atm.u[i].c)) - global_Y_f = DataLayouts.gather(comms_ctx, Fields.field_values(sol_atm.u[i].f)) - global_Y_slab = DataLayouts.gather(comms_ctx, Fields.field_values(sol_slab.u[i].T_sfc)) - if ClimaComms.iamroot(comms_ctx) - global_sol_u_atmos[i] = Fields.FieldVector( - c = Fields.Field(global_Y_c, global_center_space), - f = Fields.Field(global_Y_f, global_face_space), - ) - global_sol_u_slab[i] = Fields.Field(global_Y_slab, global_h_space) - end - end - if ClimaComms.iamroot(comms_ctx) - solu_atm = global_sol_u_atmos - solu_slab = global_sol_u_slab - return solu_atm, solu_slab - end -else - solu_atm = sol_atm.u - h_space = make_horizontal_space(horizontal_mesh, quad, nothing) #TODO move this to the beginning (once same the instance error sorted) - solu_slab = Fields.FieldVector(T_sfc = [Fields.Field(Fields.field_values(u.T_sfc), h_space) for u in sol_slab.u]) -end diff --git a/experiments/AMIP/moist_mpi_aquaplanet/sbatch_job.sh b/experiments/AMIP/moist_mpi_aquaplanet/sbatch_job.sh deleted file mode 100644 index 54be68eea3..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/sbatch_job.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - - -#SBATCH --ntasks=2 -#SBATCH --time=10:00:00 # walltime - -set -euo pipefail # kill the job if anything fails -set -x # echo script - -module purge -module load julia/1.8.1 openmpi/4.1.1 hdf5/1.12.1-ompi411 #netcdf-c/4.6.1 - -export JULIA_NUM_THREADS=${SLURM_CPUS_PER_TASK:=1} -export JULIA_MPI_BINARY=system -export JULIA_CUDA_USE_BINARYBUILDER=false - -# run instantiate/precompile serial -julia --project -e 'using Pkg; Pkg.instantiate(); Pkg.build()' - -export CLIMACORE_DISTRIBUTED="MPI" -mpiexec julia --project coupler_driver.jl \ No newline at end of file diff --git a/experiments/AMIP/moist_mpi_aquaplanet/slab/slab_init.jl b/experiments/AMIP/moist_mpi_aquaplanet/slab/slab_init.jl deleted file mode 100644 index 0e97ab2b73..0000000000 --- a/experiments/AMIP/moist_mpi_aquaplanet/slab/slab_init.jl +++ /dev/null @@ -1,83 +0,0 @@ -# slab_rhs! -using ClimaCore - -struct ThermalSlabParameters# <: CLIMAParameters.AbstractEarthParameterSet{F} - h::FT - ρ::FT - c::FT - T_init::FT -end - -# domain -function ShellDomain(; radius = 6371e3, Nel = 8, Nq = 2) - domain = ClimaCore.Domains.SphereDomain(radius) - mesh = ClimaCore.Meshes.EquiangularCubedSphere(domain, Nel) - topology = ClimaCore.Topologies.Topology2D(mesh) - quad = ClimaCore.Spaces.Quadratures.GLL{Nq}() - space = ClimaCore.Spaces.SpectralElementSpace2D(topology, quad) -end - -# init simulation -function slab_space_init(::Type{FT}, space, params) where {FT} - - coords = ClimaCore.Fields.coordinate_field(space) - - # initial condition - T_sfc = map(coords) do coord - T_sfc_0 = params.T_init - anom_ampl = FT(2) - radlat = coord.lat / FT(180) * pi - lat_0 = FT(60) / FT(180) * pi - lon_0 = FT(-90) / FT(180) * pi - radlon = coord.long / FT(180) * pi - stdev = FT(5) / FT(180) * pi - anom = anom_ampl * exp(-((radlat - lat_0)^2 / 2stdev^2 + (radlon - lon_0)^2 / 2stdev^2)) - T_sfc = T_sfc_0 + anom - end - - # prognostic variable - Y = ClimaCore.Fields.FieldVector(T_sfc = T_sfc) - - return Y, space -end - -# ode -function slab_rhs!(dY, Y, Ya, t) - """ - Slab ocean: - ∂_t T_sfc = F_sfc + G - """ - p, F_sfc = Ya - - @. dY.T_sfc = (F_sfc) / (p.h * p.ρ * p.c) -end - -struct SlabSimulation{P, Y, D, I} - params::P - Y_init::Y - domain::D - integrator::I -end - -function slab_init( - ::Type{FT}, - tspan; - stepper = Euler(), - nelements = 6, - npolynomial = 4, - dt = 0.02, - saveat = 1.0e10, - space = nothing, -) where {FT} - - params = ThermalSlabParameters(FT(0.5), FT(1500.0), FT(800.0), FT(281.0)) - - Y, space = slab_space_init(FT, space, params) - Ya = (params = params, F_sfc = ClimaCore.Fields.zeros(space)) #auxiliary - problem = OrdinaryDiffEq.ODEProblem(slab_rhs!, Y, tspan, Ya) - integrator = OrdinaryDiffEq.init(problem, stepper, dt = dt, saveat = saveat) - - SlabSimulation(params, Y, space, integrator) -end - -get_slab_energy(slab_sim, T_sfc) = slab_sim.params.ρ .* slab_sim.params.c .* T_sfc .* slab_sim.params.h diff --git a/experiments/AMIP/moist_mpi_earth/Artifacts.toml b/experiments/AMIP/moist_mpi_earth/Artifacts.toml deleted file mode 100644 index 63237325e2..0000000000 --- a/experiments/AMIP/moist_mpi_earth/Artifacts.toml +++ /dev/null @@ -1,11 +0,0 @@ -[land_mask] -git-tree-sha1 = "e41bc8c44124f867b64a9d70f1599515ae27f38a" - -[sic] -git-tree-sha1 = "139d23f6de29900917d79b41a87a8ee6483c72d0" - -[sst] -git-tree-sha1 = "9969543acd3c9084b8238b7858d0c76aa0bf98a7" - -[test] -git-tree-sha1 = "b377e7c997804b47720b8e7243361d399d108441" diff --git a/experiments/AMIP/moist_mpi_earth/Manifest.toml b/experiments/AMIP/moist_mpi_earth/Manifest.toml deleted file mode 100644 index e679bd4098..0000000000 --- a/experiments/AMIP/moist_mpi_earth/Manifest.toml +++ /dev/null @@ -1,2155 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.8.5" -manifest_format = "2.0" -project_hash = "a874fa1063cb834f5b011dc7074d18e1943122ed" - -[[deps.AMD]] -deps = ["Libdl", "LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "00163dc02b882ca5ec032400b919e5f5011dbd31" -uuid = "14f7f29c-3bd6-536c-9a0b-7339e30b5a3e" -version = "0.5.0" - -[[deps.AbstractFFTs]] -deps = ["ChainRulesCore", "LinearAlgebra"] -git-tree-sha1 = "16b6dbc4cf7caee4e1e75c49485ec67b667098a0" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.3.1" - -[[deps.AbstractTrees]] -git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.4.4" - -[[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "cc37d689f599e8df4f464b2fa3870ff7db7492ef" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "3.6.1" - -[[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.ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.2.0" - -[[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "Requires", "SnoopPrecompile", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "38911c7737e123b28182d89027f4216cfc8a9da7" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.4.3" - -[[deps.ArrayInterfaceCore]] -deps = ["LinearAlgebra", "SnoopPrecompile", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "e5f08b5689b1aad068e01751889f2f615c7db36d" -uuid = "30b0a656-2188-435a-8636-2ec0e6a096e2" -version = "0.1.29" - -[[deps.ArrayLayouts]] -deps = ["FillArrays", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "9439276176565bd55fc982c4bb4e07954d34e26f" -uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "1.0.1" - -[[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"] -git-tree-sha1 = "0d2fe99b3bc12cb4339e20b01755b24036789845" -uuid = "86bc3604-9858-485a-bdbe-831ec50de11d" -version = "0.1.2" - -[[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 = "a598ecb0d717092b5539dbbe890c98bac842b072" -uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" -version = "0.2.0" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[deps.BitFlags]] -git-tree-sha1 = "43b1a4a8f797c1cddadf60499a8a077d4af2cd2d" -uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" -version = "0.1.7" - -[[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 = "c7d7789c2c6ec98ec78ea5e017485549a95b051e" -uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" -version = "0.16.27" - -[[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 = "8e805f83a13d1452e66e8baf04977e0df053238a" -uuid = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" -version = "0.7.3" - -[[deps.CPUSummary]] -deps = ["CpuId", "IfElse", "Static"] -git-tree-sha1 = "2c144ddb46b552f72d7eafe7cc2f50746e41ea21" -uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.2.2" - -[[deps.CUDA]] -deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CompilerSupportLibraries_jll", "ExprTools", "GPUArrays", "GPUCompiler", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "SpecialFunctions", "TimerOutputs"] -git-tree-sha1 = "6717cb9a3425ebb7b31ca4f832823615d175f64a" -uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "3.13.1" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.16.1+1" - -[[deps.Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[deps.CatIndices]] -deps = ["CustomUnitRanges", "OffsetArrays"] -git-tree-sha1 = "a0f80a09780eed9b1d106a1bf62041c2efc995bc" -uuid = "aafaddc9-749c-510e-ac4f-586e18779b91" -version = "0.2.2" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c6d890a52d2c4d55d326439580c3b8d0875a77d9" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.15.7" - -[[deps.ChangesOfVariables]] -deps = ["ChainRulesCore", "LinearAlgebra", "Test"] -git-tree-sha1 = "485193efd2176b88e6622a39a246f8c5b600e74e" -uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" -version = "0.1.6" - -[[deps.ClimaAtmos]] -deps = ["ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "CLIMAParameters", "ClimaComms", "ClimaCore", "ClimaCorePlots", "ClimaCoreVTK", "ClimaTimeSteppers", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "Distributions", "DocStringExtensions", "FastGaussQuadrature", "ImageFiltering", "Insolation", "Interpolations", "IntervalSets", "JLD2", "LambertW", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "OrdinaryDiffEq", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "StaticArrays", "StatsBase", "SurfaceFluxes", "TerminalLoggers", "Test", "Thermodynamics", "YAML"] -git-tree-sha1 = "2f7d43083d6f992d907912bede85652b86477621" -uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717" -version = "0.11.0" - -[[deps.ClimaComms]] -deps = ["CUDA", "StaticArrays"] -git-tree-sha1 = "9ff213f7a254765541af0f56dc246b00fd6b94dc" -uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" -version = "0.3.5" - -[[deps.ClimaCommsMPI]] -deps = ["ClimaComms", "MPI"] -git-tree-sha1 = "8b921fe1f971bbfbc1b70cb3a2dc1588259c26c8" -uuid = "5f86816e-8b66-43b2-912e-75384f99de49" -version = "0.3.9" - -[[deps.ClimaCore]] -deps = ["Adapt", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DiffEqBase", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "LinearAlgebra", "PkgVersion", "RecursiveArrayTools", "RootSolvers", "Rotations", "SparseArrays", "Static", "StaticArrays", "Statistics", "UnPack"] -git-tree-sha1 = "6363157e662e549909c8e6dcd36b5084c088af8a" -uuid = "d414da3d-4745-48bb-8d80-42e94e092884" -version = "0.10.32" - -[[deps.ClimaCorePlots]] -deps = ["ClimaCore", "RecipesBase", "StaticArrays", "TriplotBase"] -git-tree-sha1 = "2fb63d2573c4ba4aff1ed7829a6c91032be5d488" -uuid = "cf7c7e5a-b407-4c48-9047-11a94a308626" -version = "0.2.4" - -[[deps.ClimaCoreTempestRemap]] -deps = ["ClimaComms", "ClimaCore", "Dates", "LinearAlgebra", "NCDatasets", "PkgVersion", "TempestRemap_jll", "Test"] -git-tree-sha1 = "a327551f5b0d1246beced6dd4f5d19dc31c0d71b" -uuid = "d934ef94-cdd4-4710-83d6-720549644b70" -version = "0.3.7" - -[[deps.ClimaCoreVTK]] -deps = ["ClimaCore", "WriteVTK"] -git-tree-sha1 = "2a0f6f12ccdf50089e708b68e73b1fe08fb53cd8" -uuid = "c8b6d40d-e815-466f-95ae-c48aefa668fa" -version = "0.7.1" - -[[deps.ClimaCoupler]] -deps = ["ClimaAtmos", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "ClimaLSM", "Dates", "DocStringExtensions", "JLD2", "NCDatasets", "OrdinaryDiffEq", "Plots", "PrettyTables", "SciMLBase", "Statistics", "TempestRemap_jll", "TerminalLoggers", "UnPack"] -path = "../../.." -uuid = "4ade58fe-a8da-486c-bd89-46df092ec0c7" -version = "0.1.0" - -[[deps.ClimaLSM]] -deps = ["ArtifactWrappers", "CLIMAParameters", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "Dates", "DocStringExtensions", "Insolation", "IntervalSets", "JLD2", "NCDatasets", "StaticArrays", "SurfaceFluxes", "Thermodynamics", "UnPack"] -git-tree-sha1 = "81d9070c7551b268cedebc7a070e55ee95796f27" -repo-rev = "main" -repo-url = "https://github.com/CliMA/ClimaLSM.jl.git" -uuid = "7884a58f-fab6-4fd0-82bb-ecfedb2d8430" -version = "0.2.3" - -[[deps.ClimaTimeSteppers]] -deps = ["CUDA", "ClimaComms", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "KernelAbstractions", "Krylov", "LinearAlgebra", "LinearOperators", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "7f4eb7c7b173e09c8a907a9b9891bf8992a66162" -uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79" -version = "0.7.4" - -[[deps.CloseOpenIntervals]] -deps = ["Static", "StaticArrayInterface"] -git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" -uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.12" - -[[deps.CloudMicrophysics]] -deps = ["DocStringExtensions", "SpecialFunctions", "Thermodynamics"] -git-tree-sha1 = "8e98d1f3ffb1e2171bf472afcedfd77f74e85026" -uuid = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" -version = "0.10.3" - -[[deps.CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "9c209fb7536406834aa938fb149964b985de6c83" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.1" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "be6ab11021cd29f0344d5c4357b163af05a48cba" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.21.0" - -[[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", "SpecialFunctions", "Statistics", "TensorCore"] -git-tree-sha1 = "600cc5508d66b78aae350f7accdb58763ac18589" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.9.10" - -[[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 = "60ccfcd76179c96ca21d3b5a5ae04d7b6a7439e7" -uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" -version = "0.2.2" - -[[deps.CommonSolve]] -git-tree-sha1 = "9441451ee712d1aec22edad62db1a9af3dc8d852" -uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.3" - -[[deps.CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[deps.Compat]] -deps = ["Dates", "LinearAlgebra", "UUIDs"] -git-tree-sha1 = "7a60c856b9fa189eb34f5f8a6f6b5529b7942957" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.6.1" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.1+0" - -[[deps.ComputationalResources]] -git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" -uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" -version = "0.3.2" - -[[deps.ConcurrentUtilities]] -deps = ["Serialization", "Sockets"] -git-tree-sha1 = "b306df2650947e9eb100ec125ff8c65ca2053d30" -uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.1.1" - -[[deps.ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "89a9db8d28102b094992472d333674bd1a83ce2a" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.1" - -[[deps.Contour]] -git-tree-sha1 = "d05d9e7b7aedff4e5b51a029dced05cfb6125781" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.2" - -[[deps.CpuId]] -deps = ["Markdown"] -git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" -uuid = "adafc99b-e345-5852-983c-f28acb93d879" -version = "0.3.1" - -[[deps.Crayons]] -git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" -uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" -version = "4.1.1" - -[[deps.CubedSphere]] -deps = ["Elliptic", "FFTW", "Printf", "ProgressBars", "SpecialFunctions", "TaylorSeries", "Test"] -git-tree-sha1 = "db9c12cb765cc048e158987388287c52baddf57d" -uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" -version = "0.2.2" - -[[deps.CustomUnitRanges]] -git-tree-sha1 = "1a3f97f907e6dd8983b744d2642651bb162a3f7a" -uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" -version = "1.0.2" - -[[deps.DataAPI]] -git-tree-sha1 = "e8119c1a33d267e16108be441a287a6981ba1630" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.14.0" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "d1fff3a548102f48987a52a2e0d114fa97d730f0" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.13" - -[[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"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[deps.DensityInterface]] -deps = ["InverseFunctions", "Test"] -git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" -uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" -version = "0.4.0" - -[[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", "Distributions", "DocStringExtensions", "EnumX", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PreallocationTools", "Printf", "RecursiveArrayTools", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "Static", "StaticArraysCore", "Statistics", "Tricks", "TruncatedStacktraces", "ZygoteRules"] -git-tree-sha1 = "988bbd7283aaee5c34cd3cc09e78e7c45a931c5b" -uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" -version = "6.123.0" - -[[deps.DiffEqCallbacks]] -deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] -git-tree-sha1 = "63b6be7b396ad395825f3cc48c56b53bfaf7e69d" -uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" -version = "2.26.1" - -[[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 = "a4ad7ef19d2cdc2eff57abbbe68032b1cd0bd8f8" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.13.0" - -[[deps.Distances]] -deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "49eba9ad9f7ead780bfb7ee319f962c811c6d3b2" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.8" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[deps.Distributions]] -deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] -git-tree-sha1 = "13027f188d26206b9e7b863036f87d2f2e7d013a" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.87" - -[[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.EnumX]] -git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" -uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.4" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.4.8+0" - -[[deps.ExponentialUtilities]] -deps = ["Adapt", "ArrayInterface", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "Printf", "SnoopPrecompile", "SparseArrays", "libblastrampoline_jll"] -git-tree-sha1 = "fb7dbef7d2631e2d02c49e2750f7447648b0ec9b" -uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" -version = "1.24.0" - -[[deps.ExprTools]] -git-tree-sha1 = "c1d06d129da9f55715c6c212866f5b1bddc5fa00" -uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.9" - -[[deps.FFMPEG]] -deps = ["FFMPEG_jll"] -git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" -uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.1" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.2+2" - -[[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 = "f9818144ce7c8c41edf5c4c179c684d92aa4d9fe" -uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.6.0" - -[[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 = "d1248fceea0b26493fd33e8e9e8c553270da03bd" -uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" -version = "0.2.5" - -[[deps.FastClosures]] -git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" -uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" -version = "0.3.2" - -[[deps.FastGaussQuadrature]] -deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "0f478d8bad6f52573fb7658a263af61f3d96e43a" -uuid = "442a2c76-b920-505d-bb47-c5924d526838" -version = "0.5.1" - -[[deps.FastLapackInterface]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "c1293a93193f0ae94be7cf338d33e162c39d8788" -uuid = "29a986be-02c6-4525-aec4-84b980013641" -version = "1.2.9" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "7be5f99f7d15578798f338f5433b6c432ea8037b" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.16.0" - -[[deps.FileWatching]] -uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" - -[[deps.FillArrays]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] -git-tree-sha1 = "fc86b4fd3eff76c3ce4f5e96e2fdfa6282722885" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.0.0" - -[[deps.FiniteDiff]] -deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays", "StaticArrays"] -git-tree-sha1 = "03fcb1c42ec905d15b305359603888ec3e65f886" -uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.19.0" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.93+0" - -[[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", "StaticArrays"] -git-tree-sha1 = "00e252f4d706b3d55a8863432e742bf5717b498d" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.35" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.10.4+0" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.10+0" - -[[deps.FunctionWrappers]] -git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" -uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" -version = "1.1.3" - -[[deps.FunctionWrappersWrappers]] -deps = ["FunctionWrappers"] -git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" -uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" -version = "0.1.3" - -[[deps.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] -git-tree-sha1 = "d972031d28c8c8d9d7b41a536ad7bb0c2579caca" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.3.8+0" - -[[deps.GPUArrays]] -deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] -git-tree-sha1 = "9ade6983c3dbbd492cf5729f865fe030d1541463" -uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "8.6.6" - -[[deps.GPUArraysCore]] -deps = ["Adapt"] -git-tree-sha1 = "1cd7f0af1aa58abc02ea1d872953a97359cb87fa" -uuid = "46192b85-c4d5-4398-a991-12ede77f4527" -version = "0.1.4" - -[[deps.GPUCompiler]] -deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "19d693666a304e8c371798f4900f7435558c7cde" -uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.17.3" - -[[deps.GR]] -deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "UUIDs", "p7zip_jll"] -git-tree-sha1 = "4423d87dc2d3201f3f1768a29e807ddc8cc867ef" -uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.71.8" - -[[deps.GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "3657eb348d44575cc5560c80d7e55b812ff6ffe1" -uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.71.8+0" - -[[deps.GaussQuadrature]] -deps = ["SpecialFunctions"] -git-tree-sha1 = "eb6f1f48aa994f3018cbd029a17863c6535a266d" -uuid = "d54b0c1a-921d-58e0-8e36-89d8069c0969" -version = "0.5.8" - -[[deps.GenericSchur]] -deps = ["LinearAlgebra", "Printf"] -git-tree-sha1 = "fb69b2a645fa69ba5f474af09221b9308b160ce6" -uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" -version = "0.5.3" - -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" - -[[deps.GilbertCurves]] -git-tree-sha1 = "3e076ca96e34a47e98a46657b2bec2655a366d80" -uuid = "88fa7841-ef32-4516-bb70-c6ec135699d9" -version = "0.1.0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "d3b3624125c1474292d0d8ed0f65554ac37ddb23" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.74.0+2" - -[[deps.Glob]] -git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" -uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" -version = "1.3.1" - -[[deps.Graphics]] -deps = ["Colors", "LinearAlgebra", "NaNMath"] -git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" -uuid = "a2bd30eb-e257-5431-a919-1863eab51364" -version = "1.1.2" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.14+0" - -[[deps.Graphs]] -deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "1cf1d7dcb4bc32d7b4a5add4232db3750c27ecb4" -uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.8.0" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HDF5]] -deps = ["Compat", "HDF5_jll", "Libdl", "Mmap", "Random", "Requires", "UUIDs"] -git-tree-sha1 = "3dab31542b3da9f25a6a1d11159d4af8fdce7d67" -uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -version = "0.16.14" - -[[deps.HDF5_jll]] -deps = ["Artifacts", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "4cc2bb72df6ff40b055295fdef6d92955f9dede8" -uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.12.2+2" - -[[deps.HTTP]] -deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "69182f9a2d6add3736b7a06ab6416aafdeec2196" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.8.0" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] -git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "2.8.1+1" - -[[deps.HostCPUFeatures]] -deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "734fd90dd2f920a2f1921d5388dcebe805b262dc" -uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.14" - -[[deps.HypergeometricFunctions]] -deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "432b5b03176f8182bd6841fbfc42c718506a2d5f" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.15" - -[[deps.IfElse]] -git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" -uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" -version = "0.1.1" - -[[deps.ImageBase]] -deps = ["ImageCore", "Reexport"] -git-tree-sha1 = "b51bb8cae22c66d0f6357e3bcb6363145ef20835" -uuid = "c817782e-172a-44cc-b673-b171935fbb9e" -version = "0.1.5" - -[[deps.ImageCore]] -deps = ["AbstractFFTs", "ColorVectorSpace", "Colors", "FixedPointNumbers", "Graphics", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "Reexport"] -git-tree-sha1 = "acf614720ef026d38400b3817614c45882d75500" -uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.9.4" - -[[deps.ImageFiltering]] -deps = ["CatIndices", "ComputationalResources", "DataStructures", "FFTViews", "FFTW", "ImageBase", "ImageCore", "LinearAlgebra", "OffsetArrays", "Reexport", "SnoopPrecompile", "SparseArrays", "StaticArrays", "Statistics", "TiledIteration"] -git-tree-sha1 = "f265e53558fbbf23e0d54e4fab7106c0f2a9e576" -uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" -version = "0.7.3" - -[[deps.Inflate]] -git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.3" - -[[deps.Insolation]] -deps = ["Dates", "DelimitedFiles", "Interpolations"] -git-tree-sha1 = "8a290dcb1c19819975994c19263749df488158bb" -uuid = "e98cc03f-d57e-4e3c-b70c-8d51efe9e0d8" -version = "0.3.1" - -[[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0cb9352ef2e01574eeebdb102948a58740dcaf83" -uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2023.1.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", "Statistics"] -git-tree-sha1 = "16c0cc91853084cb5f58a78bd209513900206ce6" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.4" - -[[deps.InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "49510dfcb407e572524ba94aeae2fced1f3feb0f" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.8" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.2" - -[[deps.IterativeSolvers]] -deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] -git-tree-sha1 = "1169632f425f79429f245113b775a0e3d121457c" -uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" -version = "0.9.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", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] -git-tree-sha1 = "42c17b18ced77ff0be65957a591d34f4ed57c631" -uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.4.31" - -[[deps.JLFzf]] -deps = ["Pipe", "REPL", "Random", "fzf_jll"] -git-tree-sha1 = "f377670cda23b6b7c1c0b3893e37451c5c1a2185" -uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" -version = "0.1.5" - -[[deps.JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.4.1" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6f2675ef130a300a112286de91973805fcc5ffbc" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "2.1.91+0" - -[[deps.JuliaNVTXCallbacks_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "af433a10f3942e882d3c671aacb203e006a5808f" -uuid = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e" -version = "0.2.1+0" - -[[deps.KLU]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] -git-tree-sha1 = "764164ed65c30738750965d55652db9c94c59bfe" -uuid = "ef3ab10e-7fda-4108-b977-705223b18434" -version = "0.4.0" - -[[deps.KernelAbstractions]] -deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] -git-tree-sha1 = "cf9cae1c4c1ff83f6c02cfaf01698f05448e8325" -uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.8.6" - -[[deps.Krylov]] -deps = ["LinearAlgebra", "Printf", "SparseArrays"] -git-tree-sha1 = "dd90aacbfb622f898a97c2a4411ac49101ebab8a" -uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" -version = "0.9.0" - -[[deps.KrylovKit]] -deps = ["ChainRulesCore", "GPUArraysCore", "LinearAlgebra", "Printf"] -git-tree-sha1 = "1a5e1d9941c783b0119897d29f2eb665d876ecf3" -uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" -version = "0.6.0" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.1+0" - -[[deps.LDLFactorizations]] -deps = ["AMD", "LinearAlgebra", "SparseArrays", "Test"] -git-tree-sha1 = "cbf4b646f82bfc58bb48bcca9dcce2eb88da4cd1" -uuid = "40e66cde-538c-5869-a4ad-c39174c6795b" -version = "0.10.0" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "3.0.0+1" - -[[deps.LLVM]] -deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] -git-tree-sha1 = "f044a2796a9e18e0531b9b3072b0019a61f264bc" -uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "4.17.1" - -[[deps.LLVMExtra_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "070e4b5b65827f82c16ae0916376cb47377aa1b5" -uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.18+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.1+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.0" - -[[deps.LambertW]] -git-tree-sha1 = "c5ffc834de5d61d00d2b0e18c96267cffc21f648" -uuid = "984bce1d-4616-540c-a9ee-88d1112d94c9" -version = "0.4.6" - -[[deps.Latexify]] -deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Printf", "Requires"] -git-tree-sha1 = "98dc144f1e0b299d49e8d23e56ad68d3e4f340a5" -uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.15.20" - -[[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.LeftChildRightSiblingTrees]] -deps = ["AbstractTrees"] -git-tree-sha1 = "fb6803dafae4a5d62ea5cab204b1e657d9737e7f" -uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" -version = "0.2.0" - -[[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.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.2+1" - -[[deps.Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] -git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.7+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.6.0+0" - -[[deps.Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.42.0+0" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c7cb1f5d892775ba13767a87c7ada0b980ea0a71" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.16.1+2" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.35.0+0" - -[[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "3eb79b0ca5764d4799c06699573fd8f533259713" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.4.0+0" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.36.0+0" - -[[deps.LightXML]] -deps = ["Libdl", "XML2_jll"] -git-tree-sha1 = "e129d9391168c677cd4800f5c0abb1ed8cb3794f" -uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" -version = "0.9.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", "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.LinearSolve]] -deps = ["ArrayInterface", "DocStringExtensions", "EnumX", "FastLapackInterface", "GPUArraysCore", "IterativeSolvers", "KLU", "Krylov", "KrylovKit", "LinearAlgebra", "Preferences", "RecursiveFactorization", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "SnoopPrecompile", "SparseArrays", "Sparspak", "SuiteSparse", "UnPack"] -git-tree-sha1 = "4a4f8cc7a59fadbb02d1852d1e0cef5dca3a9460" -uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" -version = "1.42.0" - -[[deps.LogExpFunctions]] -deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "0a1b7c2863e44523180fdb3146534e265a91870b" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.23" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[deps.LoggingExtras]] -deps = ["Dates", "Logging"] -git-tree-sha1 = "cedb76b37bc5a6c702ade66be44f831fa23c681e" -uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.0.0" - -[[deps.LoopVectorization]] -deps = ["ArrayInterface", "ArrayInterfaceCore", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "DocStringExtensions", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "SIMDTypes", "SLEEFPirates", "SnoopPrecompile", "SpecialFunctions", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] -git-tree-sha1 = "defbfba8ddbccdc8ca3edb4a96a6d6fd3cd33ebd" -uuid = "bdcacae8-1622-11e9-2a5c-532679323890" -version = "0.12.157" - -[[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", "Requires", "Serialization", "Sockets"] -git-tree-sha1 = "6d72bafd3960f9c119ceb8f034fef28346490fe5" -uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" -version = "0.20.8" - -[[deps.MPICH_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "d790fbd913f85e8865c55bf4725aff197c5155c8" -uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.1.1+1" - -[[deps.MPIPreferences]] -deps = ["Libdl", "Preferences"] -git-tree-sha1 = "71f937129731a29eabe6969db2c90368a4408933" -uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.7" - -[[deps.MPItrampoline_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "b3dcf8e1c610a10458df3c62038c8cc3a4d6291d" -uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.3.0+0" - -[[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "42324d08725e200c23d4dfb549e0d5d89dede2d2" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.10" - -[[deps.ManualMemory]] -git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" -uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" -version = "0.1.8" - -[[deps.MappedArrays]] -git-tree-sha1 = "e8b359ef06ec72e8c030463fe02efe5527ee5142" -uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.1" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "Random", "Sockets"] -git-tree-sha1 = "03a9b9718f5682ecb107ac9f7308991db4ce395b" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.7" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.0+0" - -[[deps.Measures]] -git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" -uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.2" - -[[deps.MicrosoftMPI_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "a8027af3d1743b3bfae34e54872359fdebb31422" -uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" -version = "10.1.3+4" - -[[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.2.1" - -[[deps.MuladdMacro]] -git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" -uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" -version = "0.2.4" - -[[deps.NCDatasets]] -deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "NetCDF_jll", "NetworkOptions", "Printf"] -git-tree-sha1 = "afd015e81e60cfbdba04ef59bcdc80e18bd613cd" -uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -version = "0.12.14" - -[[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 = "c1bfdab07fa259baa4604a05862c43004dd3cd45" -uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" -version = "0.3.1" - -[[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_jll]] -deps = ["Artifacts", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Pkg", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "072f8371f74c3b9e1b26679de7fbf059d45ea221" -uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" -version = "400.902.5+1" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" - -[[deps.NonlinearSolve]] -deps = ["ArrayInterface", "DiffEqBase", "EnumX", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SnoopPrecompile", "SparseArrays", "SparseDiffTools", "StaticArraysCore", "UnPack"] -git-tree-sha1 = "a6000c813371cd3cd9cbbdf8a356fc3a97138d92" -uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" -version = "1.6.0" - -[[deps.OffsetArrays]] -deps = ["Adapt"] -git-tree-sha1 = "82d7c9e310fe55aa54996e6f7f94674e2a38fcb4" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.12.9" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" - -[[deps.OpenBLAS32_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9c6c2ed4b7acd2137b878eb96c68e63b76199d0f" -uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2" -version = "0.3.17+0" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.20+0" - -[[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 = "f3080f4212a8ba2ceb10a34b938601b862094314" -uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "4.1.5+0" - -[[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "7fb975217aea8f1bb360cf1dde70bad2530622d2" -uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.4.0" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9ff31d101d987eb9d66bd8b176ac7c277beccd09" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "1.1.20+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.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "d321bf2de576bf25ec4d3e4360faca399afca282" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.6.0" - -[[deps.OrdinaryDiffEq]] -deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "IfElse", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "NonlinearSolve", "Polyester", "PreallocationTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLNLSolve", "SimpleNonlinearSolve", "SimpleUnPack", "SnoopPrecompile", "SparseArrays", "SparseDiffTools", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] -git-tree-sha1 = "b639e192c0422c849aeda7240382375961d0cb4b" -uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -version = "6.50.0" - -[[deps.PCRE2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.40.0+0" - -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "67eae2738d63117a196f497d7db789821bce61d1" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.17" - -[[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", "SnoopPrecompile"] -git-tree-sha1 = "478ac6c952fddd4399e71d4779797c538d0ff2bf" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.5.8" - -[[deps.Pipe]] -git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" -uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" -version = "1.3.0" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.40.1+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.8.0" - -[[deps.PkgVersion]] -deps = ["Pkg"] -git-tree-sha1 = "192aa02cc47f6566c7a1a8907dee76f6eb0a7c90" -uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" -version = "0.2.1" - -[[deps.PlotThemes]] -deps = ["PlotUtils", "Statistics"] -git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" -uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "3.1.0" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "f92e1315dadf8c46561fb9396e525f7200cdc227" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.3.5" - -[[deps.Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Preferences", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SnoopPrecompile", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] -git-tree-sha1 = "5434b0ee344eaf2854de251f326df8720f6a7b55" -uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.38.10" - -[[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "0fe4e7c4d8ff4c70bfa507f0dd96fa161b115777" -uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.3" - -[[deps.PolyesterWeave]] -deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" -uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.2.1" - -[[deps.PreallocationTools]] -deps = ["Adapt", "ArrayInterface", "ForwardDiff", "Requires"] -git-tree-sha1 = "f739b1b3cc7b9949af3b35089931f2b58c289163" -uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" -version = "0.4.12" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "2e47054ffe7d0a8872e977c0d09eb4b3d162ebde" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.0.2" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.3.0" - -[[deps.PrettyTables]] -deps = ["Crayons", "Formatting", "LaTeXStrings", "Markdown", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "548793c7859e28ef026dba514752275ee871169f" -uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "2.2.3" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.ProgressBars]] -deps = ["Printf"] -git-tree-sha1 = "9d84c8646109eb8bc7a006d59b157c64d5155c81" -uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" -version = "1.5.0" - -[[deps.ProgressLogging]] -deps = ["Logging", "SHA", "UUIDs"] -git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" -uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -version = "0.1.4" - -[[deps.Qt5Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] -git-tree-sha1 = "0c03844e2231e12fda4d0086fd7cbe4098ee8dc5" -uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" -version = "5.15.3+2" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "6ec7ac8412e83d57e313393220879ede1740f9ee" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.8.2" - -[[deps.Quaternions]] -deps = ["LinearAlgebra", "Random", "RealDot"] -git-tree-sha1 = "da095158bdc8eaccb7890f9884048555ab771019" -uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" -version = "0.7.4" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[deps.RRTMGP]] -deps = ["Adapt", "CUDA", "DocStringExtensions", "GaussQuadrature", "Random", "StaticArrays"] -git-tree-sha1 = "77eb1a6a290bb58e49b3b0cb3638e951ca27e367" -uuid = "a01a1ee8-cea4-48fc-987c-fc7878d79da1" -version = "0.8.0" - -[[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 = "6d7bb727e76147ba18eed998700998e17b8e4911" -uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" -version = "0.4.4" - -[[deps.RealDot]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" -uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" -version = "0.1.0" - -[[deps.RecipesBase]] -deps = ["PrecompileTools"] -git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.3.4" - -[[deps.RecipesPipeline]] -deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] -git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" -uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.6.12" - -[[deps.RecursiveArrayTools]] -deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "Requires", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] -git-tree-sha1 = "68078e9fa9130a6a768815c48002d0921a232c11" -uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "2.38.4" - -[[deps.RecursiveFactorization]] -deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "SnoopPrecompile", "StrideArraysCore", "TriangularSolve"] -git-tree-sha1 = "9088515ad915c99026beb5436d0a09cd8c18163e" -uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" -version = "0.2.18" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.0" - -[[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 = ["DocStringExtensions", "ForwardDiff"] -git-tree-sha1 = "9fb3462240d2898be5d4acf8925e47f70ec64d07" -uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" -version = "0.3.5" - -[[deps.Rotations]] -deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays", "Statistics"] -git-tree-sha1 = "72a6abdcd088764878b473102df7c09bbc0548de" -uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.4.0" - -[[deps.RuntimeGeneratedFunctions]] -deps = ["ExprTools", "SHA", "Serialization"] -git-tree-sha1 = "f139e81a81e6c29c40f1971c9e5309b09c03f2c3" -uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" -version = "0.5.6" - -[[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.SLEEFPirates]] -deps = ["IfElse", "Static", "VectorizationBase"] -git-tree-sha1 = "cda0aece8080e992f6370491b08ef3909d1c04e7" -uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" -version = "0.6.38" - -[[deps.SciMLBase]] -deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Preferences", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SnoopPrecompile", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables", "TruncatedStacktraces"] -git-tree-sha1 = "392d3e28b05984496af37100ded94dc46fa6c8de" -uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "1.91.7" - -[[deps.SciMLNLSolve]] -deps = ["DiffEqBase", "LineSearches", "NLsolve", "Reexport", "SciMLBase"] -git-tree-sha1 = "2e1606c282fae6bd9aed4f159695774a44b9c75f" -uuid = "e9a6253c-8580-4d32-9898-8661bb511710" -version = "0.1.4" - -[[deps.SciMLOperators]] -deps = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"] -git-tree-sha1 = "e61e48ef909375203092a6e83508c8416df55a83" -uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" -version = "0.2.0" - -[[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.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SimpleBufferStream]] -git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" -uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.1.0" - -[[deps.SimpleNonlinearSolve]] -deps = ["ArrayInterface", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "Reexport", "Requires", "SciMLBase", "SnoopPrecompile", "StaticArraysCore"] -git-tree-sha1 = "54c78ac3cc0343a16785adabe5bbf4063c737967" -uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" -version = "0.1.14" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" - -[[deps.SimpleUnPack]] -git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" -uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" -version = "1.1.0" - -[[deps.SnoopPrecompile]] -deps = ["Preferences"] -git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" -uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" -version = "1.0.3" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "a4ada03f999bd01b3a25dcaa30b2d929fe537e00" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.1.0" - -[[deps.SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[deps.SparseDiffTools]] -deps = ["Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"] -git-tree-sha1 = "e19ac47477c9a8fcca06dab5e5471417d5d9d723" -uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" -version = "1.31.0" - -[[deps.Sparspak]] -deps = ["Libdl", "LinearAlgebra", "Logging", "OffsetArrays", "Printf", "SparseArrays", "Test"] -git-tree-sha1 = "342cf4b449c299d8d1ceaf00b7a49f4fbc7940e7" -uuid = "e56a9233-b9d6-4f03-8d0f-1825330902ac" -version = "0.3.9" - -[[deps.SpecialFunctions]] -deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "ef28127915f4229c971eb43f3fc075dd3fe91880" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.2.0" - -[[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 = "08be5ee09a7632c32695d954a602df96a877bf0d" -uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.8.6" - -[[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "Requires", "SnoopPrecompile", "SparseArrays", "Static", "SuiteSparse"] -git-tree-sha1 = "33040351d2403b84afce74dae2e22d3f5b18edcb" -uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.4.0" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "Random", "StaticArraysCore", "Statistics"] -git-tree-sha1 = "fd9a77cfd87116a27b2121c1988045f428b35a36" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.5.22" - -[[deps.StaticArraysCore]] -git-tree-sha1 = "6b7ba252635a5eff6a0b0664a41ee140a1c9e72a" -uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.0" - -[[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "45a7769a04a3cf80da1c1c7c60caf932e6f4c9f7" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.6.0" - -[[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.33.21" - -[[deps.StatsFuns]] -deps = ["ChainRulesCore", "HypergeometricFunctions", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "f625d686d5a88bcd2b15cd81f18f98186fdc0c9a" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.3.0" - -[[deps.StrideArraysCore]] -deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] -git-tree-sha1 = "b3e9c174a9df77ed7b66fc0aa605def3351a0653" -uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.4.13" - -[[deps.StringEncodings]] -deps = ["Libiconv_jll"] -git-tree-sha1 = "33c0da881af3248dafefb939a21694b97cfece76" -uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" -version = "0.3.6" - -[[deps.StringManipulation]] -git-tree-sha1 = "46da2434b41f41ac3594ee9816ce5541c6096123" -uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.3.0" - -[[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+0" - -[[deps.SurfaceFluxes]] -deps = ["DocStringExtensions", "KernelAbstractions", "RootSolvers", "StaticArrays", "Thermodynamics"] -git-tree-sha1 = "3ea39309416c87d7e3479c31426024c173a37a19" -uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" -version = "0.6.2" - -[[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.0" - -[[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", "Test"] -git-tree-sha1 = "1544b926975372da01227b382066ab70e574a3ec" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.10.1" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.1" - -[[deps.TaylorSeries]] -deps = ["LinearAlgebra", "Markdown", "Requires", "SparseArrays"] -git-tree-sha1 = "87baeec9ad6273ed8040a93fbbbaa039fa955f1f" -uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" -version = "0.12.2" - -[[deps.TempestRemap_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "NetCDF_jll", "OpenBLAS32_jll", "Pkg"] -git-tree-sha1 = "88c3818a492ad1a94b1aa440b01eab5d133209ff" -uuid = "8573a8c5-1df0-515e-a024-abad257ee284" -version = "2.1.6+1" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.TerminalLoggers]] -deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] -git-tree-sha1 = "f133fab380933d042f6796eda4e130272ba520ca" -uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -version = "0.1.7" - -[[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 = "dd055cd2ef16f8d373a7dc833f4ddf72165524c5" -uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" -version = "0.10.2" - -[[deps.ThreadingUtilities]] -deps = ["ManualMemory"] -git-tree-sha1 = "c97f60dd4f2331e1a495527f80d242501d2f9865" -uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" -version = "0.5.1" - -[[deps.TiledIteration]] -deps = ["OffsetArrays"] -git-tree-sha1 = "5683455224ba92ef59db72d10690690f4a8dc297" -uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" -version = "0.3.1" - -[[deps.TimerOutputs]] -deps = ["ExprTools", "Printf"] -git-tree-sha1 = "f548a9e9c490030e545f72074a41edfd0e5bcdd7" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.23" - -[[deps.TranscodingStreams]] -deps = ["Random", "Test"] -git-tree-sha1 = "0b829474fed270a4b0ab07117dce9b9a2fa7581a" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.9.12" - -[[deps.TriangularSolve]] -deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "Static", "VectorizationBase"] -git-tree-sha1 = "31eedbc0b6d07c08a700e26d31298ac27ef330eb" -uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" -version = "0.1.19" - -[[deps.Tricks]] -git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" -uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" -version = "0.1.7" - -[[deps.TriplotBase]] -git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" -uuid = "981d1d27-644d-49a2-9326-4793e63143c3" -version = "0.1.0" - -[[deps.TruncatedStacktraces]] -deps = ["InteractiveUtils", "MacroTools", "Preferences"] -git-tree-sha1 = "7bc1632a4eafbe9bd94cf1a784a9a4eb5e040a91" -uuid = "781d530d-4396-4725-bb49-402e4bee1e77" -version = "1.3.0" - -[[deps.URIs]] -git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.4.2" - -[[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.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.UnsafeAtomics]] -git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" -uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" -version = "0.2.1" - -[[deps.UnsafeAtomicsLLVM]] -deps = ["LLVM", "UnsafeAtomics"] -git-tree-sha1 = "ead6292c02aab389cb29fe64cc9375765ab1e219" -uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" -version = "0.1.1" - -[[deps.Unzip]] -git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" -uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" -version = "0.2.0" - -[[deps.VTKBase]] -git-tree-sha1 = "c2d0db3ef09f1942d08ea455a9e252594be5f3b6" -uuid = "4004b06d-e244-455f-a6ce-a5f9919cc534" -version = "1.0.1" - -[[deps.VectorizationBase]] -deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "b182207d4af54ac64cbc71797765068fdeff475d" -uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" -version = "0.21.64" - -[[deps.VertexSafeGraphs]] -deps = ["Graphs"] -git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" -uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" -version = "0.2.0" - -[[deps.Wayland_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "ed8d92d9774b077c53e1da50fd81a36af3744c1c" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.21.0+0" - -[[deps.Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.25.0+0" - -[[deps.WoodburyMatrices]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" -uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "0.5.5" - -[[deps.WriteVTK]] -deps = ["Base64", "CodecZlib", "FillArrays", "LightXML", "TranscodingStreams", "VTKBase"] -git-tree-sha1 = "7b46936613e41cfe1c6a5897d243ddcab8feabec" -uuid = "64499a7a-5c06-52f2-abe2-ccb03c286192" -version = "1.18.0" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "93c41695bc1c08c46c5899f4fe06d6ead504bb73" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.10.3+0" - -[[deps.XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.34+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.6.9+4" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.9+4" - -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.0+4" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.3+4" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.4+4" - -[[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "5.0.3+4" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.7.10+4" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] -git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.4+4" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.2+4" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.10+4" - -[[deps.Xorg_libpthread_stubs_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" -uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" -version = "0.1.0+3" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.13.0+3" - -[[deps.Xorg_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.0+4" - -[[deps.Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" -uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] -git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" -uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" -uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" -uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.9+1" - -[[deps.Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" -uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.1+1" - -[[deps.Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.2+4" - -[[deps.Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.27.0+4" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.4.0+3" - -[[deps.YAML]] -deps = ["Base64", "Dates", "Printf", "StringEncodings"] -git-tree-sha1 = "dbc7f1c0012a69486af79c8bcdb31be820670ba2" -uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" -version = "0.4.8" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.12+3" - -[[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 = "977aed5d006b840e2e40c0b48984f7463109046d" -uuid = "700de1a5-db45-46bc-99cf-38207098b444" -version = "0.2.3" - -[[deps.fzf_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "868e669ccb12ba16eaf50cb2957ee2ff61261c56" -uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" -version = "0.29.0+0" - -[[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" -uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.4.0+0" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.1+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.1.1+0" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.2+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.38+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+1" - -[[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" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" - -[[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "9ebfc140cc56e8c2156a15ceac2f0302e327ac0a" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "1.4.1+0" diff --git a/experiments/AMIP/moist_mpi_earth/Project.toml b/experiments/AMIP/moist_mpi_earth/Project.toml deleted file mode 100644 index 76be711cc4..0000000000 --- a/experiments/AMIP/moist_mpi_earth/Project.toml +++ /dev/null @@ -1,95 +0,0 @@ -[deps] -ArgParse = "c7e460c6-2fb9-53a9-8c5b-16f535851c63" -ArtifactWrappers = "a14bc488-3040-4b00-9dc1-f6467924858a" -AtmosphericProfilesLibrary = "86bc3604-9858-485a-bdbe-831ec50de11d" -CLIMAParameters = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" -ClimaAtmos = "b2c96348-7fb7-4fe0-8da9-78d88439e717" -ClimaComms = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" -ClimaCommsMPI = "5f86816e-8b66-43b2-912e-75384f99de49" -ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884" -ClimaCorePlots = "cf7c7e5a-b407-4c48-9047-11a94a308626" -ClimaCoreTempestRemap = "d934ef94-cdd4-4710-83d6-720549644b70" -ClimaCoupler = "4ade58fe-a8da-486c-bd89-46df092ec0c7" -ClimaLSM = "7884a58f-fab6-4fd0-82bb-ecfedb2d8430" -ClimaTimeSteppers = "595c0a79-7f3d-439a-bc5a-b232dc3bde79" -CloudMicrophysics = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" -Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" -Dierckx = "39dd38d3-220a-591b-8e3c-4c3a8c710a94" -DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" -DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def" -DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" -GR = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -Glob = "c27321d9-0574-5035-807b-f59d2c89b15c" -HDF5_jll = "0234f1f7-429e-5d53-9886-15a909be8d59" -Insolation = "e98cc03f-d57e-4e3c-b70c-8d51efe9e0d8" -IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" -JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" -MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" -NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -NVTX = "5da4648a-3479-48b8-97b9-01cb529c0a1f" -OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -RRTMGP = "a01a1ee8-cea4-48fc-987c-fc7878d79da1" -Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" -Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -SurfaceFluxes = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" -TempestRemap_jll = "8573a8c5-1df0-515e-a024-abad257ee284" -TerminalLoggers = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -Thermodynamics = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" -UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" - -[compat] -ArgParse = "1.1" -ArtifactWrappers = "0.2" -AtmosphericProfilesLibrary = "0.1" -CLIMAParameters = "0.4, 0.5, 0.6, 0.7" -ClimaComms = "0.3" -ClimaCommsMPI = "0.3" -ClimaCore = "0.10" -ClimaCorePlots = "0.2" -ClimaCoreTempestRemap = "0.3" -ClimaCoupler = "0.1" -ClimaLSM = "0.2" -ClimaTimeSteppers = "0.7" -CloudMicrophysics = "0.10" -Colors = "0.12" -Dierckx = "0.5" -DiffEqBase = "6" -DiffEqCallbacks = "2" -DocStringExtensions = "0.8, 0.9" -ForwardDiff = "0.10" -GR = "0.71" -Glob = "1" -HDF5_jll = "1" -Insolation = "0.3" -IntervalSets = "0.5, 0.6, 0.7" -JLD2 = "0.4" -JSON = "0.21" -MPI = "0.20" -NCDatasets = "0.11, 0.12" -NVTX = "0.3" -OrdinaryDiffEq = "5, 6" -Plots = "1" -PrettyTables = "1, 2" -ProgressLogging = "0.1" -RRTMGP = "0.8" -SciMLBase = "1" -StaticArrays = "1" -SurfaceFluxes = "0.6" -TempestRemap_jll = "2" -TerminalLoggers = "0.1" -Thermodynamics = "0.10" -UnPack = "1" -julia = "1.7" - -[extras] -CPUSummary = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" diff --git a/experiments/AMIP/moist_mpi_earth/README.md b/experiments/AMIP/moist_mpi_earth/README.md deleted file mode 100644 index 4fba1e441c..0000000000 --- a/experiments/AMIP/moist_mpi_earth/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# **Baroclinic Wave + Slab** - -# Atmosphere -The momentum equations are in the advective form, and tracers in the consevative form, namely: - -- Density: -$$ \frac{\partial \rho}{\partial t} + \nabla \cdot ({\rho \vec{u}})= 0 $$ - -- Momentum (flux form): -$$ \frac{\partial \vec{u_h}}{\partial t} + \vec{u} \cdot \nabla \vec{u_h} = - \frac{1}{\rho}\nabla_h p -+ \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} \vec{u_h} -$$ -$$ \frac{\partial w}{\partial t} + \vec{u} \cdot \nabla w= -- \frac{1}{\rho}\frac{\partial p}{\partial z} -- \nabla_z \Phi -+ \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} w -$$ - -- Total energy: -$$ \frac{\partial \rho e_{tot}}{\partial t} + \nabla \cdot (\rho h_{tot} \vec{u}) = \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} h_{tot} -$$ - -where the total specific enthalpy and total specific energy are -$$ h_{tot} = e_{tot} + \frac{p}{\rho} \,\,\,\,\,\,\,\, \,\,\,\,\,\,\,\, e_{tot} = c_v T + \Phi + \frac{1}{2}\vec{u}^2 -$$ -(note that $h_{tot} \neq h = c_vT + p/\rho = c_p T$, the specific enthalpy in the thermodynamic sense), $\Phi = gz$ is the geopotential, -$u_h$ is the horizontal velocity vector, $w$ the vertical velocity, $\rho$ the density, $p$ pressure, $K_v$ the vertical diffusivity (assumed constant here). - -## Boundary conditions (BCs) -- We implement BCs similarly to other climate models. - - First-order fluxes (i.e., advective fluxes) are always set to zero, corresponding to the *free-slip* and *impenetrable* BC, where: - $$ - w = 0 \,\,\,\,\,\,\, \partial_t w = 0 \,\,\,\,\,\,\, \nabla \times\vec{u_h}=0 \,\,\,\,\,\,\, \nabla \cdot \vec{\rho u_h}=0 \,\,\,\,\,\,\, \nabla \cdot \rho h_{tot} \vec{u_h}=0 - $$ - - Second-order fluxes (i.e., diffusive fluxes) - - `No Flux`: By default we have *impenetrable* or *insulating* BCs (no second-order fluxes) at all boundaries. - - `Bulk Formula`: Applied to tracers (e.g., temperature and moisture), this imposes a boundary fluxes (e.g., sensible and latent heat) calculated using the bulk aerodynamic formulae using prescribed surface values of ($T_{sfc}$ and $q_{sfc}^{sat}$). At the surface, the bulk sensible heat flux formula for total enthalpy essentially replaces the above: - $$ (K_v \rho \partial_z h_{tot})_{sfc}$$ - For **total energy**, we have two choices: - - 1. enthalpy flux: - $$ (K_v \rho \partial_z h_{tot})_{sfc} \rightarrow - \hat{n} \cdot \rho C_H ||u||^{1} (h^1- h_{sfc}) - = F_S - $$ - - 2. sensible (and latent) heat flux. The sensible heat flux is: - $$ (K_v \rho \partial_z h_{tot})_{sfc} \rightarrow - \hat{n} \cdot C_H c_{pd} ρ^{1} ||u||^{1} (T^{1} - T_{sfc}) - + \hat{n} \cdot C_H ρ^{1} ||u||^{1} (\Phi^{1} - \Phi_{sfc}) - = F_S - $$ - where $^{1}$ corresponds to the lowest model level, $C_H$ is the dimensionless thermal transfer coefficient, $c_{pd}$ is the specific heat capacity for dry air $||u||$ the wind speed. This is the *bulk turbulent sensible heat flux* parameterization, and $F_S$ is positive when atmosphere receives energy from the surface. - The contribution of the kinetic energy is usually O(1e4) smaller and is neglected, but it can be added to F_S as: - $$ - F_{S_{tot}} = F_S + \hat{n} \cdot C_D ρ^{1} ||u||^{1} (\vec{u_h}^{1})^2 - $$ - - `Drag Law`: essentially the bulk formula for momentum - $$ \frac{\partial}{\partial z} K_v \frac{\partial}{\partial z} \vec{u_h} \rightarrow - \hat{n} \cdot C_D ρ^{1} ||u||^{1} \vec{u_h}^{1} - = F_M - $$ - - `Coupled Bulk Formula`: same as `Bulk Formula`, but surface quantities (e.g. $T_{sfc}$) are passed from the state of the neighboring model. - - - The diffusive fluxes are applied via the `vertical_diffusion` ClimaAtmos model sub-component. To apply boundary fluxes without diffusion in the atmospheric interior, the viscosity coefficient needs to be set to zero: $ν = FT(0)$. - - We use `SurfaceFluxes.jl` to deal with the Monin Obukhov calculations - -## Current setup -- total energy and momentum - - at z=0: - - ρe: `Coupled Bulk Formula` latent heat flux + sensible heat flux (will be combined into enthalpy flux formulation in SurfaceFluxes.jl) - - uh: `Drag Law` - - the the top: - - $F_S = F_M = 0$ - - values - - simple setup: $C_D = C_H = 0.001$, interior diffusivity is set to $\nu = 5$ m^2/s - - ClimaAtmos setup ∀ p > p_pbl : $C_D = C_E = 0.0044 exp(-\frac{(p_{pbl} - p)}{p_{strato}}^2)$ - - where $p_{pbl} = 8e4$ Pa, $p_{strato} = 1e4$ Pa - -- All other boundary fluxes are set to 0. - -## Initial conditions -- we initialize with a perturbation in a balanced background state, as in: -https://climate.ucdavis.edu/pubs/UMJS2013QJRMS.pdf - -# Heat Slab -The slab solves for temperature in a single layer, whose tendency is the accumulated fluxes divided by the coupling timestep plus a parameterisation of the internal processes, $G$. -$$ -\rho c h_s \, \partial_t T_{sfc} = - F_{integ} / \Delta t_{coupler} -$$ - -# Distribution -## Julia multithreading -- we can run using multiple threads if the command line argument `enable_threading` is true (e.g., run with `julia --project --threads 8`). - -## MPI via ClimaComms.jl -- for AMIP we want the surface columns to be on the same processors as the atmos columns. Since all all surface domains will be on masked spheres, all of them can inherit the same distributed horizontal space from the atmos model. -- for this we need to run the `sbatch_job.sh` script, which sets up the `CLIMACORE_DISTRIBUTED` environment variable and job specifications, and runs the coupler_driver with `mpiexec` - -## Regridding -- not needed for AMIP. ClimaCoreTempestRemap can be easily re-introduced for a single processor, but will require more work for MPI runs. - -# Tests -## Conservation -- this uses the `sum` of `ClimaCore/Fields/mapreduce.jl`, which produces a sum weighted by the area Jacobian. - - one can easily check this by summing a field of ones using the domain's space: - ``` - field_of_ones = ones(center_space) - sum(field_of_ones) ≈ (4*pi*domain_radius^2) * domain_height - ``` -- Radiation - - By default radiation is a `PeriodicCallback` applied in `ClimaAtmos` every 6h. This updates the radiation fluxes field, `ᶠradiation_flux`, which itself is applied at every timestep via: - ``` - @. Yₜ.c.ρe -= ᶜdivᵥ(ᶠradiation_flux) - ``` - - The TOA fluxes can be accessed via `level(ᶠradiation_flux, end - half)`. Their net sum (or imbalance) represents sources and sinks to the earth system and these need to balance the net energy change. Ideally the TOA fluxes will balance to near zero. - -## Performance -- using `@elapsed` to measure the walltime of the coupling loop -- 1. strong scaling - - increasing the number of precessing elements (MPI processes or threads) - -- 2. weak scaling - - increasing the number of precessing elements (MPI processes or threads) with job size (vertical resolution) - -- 3. comparison to stand-alone atmos - - using the original ClimaAtmos driver (using `solve!`) - -## Physical correctness -- run the default for 20 days - -# Prescribed SST and Sea Ice -- We simply prescribe SSTs from a file as `T_sfc`. As for sea ice, we will follow GFDL's [AMIP setup](https://pcmdi.llnl.gov/mips/amip/home/Documentation/20gfdl.html#RTFToC31) and use prescribed sea ice concentrations and a constant ice thickness, $h_{i} = 2m$ ice thickness, while solving for $T_{sfc}$: -$$ -\frac{dT_{sfc}}{dt} = - \frac{h_i(F_{atm} - F_{conductive})}{k_i} -$$ -where -$$ -F_{conductive} = \frac{k_i (T_{base} - {T_{sfc}})}{h_{i}} -$$ -with the thermal conductivity of ice, $k_i = 2$ W m$^{-2}$ K$^{-1}$, and $T_{base} = 273.16$ K. For now we use an Euler timestepper (and use $T_{sfc}$ of the previous timestep), though this may be solved implicitly in the future. - -## Data source -- https://gdex.ucar.edu/dataset/158_asphilli.html - - MODEL.SST.HAD187001-198110.OI198111-202203.nc - - MODEL.ICE.HAD187001-198110.OI198111-202203.nc -- N.B.: the [pcmdi link](https://pcmdi.llnl.gov/mips/amip/details/amipbc_dwnld.php), used in most AMIP papers, is broken - - -# NB: -- first coupled iteration does not call rhs! -- slab `T_sfc` gets huge numbers when using `SSPRK33`. ok with `Euler` -- do not init global fields with mpi context - -# References -- [Kang et al 2021](https://arxiv.org/abs/2101.09263) -- [kth.se blog for strong and weak scaling](https://www.kth.se/blogs/pdc/2018/11/scalability-strong-and-weak-scaling/) - - - - diff --git a/experiments/AMIP/moist_mpi_earth/atmos/atmos_init.jl b/experiments/AMIP/moist_mpi_earth/atmos/atmos_init.jl deleted file mode 100644 index 1ae9c685d9..0000000000 --- a/experiments/AMIP/moist_mpi_earth/atmos/atmos_init.jl +++ /dev/null @@ -1,30 +0,0 @@ -# atmos_init: for ClimaAtmos pre-AMIP interface -import ClimaAtmos - -driver_file = joinpath(pkgdir(ClimaAtmos), "examples", "hybrid", "driver.jl") -ENV["CI_PERF_SKIP_RUN"] = true -try - include(driver_file) -catch err - if err.error !== :exit_profile - rethrow(err.error) - end -end -# the clima atmos `integrator` is now defined -struct AtmosSimulation{P, Y, D, I} - params::P - Y_init::Y - domain::D - integrator::I -end - -function atmos_init(::Type{FT}, Y, integrator; params = nothing) where {FT} - center_space = axes(Y.c.ρe_tot) - face_space = axes(Y.f.w) - spaces = (; center_space = center_space, face_space = face_space) - if :ρe_int in propertynames(Y.c) - @warn("Running with ρe_int in coupled mode is not tested yet.") - end - - AtmosSimulation(params, Y, spaces, integrator) -end diff --git a/experiments/AMIP/moist_mpi_earth/bucket/bucket_init.jl b/experiments/AMIP/moist_mpi_earth/bucket/bucket_init.jl deleted file mode 100644 index b056395a8f..0000000000 --- a/experiments/AMIP/moist_mpi_earth/bucket/bucket_init.jl +++ /dev/null @@ -1,249 +0,0 @@ -# slab_rhs! -using ClimaCore -using ClimaLSM -import ClimaLSM -include(joinpath(pkgdir(ClimaLSM), "parameters", "create_parameters.jl")) -using ClimaLSM.Bucket: BucketModel, BucketModelParameters, AbstractAtmosphericDrivers, AbstractRadiativeDrivers -using ClimaComms: AbstractCommsContext - -import ClimaLSM.Bucket: - surface_fluxes, - net_radiation, - surface_air_density, - liquid_precipitation, - BulkAlbedoMap, - BulkAlbedoFunction, - surface_albedo, - snow_precipitation - -using ClimaLSM: - make_ode_function, initialize, obtain_surface_space, make_set_initial_aux_state, surface_evaporative_scaling - -""" - BucketSimulation{M, Y, D, I} - -The bucket model simulation object. -""" -struct BucketSimulation{M, Y, D, I} - model::M - Y_init::Y - domain::D - integrator::I -end - -include("./bucket_utils.jl") - -""" - CoupledRadiativeFluxes{FT} <: AbstractRadiativeDrivers{FT} - -To be used when coupling to an atmosphere model; internally, used for -multiple dispatch on `surface_fluxes`. -""" -struct CoupledRadiativeFluxes{FT} <: AbstractRadiativeDrivers{FT} end - -""" - CoupledAtmosphere{FT} <: AbstractAtmosphericDrivers{FT} - -To be used when coupling to an atmosphere model; internally, used for -multiple dispatch on `surface_fluxes`. -""" -struct CoupledAtmosphere{FT} <: AbstractAtmosphericDrivers{FT} end - -""" - surface_fluxes(atmos::CoupledAtmosphere{FT}, - model::BucketModel{FT}, - Y, - p, - ) where {FT <: AbstractFloat} - -Computes the turbulent surface fluxes terms at the ground for a coupled simulation. -Note that `Ch` is not used with the current implementation of the bucket model, -but will be used once the canopy is incorporated. - -The turbulent energy flux is currently not split up between latent and sensible -heat fluxes. This will be fixed once `lhf` and `shf` are added to the bucket's -cache. -""" -function ClimaLSM.Bucket.surface_fluxes( - atmos::CoupledAtmosphere{FT}, - model::BucketModel{FT}, - Y, - p, - _..., -) where {FT <: AbstractFloat} - space = model.domain.surface.space - return ( - lhf = ClimaCore.Fields.zeros(space), - shf = p.bucket.turbulent_energy_flux, - vapor_flux = p.bucket.evaporation, - Ch = ClimaCore.Fields.similar(p.bucket.evaporation), - ) -end - - - -""" - net_radiation(radiation::CoupledRadiativeFluxes{FT}, - model::BucketModel{FT}, - Y, - p, - _..., - ) where {FT <: AbstractFloat} - -Computes the net radiative flux at the ground for a coupled simulation. -""" -function ClimaLSM.Bucket.net_radiation( - radiation::CoupledRadiativeFluxes{FT}, - model::BucketModel{FT}, - Y::ClimaCore.Fields.FieldVector, - p::ClimaCore.Fields.FieldVector, - _..., -) where {FT <: AbstractFloat} - # coupler has done its thing behind the scenes already - return p.bucket.R_n -end - - -""" - ClimaLSM.surface_air_density( - atmos::CoupledAtmosphere{FT}, - model::BucketModel{FT}, - Y, - p, - _..., - ) -an extension of the bucket model method which returns the surface air -density in the case of a coupled simulation. -""" -function surface_air_density( - atmos::CoupledAtmosphere{FT}, - model::BucketModel{FT}, - Y, - p, - _..., -) where {FT <: AbstractFloat} - return p.bucket.ρ_sfc -end - -""" - ClimaLSM.Bucket.liquid_precipitation(atmos::CoupledAtmosphere, p, t) - -an extension of the bucket model method which returns the precipitation -(m/s) in the case of a coupled simulation. -""" -function liquid_precipitation(atmos::CoupledAtmosphere, p, t) - # coupler has filled this in - return p.bucket.P_liq -end - -""" - ClimaLSM.Bucket.snow_precipitation(atmos::CoupledAtmosphere, p, t) - -an extension of the bucket model method which returns the precipitation -(m/s) in the case of a coupled simulation. -""" -function snow_precipitation(atmos::CoupledAtmosphere, p, t) - # coupler has filled this in - return p.bucket.P_snow -end - -""" - bucket_init - -Initializes the bucket model variables. -""" -function bucket_init( - ::Type{FT}, - tspan::Tuple{FT, FT}, - config::String, - albedo_from_file::Bool, - comms_ctx::AbstractCommsContext, - regrid_dirpath::String; - space, - dt::FT, - saveat::FT, - stepper = Euler(), -) where {FT} - if config != "sphere" - println( - "Currently only spherical shell domains are supported; single column set-up will be addressed in future PR.", - ) - @assert config == "sphere" - end - - earth_param_set = create_lsm_parameters(FT) - - α_snow = FT(0.8) # snow albedo - if albedo_from_file # Read in albedo from data file (default) - albedo = BulkAlbedoMap{FT}(regrid_dirpath, α_snow = α_snow, comms = comms_ctx) - else # Use spatially-varying function for surface albedo - function α_sfc(coordinate_point) - (; lat, long) = coordinate_point - return typeof(lat)(0.4) - end - albedo = BulkAlbedoFunction{FT}(α_snow, α_sfc) - end - - σS_c = FT(0.2) - W_f = FT(0.5) - d_soil = FT(3.5) # soil depth - z_0m = FT(1e-2) - z_0b = FT(1e-3) - κ_soil = FT(0.7) - ρc_soil = FT(2e6) - t_crit = dt # This is the timescale on which snow exponentially damps to zero, in the case where all - # the snow would melt in time t_crit. It prevents us from having to specially time step in cases where - # all the snow melts in a single timestep. - params = BucketModelParameters(κ_soil, ρc_soil, albedo, σS_c, W_f, z_0m, z_0b, t_crit, earth_param_set) - n_vertical_elements = 7 - # Note that this does not take into account topography of the surface, which is OK for this land model. - # But it must be taken into account when computing surface fluxes, for Δz. - domain = make_lsm_domain(space, (-d_soil, FT(0.0)), n_vertical_elements) - args = (params, CoupledAtmosphere{FT}(), CoupledRadiativeFluxes{FT}(), domain) - model = BucketModel{FT, typeof.(args)...}(args...) - - # Initial conditions with no moisture - Y, p, coords = initialize(model) - anomaly = false - anomaly_tropics = true - hs_sfc = false - Y.bucket.T = map(coords.subsurface) do coord - T_sfc_0 = FT(270.0) - radlat = coord.lat / FT(180) * pi - ΔT = FT(0) - if anomaly == true - anom_ampl = FT(0)# this is zero, no anomaly - lat_0 = FT(60) / FT(180) * pi - lon_0 = FT(-90) / FT(180) * pi - radlon = coord.long / FT(180) * pi - stdev = FT(5) / FT(180) * pi - ΔT = anom_ampl * exp(-((radlat - lat_0)^2 / 2stdev^2 + (radlon - lon_0)^2 / 2stdev^2)) - elseif hs_sfc == true - ΔT = -FT(60) * sin(radlat)^2 - elseif anomaly_tropics == true - ΔT = FT(40 * cos(radlat)^4) - end - T_sfc_0 + ΔT - end - - Y.bucket.W .= 0.5#0.14 - Y.bucket.Ws .= 0.0 - Y.bucket.σS .= 0.0 - P_liq = zeros(axes(Y.bucket.W)) .+ FT(0.0) - P_snow = zeros(axes(Y.bucket.W)) .+ FT(0.0) - variable_names = (propertynames(p.bucket)..., :P_liq, :P_snow) - orig_fields = map(x -> getproperty(p.bucket, x), propertynames(p.bucket)) - fields = (orig_fields..., P_liq, P_snow) - p_new = ClimaCore.Fields.FieldVector(; :bucket => (; zip(variable_names, fields)...)) - - # Set initial aux variable values - set_initial_aux_state! = make_set_initial_aux_state(model) - set_initial_aux_state!(p_new, Y, tspan[1]) - - ode_function! = make_ode_function(model) - - prob = ODEProblem(ode_function!, Y, tspan, p_new) - integrator = init(prob, stepper; dt = dt, saveat = saveat) - - BucketSimulation(model, Y, (; domain = domain, soil_depth = d_soil), integrator) -end diff --git a/experiments/AMIP/moist_mpi_earth/bucket/bucket_utils.jl b/experiments/AMIP/moist_mpi_earth/bucket/bucket_utils.jl deleted file mode 100644 index 36ee2c46f5..0000000000 --- a/experiments/AMIP/moist_mpi_earth/bucket/bucket_utils.jl +++ /dev/null @@ -1,143 +0,0 @@ -""" - get_land_temp(slab_sim::BucketSimulation) - -Returns the surface temperature of the earth; -a method for the bucket model -when used as the land model. -""" -function get_land_temp(slab_sim::BucketSimulation) - return ClimaLSM.surface_temperature( - slab_sim.model, - slab_sim.integrator.u, - slab_sim.integrator.p, - slab_sim.integrator.t, - ) -end - - -""" - get_land_temp_from_state(land_sim, u) - -Returns the surface temperature of the earth, computed -from the state u. -""" -function get_land_temp_from_state(land_sim, u) - return ClimaLSM.surface_temperature(land_sim.model, u, land_sim.integrator.p, land_sim.integrator.t) -end - -""" - get_land_roughness(slab_sim::BucketSimulation) - -Returns the roughness length parameters of the bucket; -a method for the bucket model -when used as the land model. -""" -function get_land_roughness(slab_sim::BucketSimulation) - return slab_sim.model.parameters.z_0m, slab_sim.model.parameters.z_0b -end - -""" - land_albedo(slab_sim::BucketSimulation) - -Returns the surface albedo of the earth; -a method for the bucket model -when used as the land model. -""" -function land_albedo(slab_sim::BucketSimulation) - return ClimaLSM.surface_albedo(slab_sim.model, slab_sim.integrator.u, slab_sim.integrator.p) -end - -""" - land_beta(slab_sim::BucketSimulation) - -Returns the beta factor of the earth; -a method for the bucket model -when used as the land model. -""" -function land_beta(slab_sim::BucketSimulation) - return ClimaLSM.surface_evaporative_scaling(slab_sim.model, slab_sim.integrator.u, slab_sim.integrator.p) -end - - -""" - get_land_q(slab_sim::Bucketimulation, _...) - -Returns the surface specific humidity of the earth; -a method for the bucket -when used as the land model. -""" -function get_land_q(slab_sim::BucketSimulation, _...) - return slab_sim.integrator.p.bucket.q_sfc -end - -""" - get_bucket_energy(bucket_sim) - -Returns the volumetric internal energy of the bucket land model. -""" -function get_land_energy(bucket_sim::BucketSimulation, e_per_area) - - e_per_area .= zeros(axes(bucket_sim.integrator.u.bucket.W)) - soil_depth = FT = eltype(bucket_sim.integrator.u.bucket.W) - ClimaCore.Fields.bycolumn(axes(bucket_sim.integrator.u.bucket.T)) do colidx - e_per_area[colidx] .= - bucket_sim.model.parameters.ρc_soil .* mean(bucket_sim.integrator.u.bucket.T[colidx]) .* - bucket_sim.domain.soil_depth - end - - e_per_area .+= - -LSMP.LH_f0(bucket_sim.model.parameters.earth_param_set) .* - LSMP.ρ_cloud_liq(bucket_sim.model.parameters.earth_param_set) .* bucket_sim.integrator.u.bucket.σS - return e_per_area -end - - -""" - make_lsm_domain( - atmos_boundary_space::ClimaCore.Spaces.SpectralElementSpace2D, - zlim::Tuple{FT, FT}, - nelements_vert::Int,) where {FT} - -Creates the LSM Domain from the horizontal space of the atmosphere, and information -about the number of elements and extent of the vertical domain. -""" -function make_lsm_domain( - atmos_boundary_space::ClimaCore.Spaces.SpectralElementSpace2D, - zlim::Tuple{FT, FT}, - nelements_vert::Int, -) where {FT} - @assert zlim[1] < zlim[2] - height = zlim[2] - zlim[1] - radius = atmos_boundary_space.topology.mesh.domain.radius - npolynomial = ClimaCore.Spaces.Quadratures.polynomial_degree(atmos_boundary_space.quadrature_style) - nelements_horz = atmos_boundary_space.topology.mesh.ne - nelements = (nelements_horz, nelements_vert) - vertdomain = ClimaCore.Domains.IntervalDomain( - ClimaCore.Geometry.ZPoint(FT(zlim[1])), - ClimaCore.Geometry.ZPoint(FT(zlim[2])); - boundary_tags = (:bottom, :top), - ) - - vertmesh = ClimaCore.Meshes.IntervalMesh(vertdomain, ClimaCore.Meshes.Uniform(), nelems = nelements[2]) - verttopology = ClimaCore.Topologies.IntervalTopology(vertmesh) - vert_center_space = ClimaCore.Spaces.CenterFiniteDifferenceSpace(verttopology) - subsurface_space = ClimaCore.Spaces.ExtrudedFiniteDifferenceSpace(atmos_boundary_space, vert_center_space) - - surface_domain = ClimaLSM.Domains.SphericalSurface{FT, typeof(atmos_boundary_space)}( - radius, - nelements[1], - npolynomial, - atmos_boundary_space, - ) - subsurface_domain = ClimaLSM.Domains.SphericalShell{FT, typeof(subsurface_space)}( - radius, - height, - nelements, - npolynomial, - subsurface_space, - ) - return ClimaLSM.Domains.LSMSphericalShellDomain{FT, typeof(subsurface_space), typeof(atmos_boundary_space)}( - subsurface_domain, - surface_domain, - ) -end diff --git a/experiments/AMIP/moist_mpi_earth/cli_options.jl b/experiments/AMIP/moist_mpi_earth/cli_options.jl deleted file mode 100644 index ee7da99fc4..0000000000 --- a/experiments/AMIP/moist_mpi_earth/cli_options.jl +++ /dev/null @@ -1,551 +0,0 @@ -import ArgParse -function argparse_settings() - s = ArgParse.ArgParseSettings() - ArgParse.@add_arg_table s begin - # ClimaCoupler flags - "--run_name" - help = "Name of this run." - arg_type = String - default = "run" - "--dt_cpl" - help = " Coupling time step in seconds" - arg_type = Int - default = 400 - "--anim" - help = "Boolean flag indicating whether to make animations" - arg_type = Bool - default = false - "--energy_check" - help = "Boolean flag indicating whether to check energy conservation" - arg_type = Bool - default = false - "--mode_name" - help = "Mode of coupled simulation. [`amip`, `slabplanet`]" - arg_type = String - default = "amip" - "--mono_surface" - help = "Boolean flag indicating whether (1st order) monotone and conservative remapping is applied." - arg_type = Bool - default = false - "--albedo_from_file" - help = "Access land surface albedo information from data file" - arg_type = Bool - default = true - # ClimaAtmos flags - "--FLOAT_TYPE" - help = "Float type" - arg_type = String - default = "Float32" - "--t_end" - help = "Simulation end time. Examples: [`1200days`, `40secs`]" - arg_type = String - default = "10days" - "--dt" - help = "Simulation time step. Examples: [`10secs`, `1hours`]" - arg_type = String - default = "600secs" - "--dt_save_to_sol" - help = "Time between saving solution. Examples: [`10days`, `1hours`, `Inf` (do not save)]" - arg_type = String - default = "1days" - "--dt_save_to_disk" - help = "Time between saving to disk. Examples: [`10secs`, `1hours`, `Inf` (do not save)]" - arg_type = String - default = "Inf" - "--dt_save_restart" - help = "Time between saving restart files to disk. Examples: [`10secs`, `1hours`, `Inf` (do not save)]" - arg_type = String - default = "Inf" - "--dt_rad" - help = "Time between calling radiation callback for sphere configurations" - arg_type = String - default = "6hours" - "--config" - help = "Spatial configuration [`sphere` (default), `column`, `box`, `plane`]" - arg_type = String - default = "sphere" - "--initial_condition" - help = "Initial condition [`DryBaroclinicWave`, `MoistBaroclinicWave`, `DecayingProfile`, `IsothermalProfile`, `Bomex`, `DryDensityCurrentProfile`, `AgnesiHProfile`, `ScharProfile`]" - arg_type = String - default = "DecayingProfile" - "--moist" - help = "Moisture model [`dry` (default), `equil`, `non_equil`]" - arg_type = String - default = "dry" - "--precip_model" - help = "Precipitation model [`nothing` (default), `0M`]" - arg_type = String - "--forcing" - help = "Forcing [`nothing` (default), `held_suarez`]" - arg_type = String - "--subsidence" - help = "Subsidence [`nothing` (default), `Bomex`, `LifeCycleTan2018`, `Rico`, `DYCOMS`]" - arg_type = String - "--ls_adv" - help = "Large-scale advection [`nothing` (default), `Bomex`, `LifeCycleTan2018`, `Rico`, `ARM_SGP`, `GATE_III`]" - arg_type = String - "--edmf_coriolis" - help = "EDMF coriolis [`nothing` (default), `Bomex`,`LifeCycleTan2018`,`Rico`,`ARM_SGP`,`DYCOMS_RF01`,`DYCOMS_RF02`,`GABLS`]" - arg_type = String - "--edmfx_adv_test" - help = "EDMFX advection test switches off all velocity tendencies in GM and turbconc [`false` (default), `true`]" - arg_type = Bool - default = false - "--vert_diff" - help = "Vertical diffusion [`false` (default), `VerticalDiffusion`, `true` (defaults to `VerticalDiffusion`)]" - arg_type = String - default = "false" - "--surface_scheme" - help = "Surface flux scheme [`nothing` (default), `bulk`, `monin_obukhov`]" - arg_type = String - "--surface_thermo_state_type" - help = "Surface thermo state type [`GCMSurfaceThermoState` (default), `PrescribedThermoState`]" - arg_type = String - default = "GCMSurfaceThermoState" - "--C_E" - help = "Bulk transfer coefficient" - arg_type = Float64 - default = Float64(0.0044) - "--coupled" - help = "Coupled simulation [`false` (default), `true`]" - arg_type = Bool - default = false - "--turbconv" - help = "Turbulence convection scheme [`nothing` (default), `edmf`]" - arg_type = String - "--turbconv_case" - help = "The case run by Turbulence convection scheme [`Bomex` (default), `Bomex`, `DYCOMS_RF01`, `TRMM_LBA`, `GABLS`]" - arg_type = String - "--hyperdiff" - help = "Hyperdiffusion [`ClimaHyperdiffusion` (or `true`; default), `none` (or `false`)]" - arg_type = String - default = "ClimaHyperdiffusion" - "--idealized_insolation" - help = "Use idealized insolation in radiation model [`false`, `true` (default)]" - arg_type = Bool - default = true - "--idealized_h2o" - help = "Use idealized H2O in radiation model [`false` (default), `true`]" - arg_type = Bool - default = false - "--idealized_clouds" - help = "Use idealized clouds in radiation model [`false` (default), `true`]" - arg_type = Bool - default = false - "--rad" - help = "Radiation model [`nothing` (default), `gray`, `clearsky`, `allsky`, `allskywithclear`]" - arg_type = String - "--energy_name" - help = "Energy variable name [`rhoe` (default), `rhotheta`]" - arg_type = String - default = "rhoe" - "--perturb_initstate" - help = "Add a perturbation to the initial condition [`false`, `true` (default)]" - arg_type = Bool - default = true - "--discrete_hydrostatic_balance" - help = "Set the initial state to discrete hydrostatic balance" - arg_type = Bool - default = false - "--energy_upwinding" - help = "Energy upwinding mode [`none` (default), `first_order` , `third_order`, `boris_book`, `zalesak`]" - arg_type = Symbol - default = :none - "--tracer_upwinding" - help = "Tracer upwinding mode [`none` (default), `first_order` , `third_order`, `boris_book`, `zalesak`]" - arg_type = Symbol - default = :none - "--density_upwinding" - help = "Denisity upwinding mode [`none` (default), `first_order` , `third_order`, `boris_book`, `zalesak`]" - arg_type = Symbol - default = :none - "--edmfx_upwinding" - help = "EDMFX upwinding mode [`none` (default), `first_order` , `third_order`, `boris_book`, `zalesak`]" - arg_type = Symbol - default = :none # TODO: change to :first_order (or higher?) - "--ode_algo" - help = "ODE algorithm [`ARS343` (default), `SSP333`, `IMKG343a`, `ODE.Euler`, `ODE.IMEXEuler`, `ODE.Rosenbrock23`, etc.]" - arg_type = String - default = "ARS343" - "--max_newton_iters" - help = "Maximum number of Newton's method iterations (only for ODE algorithms that use Newton's method)" - arg_type = Int - default = 1 - "--use_newton_rtol" - help = "Whether to check if the current iteration of Newton's method has an error within a relative tolerance, instead of always taking the maximum number of iterations (only for ClimaTimeSteppers.jl)" - arg_type = Bool - default = false - "--newton_rtol" - help = "Relative tolerance of Newton's method (only for ClimaTimeSteppers.jl; only used when `use_newton_rtol` is `true`)" - arg_type = Float64 - default = Float64(1e-5) - "--use_krylov_method" - help = "Whether to use a Krylov method to solve the linear system in Newton's method (only for ClimaTimeSteppers.jl)" - arg_type = Bool - default = false - "--krylov_rtol" - help = "Relative tolerance of the Krylov method (only for ClimaTimeSteppers.jl; only used if `use_krylov_method` is `true`)" - arg_type = Float64 - default = Float64(0.1) - "--use_dynamic_krylov_rtol" - help = "Whether to use Eisenstat-Walker forcing instead of a constant relative tolerance in the Krylov method (only for ClimaTimeSteppers.jl)" - arg_type = Bool - default = false - "--eisenstat_walker_forcing_alpha" - help = "Value of alpha to use for Eisenstat-Walker forcing (only for ClimaTimeSteppers.jl; only used if `use_krylov_method` and `use_dynamic_krylov_rtol` are `true`)" - arg_type = Float64 - default = Float64(2) - "--jvp_step_adjustment" - help = "Amount by which the step size of the forward difference approximation of the Jacobian-vector product in the Krylov method should be scaled (only used if `use_krylov_method` is `true`)" - arg_type = Float64 - default = Float64(1) - "--split_ode" - help = "Use split of ODE problem. Examples: [`true` (implicit, default), `false` (explicit)]" - arg_type = Bool - default = true - "--regression_test" - help = "(Bool) perform regression test" - arg_type = Bool - default = false - "--enable_threading" - help = "Enable multi-threading. Note: Julia must be launched with (e.g.,) `--threads=8`" - arg_type = Bool - default = true - "--output_dir" - help = "Output directory" - arg_type = String - "--job_id" - help = "Uniquely identifying string for a particular job" - arg_type = String - "--reference_job_id" - help = "Identifier of job to use as the \"reference\" solution in the quicklook plot; the current job's results get compared to the results of the quicklook job on the main branch (only used if `debugging_tc` is `true`)" - arg_type = String - "--trunc_stack_traces" - help = "Set to `true` to truncate printing of ClimaCore `Field`s" - arg_type = Bool - default = true - "--fps" - help = "Frames per second for animations" - arg_type = Int - default = 5 - "--post_process" - help = "Post process [`true` (default), `false`]" - arg_type = Bool - default = true - "--h_elem" - help = "number of elements per edge on a cubed sphere" - arg_type = Int - default = 6 - "--x_elem" - help = "number of horizontal elements in the x-direction" - arg_type = Int - default = 6 - "--y_elem" - help = "number of horizontal elements in the y-direction" - arg_type = Int - default = 6 - "--z_elem" - help = "number of vertical elements" - arg_type = Int - default = 10 - "--nh_poly" - help = "Horizontal polynomial degree. Note: The number of quadrature points in 1D within each horizontal element is then Nq = <--nh_poly> + 1" - arg_type = Int - default = 3 - "--bubble" - help = "Enable bubble correction for more accurate surface areas" - arg_type = Bool - default = true - "--x_max" - help = "Model domain size, x direction. Default: 300km" - arg_type = Float64 - default = Float64(300e3) - "--y_max" - help = "Model domain size, y direction. Default: 300km" - arg_type = Float64 - default = Float64(300e3) - "--z_max" - help = "Model top height. Default: 30km" - arg_type = Float64 - default = Float64(30e3) - "--z_stretch" - help = "Stretch grid in z-direction. [`true` (default), `false`]" - arg_type = Bool - default = true - "--dz_bottom" - help = "Model bottom grid depth. Default: 500m" - arg_type = Float64 - default = Float64(500) - "--dz_top" - help = "Model top grid depth. Default: 5000m" - arg_type = Float64 - default = Float64(5000) - "--kappa_4" - help = "Hyperdiffusion parameter" - arg_type = Float64 - default = Float64(2e17) - "--divergence_damping_factor" - help = "Divergence damping factor" - arg_type = Float64 - default = Float64(1) - "--rayleigh_sponge" - help = "Rayleigh sponge [`true`, `false` (default)]" - arg_type = Bool - default = false - "--viscous_sponge" - help = "Viscous sponge [`true`, `false` (default)]" - arg_type = Bool - default = false - "--zd_rayleigh" - help = "Rayleigh sponge height" - arg_type = Float64 - default = Float64(15e3) - "--alpha_rayleigh_uh" - help = "Rayleigh sponge coefficient for horizontal velocity" - arg_type = Float64 - default = Float64(1e-4) - "--alpha_rayleigh_w" - help = "Rayleigh sponge coefficient for vertical velocity" - arg_type = Float64 - default = Float64(1) - "--zd_viscous" - help = "Viscous sponge height" - arg_type = Float64 - default = Float64(15e3) - "--kappa_2_sponge" - help = "Viscous sponge coefficient" - arg_type = Float64 - default = Float64(1e6) - "--start_date" - help = "Start date of the simulation" - arg_type = String - default = "19790101" - "--topography" - help = "Define the surface elevation profile [`NoWarp`,`Earth`,`DCMIP200`,`Agnesi`]" - arg_type = String - default = "NoWarp" - "--apply_limiter" - help = "Apply a horizontal limiter to every tracer [`true` (default), `false`]" - arg_type = Bool - default = true - "--imex_edmf_turbconv" - help = "Whether to split EDMF's `compute_turbconv_tendencies!` into implicit and explicit components" - arg_type = Bool - default = false - "--imex_edmf_gm" - help = "Whether to split EDMF's `compute_gm_tendencies!` into implicit and explicit components" - arg_type = Bool - default = false - "--debugging_tc" - help = "Save most of the tc aux state to HDF5 file [`false` (default), `true`]" - arg_type = Bool - default = false - "--test_edmf_consistency" - help = "Test edmf equation consistency [`false` (default), `true`]" - arg_type = Bool - default = false - "--test_dycore_consistency" - help = "Test dycore consistency [`false` (default), `true`]" - arg_type = Bool - default = false - "--use_reference_state" - help = "Subtract a reference state from the dycore equations [`false`, `true` (default)]" - arg_type = Bool - default = true - "--check_conservation" - help = "Check conservation of mass and energy [`false` (default), `true`]" - arg_type = Bool - default = false - "--non_orographic_gravity_wave" - help = "Apply parameterization for convective gravity wave forcing on horizontal mean flow [`false` (default), `true`]" - arg_type = Bool - default = false - "--orographic_gravity_wave" - help = "Apply parameterization for orographic drag on horizontal mean flow" - arg_type = Bool - default = false - "--perf_summary" - help = "Flag for collecting performance summary information" - arg_type = Bool - default = false - "--perf_mode" - help = "A flag for analyzing performance [`PerfStandard` (default), `PerfExperimental`]" - arg_type = String - default = "PerfStandard" - "--target_job" - help = "An (optional) job to target for analyzing performance" - arg_type = String - "--toml" - help = "A toml file used to override model parameters and configurations. In the case of conflicts, CLI arguments take priority over the toml" - arg_type = String - end - return s -end - -parse_commandline(s) = ArgParse.parse_args(ARGS, s) - -function cli_defaults(s::ArgParse.ArgParseSettings) - defaults = Dict() - # TODO: Don't use ArgParse internals - for arg in s.args_table.fields - defaults[arg.dest_name] = arg.default - end - return defaults -end - -""" - job_id_from_parsed_args( - s::ArgParseSettings, - parsed_args = ArgParse.parse_args(ARGS, s) - ) -Returns a unique name (`String`) given - - `s::ArgParse.ArgParseSettings` The arg parse settings - - `parsed_args` The parse arguments -The `ArgParseSettings` are used for truncating -this string based on the default values. -""" -job_id_from_parsed_args(s, parsed_args = ArgParse.parse_args(ARGS, s)) = - job_id_from_parsed_args(cli_defaults(s), parsed_args) - -function job_id_from_parsed_args(defaults::Dict, parsed_args) - _parsed_args = deepcopy(parsed_args) - s = "" - warn = false - for k in keys(_parsed_args) - # Skip defaults to alleviate verbose names - defaults[k] == _parsed_args[k] && continue - - if _parsed_args[k] isa String - # We don't need keys if the value is a string - # (alleviate verbose names) - s *= _parsed_args[k] - elseif _parsed_args[k] isa Int - s *= k * "_" * string(_parsed_args[k]) - elseif _parsed_args[k] isa AbstractFloat - warn = true - else - s *= k * "_" * string(_parsed_args[k]) - end - s *= "_" - end - s = replace(s, "/" => "_") - s = strip(s, '_') - warn && @warn "Truncated job ID:$s may not be unique due to use of Real" - return s -end - - -""" - print_repl_script(str::String) -Generate a block of code to run a particular -buildkite job given the `command:` string. -Example: -""" -function print_repl_script(str) - ib = """""" - ib *= """\n""" - ib *= """using Revise; include("src/utils/cli_options.jl");\n""" - ib *= """\n""" - ib *= """parsed_args = parse_commandline(argparse_settings());\n""" - parsed_args = parsed_args_from_command_line_flags(str) - for (flag, val) in parsed_args - if val isa AbstractString - ib *= "parsed_args[\"$flag\"] = \"$val\";\n" - else - ib *= "parsed_args[\"$flag\"] = $val;\n" - end - end - ib *= """\n""" - ib *= """include("examples/hybrid/driver.jl")\n""" - println(ib) -end - -function time_to_seconds(s::String) - factor = Dict("secs" => 1, "mins" => 60, "hours" => 60 * 60, "days" => 60 * 60 * 24) - s == "Inf" && return Inf - if count(occursin.(keys(factor), Ref(s))) != 1 - error("Bad format for flag $s. Examples: [`10secs`, `20mins`, `30hours`, `40days`]") - end - for match in keys(factor) - occursin(match, s) || continue - return parse(Float64, first(split(s, match))) * factor[match] - end - error("Uncaught case in computing time from given string.") -end - -parsed_args_from_ARGS(ARGS, parsed_args = Dict()) = parsed_args_from_ARGS_string(strip(join(ARGS, " ")), parsed_args) - -parsed_args_from_command_line_flags(str, parsed_args = Dict()) = - parsed_args_from_ARGS_string(strip(last(split(str, ".jl"))), parsed_args) - -function parsed_args_from_ARGS_string(str, parsed_args = Dict()) - str = replace(str, " " => " ", " " => " ", " " => " ") - parsed_args_list = split(str, " ") - parsed_args_list == [""] && return parsed_args - @assert iseven(length(parsed_args_list)) - parsed_arg_pairs = map(1:2:(length(parsed_args_list) - 1)) do i - Pair(parsed_args_list[i], strip(parsed_args_list[i + 1], '\"')) - end - function parse_arg(val) - for T in (Bool, Int, Float32, Float64) - try - return parse(T, val) - catch - end - end - return String(val) # string - end - for (flag, val) in parsed_arg_pairs - parsed_args[replace(flag, "--" => "")] = parse_arg(val) - end - return parsed_args -end - -""" - parsed_args_per_job_id() - parsed_args_per_job_id(buildkite_yaml) - -A dict of `parsed_args` to run the ClimaAtmos driver -whose keys are the `job_id`s from buildkite yaml. - -# Example - -To run the `sphere_aquaplanet_rhoe_equilmoist_allsky` -buildkite job from the standard buildkite pipeline, use: -``` -using Revise; include("examples/hybrid/cli_options.jl"); -dict = parsed_args_per_job_id(); -parsed_args = dict["sphere_aquaplanet_rhoe_equilmoist_allsky"]; -include("examples/hybrid/driver.jl") -``` -""" -function parsed_args_per_job_id(; trigger = "driver.jl") - cc_dir = joinpath(@__DIR__, "..", "..", "..") - buildkite_yaml = joinpath(cc_dir, ".buildkite", "pipeline.yml") - parsed_args_per_job_id(buildkite_yaml; trigger) -end - -function parsed_args_per_job_id(buildkite_yaml; trigger = "driver.jl") - buildkite_commands = readlines(buildkite_yaml) - filter!(x -> occursin(trigger, x), buildkite_commands) - - @assert length(buildkite_commands) > 0 # sanity check - result = Dict() - for bkcs in buildkite_commands - default_parsed_args = parse_commandline(argparse_settings()) - job_id = first(split(last(split(bkcs, "--run_name ")), " ")) - job_id = strip(job_id, '\"') - result[job_id] = parsed_args_from_command_line_flags(bkcs, default_parsed_args) - end - return result -end - -function non_default_command_line_flags_parsed_args(parsed_args) - default_parsed_args = parse_commandline(argparse_settings()) - s = "" - for k in keys(parsed_args) - default_parsed_args[k] == parsed_args[k] && continue - s *= "--$k $(parsed_args[k]) " - end - return rstrip(s) -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_driver.jl b/experiments/AMIP/moist_mpi_earth/coupler_driver.jl deleted file mode 100644 index c129333c61..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_driver.jl +++ /dev/null @@ -1,527 +0,0 @@ -include("mpi/mpi_init.jl") # setup MPI context for distributed runs #hide - -# # AMIP Driver - -#= -## Overview - -AMIP is a standard experimental protocol of the Program for Climate Model Diagnosis & Intercomparison (PCMDI). -It is used as a model benchmark for the atmospheric and land model components, while sea-surface temperatures (SST) and sea-ice concentration (SIC) -are prescribed using time-interpolations between monthly observed data. We use standard data files with original sources: -- SST and SIC: https://gdex.ucar.edu/dataset/158_asphilli.html -- land-sea mask: https://www.ncl.ucar.edu/Applications/Data/#cdf - -For more information, see the PCMDI's specifications for [AMIP I](https://pcmdi.github.io/mips/amip/) and [AMIP II](https://pcmdi.github.io/mips/amip2/). - -This driver contains two modes. The full `AMIP` mode and a `SlabPlanet` (all surfaces are thermal slabs) mode. Since `AMIP` is not a closed system, the -`SlabPlanet` mode is useful for checking conservation properties of the coupling. - -=# - -#= -## Start Up -Before starting Julia, ensure your environment is properly set up: -```julia -module purge -module load julia/1.8.1 openmpi/4.1.1 hdf5/1.12.1-ompi411 #netcdf-c/4.6.1 - -export CLIMACORE_DISTRIBUTED="MPI" #include if using MPI, otherwise leave empty -export JUlIA_MPI_BINARY="system" -export JULIA_HDF5_PATH="" -``` - -Next instantiate/build all packages listed in `Manifest.toml`: -```julia -julia --project -e 'using Pkg; Pkg.instantiate(); Pkg.build()' -julia --project -e 'using Pkg; Pkg.build("MPI"); Pkg.build("HDF5")' -``` - -The `coupler_driver.jl` is now ready to be run. You can run a SLURM job (e.g., run `sbatch sbatch_job.sh` from the terminal), or -you can run directly from the Julia REPL. The latter is recommended for debugging of lightweight simulations, and should be run -with threading enabled: -```julia -julia --project --threads 8 -``` -=# - -#= -## Initialization -Here we import standard Julia packages, ClimaESM packages, parse in command-line arguments (if none are specified then the defaults in `cli_options.jl` apply). -We then specify the input data file names. If these are not already downloaded, include `artifacts/download_artifacts.jl`. -=# - -import SciMLBase: step! -using OrdinaryDiffEq -using OrdinaryDiffEq: ODEProblem, solve, SSPRK33, savevalues!, Euler -using LinearAlgebra -import Test: @test -using Dates -using UnPack -import MPI - -using ClimaCore.Utilities: half, PlusHalf -using ClimaCore: InputOutput, Geometry - -include("cli_options.jl") -parsed_args = parse_commandline(argparse_settings()) - -## modify parsed args for fast testing from REPL #hide -if isinteractive() - parsed_args["coupled"] = true #hide - parsed_args["surface_scheme"] = "monin_obukhov" #hide - parsed_args["moist"] = "equil" #hide - parsed_args["vert_diff"] = true #hide - parsed_args["rad"] = "gray" #hide - parsed_args["energy_check"] = true #hide - parsed_args["mode_name"] = "slabplanet" #hide - parsed_args["t_end"] = "10days" #hide - parsed_args["dt_save_to_sol"] = "3600secs" #hide - parsed_args["dt_cpl"] = 200 #hide - parsed_args["dt"] = "200secs" #hide - parsed_args["mono_surface"] = true #hide - parsed_args["h_elem"] = 4 #hide - parsed_args["precip_model"] = "0M" #hide - parsed_args["albedo_from_file"] = true #hide -end - -## read in some parsed command line arguments -mode_name = parsed_args["mode_name"] -run_name = parsed_args["run_name"] -energy_check = parsed_args["energy_check"] -const FT = parsed_args["FLOAT_TYPE"] == "Float64" ? Float64 : Float32 -land_sim_name = "bucket" -t_end = FT(time_to_seconds(parsed_args["t_end"])) -tspan = (0, t_end) -Δt_cpl = FT(parsed_args["dt_cpl"]) -saveat = time_to_seconds(parsed_args["dt_save_to_sol"]) -date0 = date = DateTime(parsed_args["start_date"], dateformat"yyyymmdd") -mono_surface = parsed_args["mono_surface"] - -import ClimaCoupler -pkg_dir = pkgdir(ClimaCoupler) -COUPLER_OUTPUT_DIR = joinpath(pkg_dir, "experiments/AMIP/moist_mpi_earth/output", joinpath(mode_name, run_name)) -mkpath(COUPLER_OUTPUT_DIR) - -REGRID_DIR = joinpath(COUPLER_OUTPUT_DIR, "regrid_tmp/") -mkpath(REGRID_DIR) - -@info COUPLER_OUTPUT_DIR -@info parsed_args - -## get the paths to the necessary data files - land sea mask, sst map, sea ice concentration -include(joinpath(pkgdir(ClimaCoupler), "artifacts", "artifact_funcs.jl")) -sst_data = joinpath(sst_dataset_path(), "sst.nc") -sic_data = joinpath(sic_dataset_path(), "sic.nc") -mask_data = joinpath(mask_dataset_path(), "seamask.nc") - -## import coupler unitilies -include("coupler_utils/flux_calculator.jl") -include("coupler_utils/conservation_checker.jl") -include("coupler_utils/regridder.jl") -include("coupler_utils/masker.jl") -include("coupler_utils/calendar_timer.jl") -include("coupler_utils/general_helper.jl") -include("coupler_utils/bcfile_reader.jl") -include("coupler_utils/variable_definer.jl") -include("coupler_utils/diagnostics_gatherer.jl") -include("coupler_utils/offline_postprocessor.jl") - -#= -## Component Model Initialization -Here we set initial and boundary conditions for each component model. -=# - -#= -### Atmosphere -This uses the `ClimaAtmos.jl` driver, with parameterization options specified in the command line arguments. -=# -## init atmos model component -include("atmos/atmos_init.jl") -atmos_sim = atmos_init(FT, Y, integrator, params = params); - -#= -We use a common `Space` for all global surfaces. This enables the MPI processes to operate on the same columns in both -the atmospheric and surface components, so exchanges are parallelized. Note this is only possible when the -atmosphere and surface are of the same horizontal resolution. -=# -## init a 2D bounary space at the surface -boundary_space = atmos_sim.domain.face_space.horizontal_space - -# init land-sea mask -land_mask = land_sea_mask(FT, REGRID_DIR, comms_ctx, mask_data, "LSMASK", boundary_space, mono = mono_surface) - -## init surface (slab) model components -include("slab/slab_utils.jl") -include("bucket/bucket_init.jl") -include("slab/slab_init.jl") -include("slab_ocean/slab_init.jl") -include("slab_ice/slab_init.jl") - -#= -### Land -We use `ClimaLSM.jl`'s bucket model. -=# -land_sim = bucket_init( - FT, - FT.(tspan), - parsed_args["config"], - parsed_args["albedo_from_file"], - comms_ctx, - REGRID_DIR; - dt = FT(Δt_cpl), - space = boundary_space, - saveat = FT(saveat), -) - -#= -### Ocean and Sea Ice -In the `AMIP` mode, all ocean properties are prescribed from a file, while sea-ice temperatures are calculated using observed -SIC and assuming a 2m thickness of the ice. - -In the `SlabPlanet` mode, all ocean and sea ice are dynamical models, namely thermal slabs, with different parameters. -=# - -@info mode_name -if mode_name == "amip" - @info "AMIP boundary conditions - do not expect energy conservation" - - ## ocean - SST_info = bcfile_info_init( - FT, - comms_ctx, - sst_data, - "SST", - boundary_space, - interpolate_daily = true, - scaling_function = clean_sst, ## convert to Kelvin - land_mask = land_mask, - date0 = date0, - mono = mono_surface, - ) - - update_midmonth_data!(date0, SST_info) - SST_init = interpolate_midmonth_to_daily(date0, SST_info) - ocean_params = OceanSlabParameters(FT(20), FT(1500.0), FT(800.0), FT(280.0), FT(1e-3), FT(1e-5), FT(0.06)) - ocean_sim = (; - integrator = (; - u = (; T_sfc = SST_init), - p = (; params = ocean_params, ocean_mask = (FT(1) .- land_mask)), - SST_info = SST_info, - ) - ) - ## sea ice - SIC_info = bcfile_info_init( - FT, - comms_ctx, - sic_data, - "SEAICE", - boundary_space, - interpolate_daily = true, - scaling_function = clean_sic, ## convert to fractions - land_mask = land_mask, - date0 = date0, - mono = mono_surface, - ) - update_midmonth_data!(date0, SIC_info) - SIC_init = interpolate_midmonth_to_daily(date0, SIC_info) - ice_mask = get_ice_mask.(SIC_init, mono_surface) - ice_sim = ice_init(FT; tspan = tspan, dt = Δt_cpl, space = boundary_space, saveat = saveat, ice_mask = ice_mask) - mode_specifics = (; name = mode_name, SST_info = SST_info, SIC_info = SIC_info) - -elseif mode_name == "slabplanet" - ## ocean - ocean_sim = ocean_init( - FT; - tspan = tspan, - dt = Δt_cpl, - space = boundary_space, - saveat = saveat, - ocean_mask = (FT(1) .- land_mask), ## NB: this ocean mask includes areas covered by sea ice (unlike the one contained in the cs) - ) - - ## sea ice - ice_sim = (; - integrator = (; - u = (; T_sfc = ClimaCore.Fields.ones(boundary_space)), - p = (; params = ocean_sim.params, ice_mask = ClimaCore.Fields.zeros(boundary_space)), - ) - ) - mode_specifics = (; name = mode_name, SST_info = nothing, SIC_info = nothing) -end - -#= -## Coupler Initialization -The coupler needs to contain exchange information, manage the calendar and be able to access all component models. It can also optionally -save online diagnostics. These are all initialized here and saved in a global `CouplerSimulation` struct, `cs`. -=# - -## coupler exchange fields -coupler_field_names = (:T_S, :z0m_S, :z0b_S, :ρ_sfc, :q_sfc, :albedo, :beta, :F_A, :F_E, :F_R, :P_liq, :P_snow) -coupler_fields = - NamedTuple{coupler_field_names}(ntuple(i -> ClimaCore.Fields.zeros(boundary_space), length(coupler_field_names))) - -## model simulations -model_sims = (atmos_sim = atmos_sim, ice_sim = ice_sim, land_sim = land_sim, ocean_sim = ocean_sim); - -## dates -dates = (; date = [date], date0 = [date0], date1 = [Dates.firstdayofmonth(date0)]) - -#= -### Online Diagnostics -User can write custom diagnostics in the `coupler_utils/variable_definer.jl`. -=# -## 3d diagnostics -monthly_3d_diags_names = (:T, :u, :q_tot) -monthly_3d_diags = (; - fields = NamedTuple{monthly_3d_diags_names}( - ntuple(i -> ClimaCore.Fields.zeros(atmos_sim.domain.center_space), length(monthly_3d_diags_names)), - ), - ct = [0], -) -## 2d diagnostics -monthly_2d_diags_names = (:precipitation, :toa, :T_sfc) -monthly_2d_diags = (; - fields = NamedTuple{monthly_2d_diags_names}( - ntuple(i -> ClimaCore.Fields.zeros(boundary_space), length(monthly_2d_diags_names)), - ), - ct = [0], -) - -## coupler simulation -cs = CouplerSimulation{FT}( - comms_ctx, - tspan, - dates, - boundary_space, - parsed_args, - integrator.t, - FT(Δt_cpl), - (; land = land_mask, ocean = zeros(boundary_space), ice = zeros(boundary_space)), - coupler_fields, - model_sims, - mode_specifics, - monthly_3d_diags, - monthly_2d_diags, -); - -#= -## Initial States Exchange -=# -## share states between models -include("./push_pull.jl") -atmos_pull!(cs) -parsed_args["ode_algo"] == "ARS343" ? step!(atmos_sim.integrator, Δt_cpl, true) : nothing -atmos_push!(cs) -land_pull!(cs) - -## reinitialize (TODO: avoid with interfaces) -reinit!(atmos_sim.integrator) -reinit!(land_sim.integrator) -mode_name == "amip" ? (ice_pull!(cs), reinit!(ice_sim.integrator)) : nothing -mode_name == "slabplanet" ? (ocean_pull!(cs), reinit!(ocean_sim.integrator)) : nothing - -#= -## Initialize Conservation Checks -=# -## init conservation info collector -if !is_distributed && energy_check && mode_name == "slabplanet" - conservation_check = OnlineConservationCheck([], [], [], [], [], [], []) - check_conservation(conservation_check, cs) -end - -#= -## Coupling Loop -=# -function solve_coupler!(cs, energy_check) - @info "Starting coupling loop" - - @unpack model_sims, Δt_cpl, tspan = cs - @unpack atmos_sim, land_sim, ocean_sim, ice_sim = model_sims - - ## step in time - walltime = @elapsed for t in ((tspan[1] + Δt_cpl):Δt_cpl:tspan[end]) - - cs.dates.date[1] = current_date(cs, t) # if not global, `date` is not updated. - - ## print date on the first of month - @calendar_callback :(@show(cs.dates.date[1])) cs.dates.date[1] cs.dates.date1[1] - - if cs.mode.name == "amip" - - ## monthly read of boundary condition data for SST and SIC - @calendar_callback :(update_midmonth_data!(cs.dates.date[1], cs.mode.SST_info)) cs.dates.date[1] next_date_in_file( - cs.mode.SST_info, - ) - SST = ocean_sim.integrator.u.T_sfc .= interpolate_midmonth_to_daily(cs.dates.date[1], cs.mode.SST_info) - @calendar_callback :(update_midmonth_data!(cs.dates.date[1], cs.mode.SIC_info)) cs.dates.date[1] next_date_in_file( - cs.mode.SIC_info, - ) - SIC = interpolate_midmonth_to_daily(cs.dates.date[1], cs.mode.SIC_info) - - ice_mask = ice_sim.integrator.p.ice_mask .= get_ice_mask.(SIC_init, mono_surface) - - ## accumulate diagnostics at each timestep - accumulate_diags(collect_diags(cs, propertynames(cs.monthly_3d_diags.fields)), cs.monthly_3d_diags) - accumulate_diags(collect_diags(cs, propertynames(cs.monthly_2d_diags.fields)), cs.monthly_2d_diags) - - ## save and reset monthly averages - @calendar_callback :( - map(x -> x ./= cs.monthly_3d_diags.ct[1], cs.monthly_3d_diags.fields), - save_hdf5( - cs.comms_ctx, - cs.monthly_3d_diags.fields, - cs.dates.date[1], - COUPLER_OUTPUT_DIR, - name_tag = "3d_", - ), - map(x -> x .= FT(0), cs.monthly_3d_diags.fields), - cs.monthly_3d_diags.ct .= FT(0), - ) cs.dates.date[1] cs.dates.date1[1] - @calendar_callback :( - map(x -> x ./= cs.monthly_2d_diags.ct[1], cs.monthly_2d_diags.fields), - save_hdf5( - cs.comms_ctx, - cs.monthly_2d_diags.fields, - cs.dates.date[1], - COUPLER_OUTPUT_DIR, - name_tag = "2d_", - ), - map(x -> x .= FT(0), cs.monthly_2d_diags.fields), - cs.monthly_2d_diags.ct .= FT(0), - ) cs.dates.date[1] cs.dates.date1[1] - - end - - ## run component models sequentially for one coupling timestep (Δt_cpl) - ## 1. atmos - ClimaComms.barrier(comms_ctx) - - atmos_pull!(cs) - step!(atmos_sim.integrator, t - atmos_sim.integrator.t, true) # NOTE: instead of Δt_cpl, to avoid accumulating roundoff error - atmos_push!(cs) - - ## 2. land - land_pull!(cs) - step!(land_sim.integrator, t - land_sim.integrator.t, true) - - ## 3. ocean - if cs.mode.name == "slabplanet" - ocean_pull!(cs) - step!(ocean_sim.integrator, t - ocean_sim.integrator.t, true) - end - - ## 4. sea ice - if cs.mode.name == "amip" - ice_pull!(cs) - step!(ice_sim.integrator, t - ice_sim.integrator.t, true) - end - - ## compute global energy - if !simulation.is_distributed && energy_check && cs.mode.name == "slabplanet" - check_conservation(conservation_check, cs) - end - - ## step to the next calendar month - @calendar_callback :(cs.dates.date1[1] += Dates.Month(1)) cs.dates.date[1] cs.dates.date1[1] - - end - @show walltime - - return cs -end - -## run the coupled simulation -solve_coupler!(cs, energy_check); - -#= -## Postprocessing -Currently all postprocessing is performed using the root process only. -=# - -if ClimaComms.iamroot(comms_ctx) - isdir(COUPLER_OUTPUT_DIR * "_artifacts") ? nothing : mkpath(COUPLER_OUTPUT_DIR * "_artifacts") - - ## energy check plots - if !is_distributed && energy_check && cs.mode.name == "slabplanet" - @info "Energy Check" - plot_global_energy( - conservation_check, - cs, - joinpath(COUPLER_OUTPUT_DIR * "_artifacts", "total_energy_bucket.png"), - joinpath(COUPLER_OUTPUT_DIR * "_artifacts", "total_energy_log_bucket.png"), - ) - end - - ## sample animations - if !is_distributed && parsed_args["anim"] - @info "Animations" - include("coupler_utils/viz_explorer.jl") - plot_anim(cs, COUPLER_OUTPUT_DIR * "_artifacts") - end - - ## plotting AMIP results - if cs.mode.name == "amip" - @info "AMIP plots" - - include("coupler_utils/plotter.jl") - - ## ClimaESM - include("coupler_utils/amip_visualizer.jl") - post_spec = (; - T = (:regridded_3d, :zonal_mean), - u = (:regridded_3d, :zonal_mean), - q_tot = (:regridded_3d, :zonal_mean), - toa = (:regridded_2d, :horizontal_2d), - precipitation = (:regridded_2d, :horizontal_2d), - T_sfc = (:regridded_2d, :horizontal_2d), - ) - - plot_spec = (; - T = (; clims = (190, 320), units = "K"), - u = (; clims = (-50, 50), units = "m/s"), - q_tot = (; clims = (0, 50), units = "g/kg"), - toa = (; clims = (-250, 210), units = "W/m^2"), - precipitation = (clims = (0, 1e-6), units = "kg/m^2/s"), - T_sfc = (clims = (225, 310), units = "K"), - ) - amip_paperplots( - post_spec, - plot_spec, - COUPLER_OUTPUT_DIR, - files_root = ".monthly", - output_dir = COUPLER_OUTPUT_DIR * "_artifacts", - ) - - ## NCEP reanalysis - @info "NCEP plots" - include("coupler_utils/ncep_visualizer.jl") - ncep_post_spec = (; - T = (:zonal_mean,), - u = (:zonal_mean,), - q_tot = (:zonal_mean,), - toa = (:horizontal_2d,), - precipitation = (:horizontal_2d,), - T_sfc = (:horizontal_2d,), - ) - ncep_plot_spec = plot_spec - ncep_paperplots( - ncep_post_spec, - ncep_plot_spec, - COUPLER_OUTPUT_DIR, - output_dir = COUPLER_OUTPUT_DIR * "_artifacts", - month_date = cs.dates.date[1], - ) ## plot data that correspond to the model's last save_hdf5 call (i.e., last month) - end - - ## clean up - rm(COUPLER_OUTPUT_DIR; recursive = true, force = true) -end - -#= -## Temporary Unit Tests -To be moved to `test/` -=# -if !is_distributed && cs.mode.name == "amip" - @info "Unit Tests" - include("coupler_utils/unit_tester.jl") -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_driver_modular.jl b/experiments/AMIP/moist_mpi_earth/coupler_driver_modular.jl deleted file mode 100644 index 94c4e67cf0..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_driver_modular.jl +++ /dev/null @@ -1,527 +0,0 @@ -include("mpi/mpi_init.jl") # setup MPI context for distributed runs #hide - -# # AMIP Driver - -#= -## Overview - -AMIP is a standard experimental protocol of the Program for Climate Model Diagnosis & Intercomparison (PCMDI). -It is used as a model benchmark for the atmospheric and land model components, while sea-surface temperatures (SST) and sea-ice concentration (SIC) -are prescribed using time-interpolations between monthly observed data. We use standard data files with original sources: -- SST and SIC: https://gdex.ucar.edu/dataset/158_asphilli.html -- land-sea mask: https://www.ncl.ucar.edu/Applications/Data/#cdf - -For more information, see the PCMDI's specifications for [AMIP I](https://pcmdi.github.io/mips/amip/) and [AMIP II](https://pcmdi.github.io/mips/amip2/). - -This driver contains two modes. The full `AMIP` mode and a `SlabPlanet` (all surfaces are thermal slabs) mode. Since `AMIP` is not a closed system, the -`SlabPlanet` mode is useful for checking conservation properties of the coupling. - -=# - -#= -## Start Up -Before starting Julia, ensure your environment is properly set up: -```julia -module purge -module load julia/1.8.1 openmpi/4.1.1 hdf5/1.12.1-ompi411 #netcdf-c/4.6.1 - -export CLIMACORE_DISTRIBUTED="MPI" #include if using MPI, otherwise leave empty -export JUlIA_MPI_BINARY="system" -export JULIA_HDF5_PATH="" -``` - -Next instantiate/build all packages listed in `Manifest.toml`: -```julia -julia --project -e 'using Pkg; Pkg.instantiate(); Pkg.build()' -julia --project -e 'using Pkg; Pkg.build("MPI"); Pkg.build("HDF5")' -``` - -The `coupler_driver.jl` is now ready to be run. You can run a SLURM job (e.g., run `sbatch sbatch_job.sh` from the terminal), or -you can run directly from the Julia REPL. The latter is recommended for debugging of lightweight simulations, and should be run -with threading enabled: -```julia -julia --project --threads 8 -``` -=# - -#= -## Initialization -Here we import standard Julia packages, ClimaESM packages, parse in command-line arguments (if none are specified then the defaults in `cli_options.jl` apply). -We then specify the input data file names. If these are not already downloaded, include `artifacts/download_artifacts.jl`. -=# - -import SciMLBase: step! -using OrdinaryDiffEq -using OrdinaryDiffEq: ODEProblem, solve, SSPRK33, savevalues!, Euler -using LinearAlgebra -import Test: @test -using Dates -using UnPack -using Plots - -using ClimaCore.Utilities: half, PlusHalf -using ClimaCore: InputOutput, Fields - - -if !(@isdefined parsed_args) - include("cli_options.jl") - parsed_args = parse_commandline(argparse_settings()) -end - -## modify parsed args for fast testing from REPL #hide -if isinteractive() - parsed_args["coupled"] = true #hide - parsed_args["surface_scheme"] = "monin_obukhov" #hide - parsed_args["moist"] = "equil" #hide - parsed_args["vert_diff"] = true #hide - parsed_args["rad"] = "gray" #hide - parsed_args["energy_check"] = true #hide - parsed_args["mode_name"] = "slabplanet" #hide - parsed_args["t_end"] = "10days" #hide - parsed_args["dt_save_to_sol"] = "3600secs" #hide - parsed_args["dt_cpl"] = 200 #hide - parsed_args["dt"] = "200secs" #hide - parsed_args["mono_surface"] = true #hide - parsed_args["h_elem"] = 4 #hide - # parsed_args["dt_save_restart"] = "5days" #hide - parsed_args["precip_model"] = "0M" #hide -end - -## read in some parsed command line arguments -mode_name = parsed_args["mode_name"] -run_name = parsed_args["run_name"] -energy_check = parsed_args["energy_check"] -if !(@isdefined FT) - const FT = parsed_args["FLOAT_TYPE"] == "Float64" ? Float64 : Float32 -end -land_sim_name = "bucket" -t_end = Int(time_to_seconds(parsed_args["t_end"])) -tspan = (Int(0), t_end) -Δt_cpl = Int(parsed_args["dt_cpl"]) -saveat = time_to_seconds(parsed_args["dt_save_to_sol"]) -date0 = date = DateTime(parsed_args["start_date"], dateformat"yyyymmdd") -mono_surface = parsed_args["mono_surface"] - -import ClimaCoupler -import ClimaCoupler.Regridder: land_sea_mask, update_masks!, combine_surfaces!, dummmy_remap!, binary_mask -import ClimaCoupler.ConservationChecker: - EnergyConservationCheck, WaterConservationCheck, check_conservation!, plot_global_conservation -import ClimaCoupler.Utilities: CoupledSimulation, float_type, swap_space! -import ClimaCoupler.BCReader: - bcfile_info_init, float_type_bcf, update_midmonth_data!, next_date_in_file, interpolate_midmonth_to_daily -import ClimaCoupler.TimeManager: current_date, datetime_to_strdate, trigger_callback, Monthly, EveryTimestep -import ClimaCoupler.Diagnostics: get_var, init_diagnostics, accumulate_diagnostics!, save_diagnostics, TimeMean -import ClimaCoupler.PostProcessor: postprocess - -pkg_dir = pkgdir(ClimaCoupler) -COUPLER_OUTPUT_DIR = joinpath(pkg_dir, "experiments/AMIP/moist_mpi_earth/output", joinpath(mode_name, run_name)) -mkpath(COUPLER_OUTPUT_DIR) - -REGRID_DIR = joinpath(COUPLER_OUTPUT_DIR, "regrid_tmp/") -mkpath(REGRID_DIR) - -@info COUPLER_OUTPUT_DIR -@info parsed_args - -## get the paths to the necessary data files - land sea mask, sst map, sea ice concentration -include(joinpath(pkgdir(ClimaCoupler), "artifacts", "artifact_funcs.jl")) -sst_data = joinpath(sst_dataset_path(), "sst.nc") -sic_data = joinpath(sic_dataset_path(), "sic.nc") -mask_data = joinpath(mask_dataset_path(), "seamask.nc") - -## import coupler utils -include("coupler_utils/flux_calculator.jl") - -## user-specified diagnostics -include("user_diagnostics.jl") - -#= -## Component Model Initialization -Here we set initial and boundary conditions for each component model. -=# - -#= -### Atmosphere -This uses the `ClimaAtmos.jl` driver, with parameterization options specified in the command line arguments. -=# -## init atmos model component -include("atmos/atmos_init.jl") -atmos_sim = atmos_init(FT, Y, integrator, params = params); - -#= -We use a common `Space` for all global surfaces. This enables the MPI processes to operate on the same columns in both -the atmospheric and surface components, so exchanges are parallelized. Note this is only possible when the -atmosphere and surface are of the same horizontal resolution. -=# -## init a 2D bounary space at the surface -boundary_space = atmos_sim.domain.face_space.horizontal_space - -# init land-sea mask -land_mask = land_sea_mask(FT, REGRID_DIR, comms_ctx, mask_data, "LSMASK", boundary_space, mono = mono_surface) - -## init surface (slab) model components -include("slab/slab_utils.jl") -include("bucket/bucket_init.jl") -include("slab/slab_init.jl") -include("slab_ocean/slab_init.jl") -include("slab_ice/slab_init.jl") - -#= -### Land -We use `ClimaLSM.jl`'s bucket model. -=# -land_sim = bucket_init( - FT, - FT.(tspan), - parsed_args["config"], - parsed_args["albedo_from_file"], - comms_ctx, - REGRID_DIR; - dt = FT(Δt_cpl), - space = boundary_space, - saveat = FT(saveat), -) - -#= -### Ocean and Sea Ice -In the `AMIP` mode, all ocean properties are prescribed from a file, while sea-ice temperatures are calculated using observed -SIC and assuming a 2m thickness of the ice. - -In the `SlabPlanet` mode, all ocean and sea ice are dynamical models, namely thermal slabs, with different parameters. -=# - -@info mode_name -if mode_name == "amip" - @info "AMIP boundary conditions - do not expect energy conservation" - - ## ocean - SST_info = bcfile_info_init( - FT, - REGRID_DIR, - sst_data, - "SST", - boundary_space, - comms_ctx, - interpolate_daily = true, - scaling_function = clean_sst, ## convert to Kelvin - land_mask = land_mask, - date0 = date0, - mono = mono_surface, - ) - - update_midmonth_data!(date0, SST_info) - SST_init = interpolate_midmonth_to_daily(date0, SST_info) - ocean_params = OceanSlabParameters(FT(20), FT(1500.0), FT(800.0), FT(280.0), FT(1e-3), FT(1e-5), FT(0.06)) - ocean_sim = (; - integrator = (; - u = (; T_sfc = SST_init), - p = (; params = ocean_params, ocean_mask = (FT(1) .- land_mask)), - SST_info = SST_info, - ) - ) - ## sea ice - SIC_info = bcfile_info_init( - FT, - REGRID_DIR, - sic_data, - "SEAICE", - boundary_space, - comms_ctx, - interpolate_daily = true, - scaling_function = clean_sic, ## convert to fractions - land_mask = land_mask, - date0 = date0, - mono = mono_surface, - ) - update_midmonth_data!(date0, SIC_info) - SIC_init = interpolate_midmonth_to_daily(date0, SIC_info) - ice_mask = get_ice_mask.(SIC_init, mono_surface) - ice_sim = ice_init(FT; tspan = tspan, dt = Δt_cpl, space = boundary_space, saveat = saveat, ice_mask = ice_mask) - mode_specifics = (; name = mode_name, SST_info = SST_info, SIC_info = SIC_info) - -elseif mode_name == "slabplanet" - ## ocean - ocean_sim = ocean_init( - FT; - tspan = tspan, - dt = Δt_cpl, - space = boundary_space, - saveat = saveat, - ocean_mask = (FT(1) .- land_mask), ## NB: this ocean mask includes areas covered by sea ice (unlike the one contained in the cs) - ) - - ## sea ice - ice_sim = (; - integrator = (; - u = (; T_sfc = ClimaCore.Fields.ones(boundary_space)), - p = (; params = ocean_sim.params, ice_mask = ClimaCore.Fields.zeros(boundary_space)), - ) - ) - mode_specifics = (; name = mode_name, SST_info = nothing, SIC_info = nothing) -end - -#= -## Coupler Initialization -The coupler needs to contain exchange information, manage the calendar and be able to access all component models. It can also optionally -save online diagnostics. These are all initialized here and saved in a global `CouplerSimulation` struct, `cs`. -=# - -## coupler exchange fields -coupler_field_names = - (:T_S, :z0m_S, :z0b_S, :ρ_sfc, :q_sfc, :albedo, :beta, :F_A, :F_E, :F_R, :P_liq, :P_snow, :F_R_TOA, :P_net) -coupler_fields = - NamedTuple{coupler_field_names}(ntuple(i -> ClimaCore.Fields.zeros(boundary_space), length(coupler_field_names))) - -## model simulations -model_sims = (atmos_sim = atmos_sim, ice_sim = ice_sim, land_sim = land_sim, ocean_sim = ocean_sim); - -## dates -dates = (; date = [date], date0 = [date0], date1 = [Dates.firstdayofmonth(date0)], new_month = [false]) - -#= -### Online Diagnostics -User can write custom diagnostics in the `user_diagnostics.jl`. -=# -monthly_3d_diags = init_diagnostics( - (:T, :u, :q_tot), - atmos_sim.domain.center_space; - save = Monthly(), - operations = (; accumulate = TimeMean([Int(0)])), - output_dir = COUPLER_OUTPUT_DIR, - name_tag = "monthly_mean_3d_", -) - -monthly_2d_diags = init_diagnostics( - (:precipitation, :toa, :T_sfc), - boundary_space; - save = Monthly(), - operations = (; accumulate = TimeMean([Int(0)])), - output_dir = COUPLER_OUTPUT_DIR, - name_tag = "monthly_mean_2d_", -) - -diagnostics = (monthly_3d_diags, monthly_2d_diags) - -#= -## Initialize Conservation Checks -=# -## init conservation info collector -conservation_checks = nothing -if energy_check - @assert( - mode_name == "slabplanet" && !simulation.is_distributed, - "Only non-distributed slabplanet allowable for energy_check" - ) - conservation_checks = - (; energy = EnergyConservationCheck([], [], [], [], [], []), water = WaterConservationCheck([], [], [], [])) -end - -## coupler simulation -cs = CoupledSimulation{FT}( - comms_ctx, - dates, - boundary_space, - coupler_fields, - parsed_args, - conservation_checks, - [tspan[1], tspan[2]], - integrator.t, - Δt_cpl, - (; land = land_mask, ocean = zeros(boundary_space), ice = zeros(boundary_space)), - model_sims, - mode_specifics, - diagnostics, -); - - -#= -## Initial States Exchange -=# -## share states between models -include("./push_pull.jl") -atmos_pull!(cs) -parsed_args["ode_algo"] == "ARS343" ? step!(atmos_sim.integrator, Δt_cpl, true) : nothing -atmos_push!(cs) -land_pull!(cs) - -## reinitialize (TODO: avoid with interfaces) -reinit!(atmos_sim.integrator) -reinit!(land_sim.integrator) -mode_name == "amip" ? (ice_pull!(cs), reinit!(ice_sim.integrator)) : nothing -mode_name == "slabplanet" ? (ocean_pull!(cs), reinit!(ocean_sim.integrator)) : nothing - -#= -## Coupling Loop -=# -function solve_coupler!(cs) - @info "Starting coupling loop" - - @unpack model_sims, Δt_cpl, tspan = cs - @unpack atmos_sim, land_sim, ocean_sim, ice_sim = model_sims - - ## step in time - walltime = @elapsed for t in ((tspan[1] + Δt_cpl):Δt_cpl:tspan[end]) - - cs.dates.date[1] = current_date(cs, t) # if not global, `date` is not updated. - - ## print date on the first of month - if cs.dates.date[1] >= cs.dates.date1[1] - @show(cs.dates.date[1]) - end - - if cs.mode.name == "amip" - - ## monthly read of boundary condition data for SST and SIC - if cs.dates.date[1] >= next_date_in_file(cs.mode.SST_info) - update_midmonth_data!(cs.dates.date[1], cs.mode.SST_info) - end - SST = ocean_sim.integrator.u.T_sfc .= interpolate_midmonth_to_daily(cs.dates.date[1], cs.mode.SST_info) - - if cs.dates.date[1] >= next_date_in_file(cs.mode.SIC_info) - update_midmonth_data!(cs.dates.date[1], cs.mode.SIC_info) - end - SIC = interpolate_midmonth_to_daily(cs.dates.date[1], cs.mode.SIC_info) - - ice_mask = ice_sim.integrator.p.ice_mask .= get_ice_mask.(SIC_init, mono_surface) - - ## calculate and accumulate diagnostics at each timestep - accumulate_diagnostics!(cs) - - ## save and reset monthly averages - save_diagnostics(cs) - - end - - ## compute global energy - !isnothing(cs.conservation_checks) ? check_conservation!(cs, get_slab_energy, get_land_energy) : nothing - - ## run component models sequentially for one coupling timestep (Δt_cpl) - ## 1. atmos - ClimaComms.barrier(comms_ctx) - - atmos_pull!(cs) - step!(atmos_sim.integrator, t - atmos_sim.integrator.t, true) # NOTE: instead of Δt_cpl, to avoid accumulating roundoff error - atmos_push!(cs) - - ## 2. land - land_pull!(cs) - step!(land_sim.integrator, t - land_sim.integrator.t, true) - - ## 3. ocean - if cs.mode.name == "slabplanet" - ocean_pull!(cs) - step!(ocean_sim.integrator, t - ocean_sim.integrator.t, true) - end - - ## 4. sea ice - if cs.mode.name == "amip" - ice_pull!(cs) - step!(ice_sim.integrator, t - ice_sim.integrator.t, true) - end - - ## step to the next calendar month - if trigger_callback(cs, Monthly()) - cs.dates.date1[1] += Dates.Month(1) - end - - end - @show walltime - - return cs -end - -## exit if running performance anaysis #hide -if haskey(ENV, "CI_PERF_SKIP_COUPLED_RUN") #hide - throw(:exit_profile_init) #hide -end #hide - -## run the coupled simulation -solve_coupler!(cs); - -#= -## Postprocessing -Currently all postprocessing is performed using the root process only. -=# - -if ClimaComms.iamroot(comms_ctx) - isdir(COUPLER_OUTPUT_DIR * "_artifacts") ? nothing : mkpath(COUPLER_OUTPUT_DIR * "_artifacts") - - ## energy check plots - if !isnothing(cs.conservation_checks) && cs.mode.name == "slabplanet" - @info "Conservation Check Plots" - plot_global_conservation( - cs.conservation_checks.energy, - cs, - figname1 = joinpath(COUPLER_OUTPUT_DIR * "_artifacts", "total_energy_bucket.png"), - figname2 = joinpath(COUPLER_OUTPUT_DIR * "_artifacts", "total_energy_log_bucket.png"), - ) - plot_global_conservation( - cs.conservation_checks.water, - cs, - figname1 = joinpath(COUPLER_OUTPUT_DIR * "_artifacts", "total_water_bucket.png"), - figname2 = joinpath(COUPLER_OUTPUT_DIR * "_artifacts", "total_water_log_bucket.png"), - ) - end - - ## sample animations - if !is_distributed && parsed_args["anim"] - @info "Animations" - include("coupler_utils/viz_explorer.jl") - plot_anim(cs, COUPLER_OUTPUT_DIR * "_artifacts") - end - - ## plotting AMIP results - if cs.mode.name == "amip" - @info "AMIP plots" - - ## ClimaESM - include("user_plots/amip_visualizer.jl") - post_spec = (; - T = (:regrid, :zonal_mean), - u = (:regrid, :zonal_mean), - q_tot = (:regrid, :zonal_mean), - toa = (:regrid, :horizontal_slice), - precipitation = (:regrid, :horizontal_slice), - T_sfc = (:regrid, :horizontal_slice), - ) - - plot_spec = (; - T = (; clims = (190, 320), units = "K"), - u = (; clims = (-50, 50), units = "m/s"), - q_tot = (; clims = (0, 50), units = "g/kg"), - toa = (; clims = (-250, 210), units = "W/m^2"), - precipitation = (clims = (0, 1e-6), units = "kg/m^2/s"), - T_sfc = (clims = (225, 310), units = "K"), - ) - amip_paperplots( - post_spec, - plot_spec, - COUPLER_OUTPUT_DIR, - files_root = ".monthly", - output_dir = COUPLER_OUTPUT_DIR * "_artifacts", - ) - - ## NCEP reanalysis - @info "NCEP plots" - include("user_plots/ncep_visualizer.jl") - ncep_post_spec = (; - T = (:zonal_mean,), - u = (:zonal_mean,), - q_tot = (:zonal_mean,), - toa = (:horizontal_slice,), - precipitation = (:horizontal_slice,), - T_sfc = (:horizontal_slice,), - ) - ncep_plot_spec = plot_spec - ncep_paperplots( - ncep_post_spec, - ncep_plot_spec, - COUPLER_OUTPUT_DIR, - output_dir = COUPLER_OUTPUT_DIR * "_artifacts", - month_date = cs.dates.date[1], - ) ## plot data that correspond to the model's last save_hdf5 call (i.e., last month) - end - - ## clean up - rm(COUPLER_OUTPUT_DIR; recursive = true, force = true) -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/amip_visualizer.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/amip_visualizer.jl deleted file mode 100644 index b3174020d3..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/amip_visualizer.jl +++ /dev/null @@ -1,62 +0,0 @@ -""" - amip_paperplots(post_spec, plot_spec, files_dir; output_dir = ".", files_root = ".hdf5", fig_name = "amip_paperplots") - -Coordinates the postprocessing and plotting of sample fields (specified in `post_spec`) -of the last monthly mean file. Any specific plot customization should be done here. -""" -function amip_paperplots( - post_spec, - plot_spec, - files_dir; - output_dir = ".", - files_root = ".hdf5", - fig_name = "amip_paperplots", -) - - diags_names = propertynames(post_spec) - - all_plots = [] - for name in diags_names - @info name - - # extract data - diag_data = read_latest_model_data(name, files_dir, files_root) - - # postprocess - post_data = postprocess(name, diag_data, getproperty(post_spec, name)) - - # create individual plots - p = plot( - post_data, - zmd_params = (; getproperty(plot_spec, name)...), - hsd_params = (; getproperty(plot_spec, name)...), - ) - - push!(all_plots, p) - end - - # combine plots and save figure - save_fig = Plots.plot( - all_plots..., - size = (1500, 800), - right_margin = 12Plots.mm, - left_margin = 12Plots.mm, - bottom_margin = 12Plots.mm, - top_margin = 12Plots.mm, - ) - - Plots.png(save_fig, joinpath(output_dir, fig_name * ".png")) - - return all_plots -end - -function read_latest_model_data(name, filedir, root) - - varfile_root = @sprintf "%s%s" string(name) root - filename = glob("*" * varfile_root * "*", filedir)[end] - - hdfreader = InputOutput.HDF5Reader(filename) - hdf5_data = InputOutput.read_field(hdfreader, string(name)) -end - -print_formatted(fmt, args...) = @eval @printf($fmt, $(args...)) diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/bcfile_reader.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/bcfile_reader.jl deleted file mode 100644 index 9b825b97b2..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/bcfile_reader.jl +++ /dev/null @@ -1,203 +0,0 @@ -# bcfile_reader -# - coordinates reading of boundary conditions from NetCDF files, as well as regridding calls and temporal interpolations from monthly to daily intervals - -# IO - init -""" - BCDataInfo - -Stores information specific to each boundary condition from a file and each variable. -The inputs are: - comms_ctx::X # communications context used for MPI - datafile_cgll::S # file containing all regridded fields - varname::V # name of the variable - all_dates::D # all dates contained in the original data file - monthly_fields::C # Tuple of the two monthly fields, that will be used for the daily interpolation - scaling_function::O # function that scales, offsets or transforms the raw variable - land_mask::M # mask with 1 = land, 0 = ocean / sea-ice - segment_idx::Vector{Int} # index of the monthly data in the file - segment_idx0::Vector{Int} # `segment_idx` of the file data that is closest to date0 - segment_length::Vector{Int} # length of each month segment (used in the daily interpolation) - interpolate_daily::Bool # switch to trigger daily interpolation - -""" -struct BCFileInfo{FT, X, S, V, D, C, O, M} - comms_ctx::X - hd_outfile_root::S - varname::V - all_dates::D - monthly_fields::C - scaling_function::O - land_mask::M - segment_idx::Vector{Int} - segment_idx0::Vector{Int} - segment_length::Vector{Int} - interpolate_daily::Bool -end - -BCFileInfo{FT}(args...) where {FT} = BCFileInfo{FT, typeof.(args[1:7])...}(args...) - -float_type_bcf(::BCFileInfo{FT}) where {FT} = FT - -""" - bcfile_info_init(FT, comms_ctx, datafile_rll, varname, boundary_space; interpolate_daily = false, segment_idx0 = [Int(1)], scaling_function = false) - -Regrids from lat-lon grid to cgll grid, saving the output in a new file, and returns the info packaged in a single struct -""" -function bcfile_info_init( - FT, - comms_ctx, - datafile_rll, - varname, - boundary_space; - interpolate_daily = false, - segment_idx0 = nothing, - scaling_function = no_scaling, - land_mask = nothing, - date0 = nothing, - mono = true, -) - - # regrid all times and save to hdf5 files - hd_outfile_root = varname * "_cgll" - if ClimaComms.iamroot(comms_ctx) - hdwrite_regridfile_rll_to_cgll( - comms_ctx, - datafile_rll, - varname, - boundary_space; - hd_outfile_root = hd_outfile_root, - mono = mono, - ) - end - ClimaComms.barrier(comms_ctx) - data_dates = load(joinpath(REGRID_DIR, hd_outfile_root * "_times.jld2"), "times") - - # init time tracking info - current_fields = Fields.zeros(FT, boundary_space), Fields.zeros(FT, boundary_space) - segment_length = [Int(0)] - - # unless the start file date is specified, find the closest one to the start date - segment_idx0 = - segment_idx0 != nothing ? segment_idx0 : - [argmin(abs.(parse(FT, datetime_to_strdate(date0)) .- parse.(FT, datetime_to_strdate.(data_dates[:]))))] - - return BCFileInfo{FT}( - comms_ctx, - hd_outfile_root, - varname, - data_dates, - current_fields, - scaling_function, - land_mask, - deepcopy(segment_idx0), - segment_idx0, - segment_length, - interpolate_daily, - ) - -end - -no_scaling(x, _info) = swap_space!(zeros(axes(_info.land_mask)), x) - -# IO - monthly -""" - update_midmonth_data!(date, bcf_info) - -Extracts boundary condition data from regridded (to model grid) NetCDF files (which times, depends on the specifications in the `bcf_info` struct). -""" -function update_midmonth_data!(date, bcf_info) - # monthly count - FT = float_type_bcf(bcf_info) - all_dates = bcf_info.all_dates - midmonth_idx = bcf_info.segment_idx[1] - midmonth_idx0 = bcf_info.segment_idx0[1] - monthly_fields = bcf_info.monthly_fields - outfile_root = bcf_info.hd_outfile_root - scaling_function = bcf_info.scaling_function - varname = bcf_info.varname - interpolate_daily = bcf_info.interpolate_daily - comms_ctx = bcf_info.comms_ctx - - ClimaComms.barrier(comms_ctx) - - - if (midmonth_idx == midmonth_idx0) && (Dates.days(date - all_dates[midmonth_idx]) < 0) # for init - midmonth_idx = bcf_info.segment_idx[1] -= Int(1) - midmonth_idx = midmonth_idx < Int(1) ? midmonth_idx + Int(1) : midmonth_idx - @warn "this time period is before BC data - using file from $(all_dates[midmonth_idx0])" - bcf_info.monthly_fields[1] .= scaling_function( - hdread_regridfile(comms_ctx, outfile_root, all_dates[Int(midmonth_idx0)], varname), - bcf_info, - ) - bcf_info.monthly_fields[2] .= deepcopy(bcf_info.monthly_fields[1]) - bcf_info.segment_length .= FT(0) - elseif Dates.days(date - all_dates[end - 1]) > 0 # for fini - @warn "this time period is after BC data - using file from $(all_dates[end - 1])" - bcf_info.monthly_fields[1] .= scaling_function( - hdread_regridfile(comms_ctx, outfile_root, all_dates[Int(length(all_dates))], varname), - bcf_info, - ) - bcf_info.monthly_fields[2] .= deepcopy(bcf_info.monthly_fields[1]) - bcf_info.segment_length .= FT(0) - elseif Dates.days(date - all_dates[Int(midmonth_idx + 1)]) > 2 # throw error when there are closer initial indices for the bc file data that matches this date0 - nearest_idx = - argmin(abs.(parse(FT, datetime_to_strdate(date)) .- parse.(FT, datetime_to_strdate.(all_dates[:])))) - @error "init data does not correspond to start date. Try initializing with `SIC_info.segment_idx = midmonth_idx = midmonth_idx0 = $nearest_idx` for this start date" # TODO: do this automatically w a warning - elseif Dates.days(date - all_dates[Int(midmonth_idx)]) > 0 # date crosses to the next month - midmonth_idx = bcf_info.segment_idx[1] += Int(1) - @warn "On $date updating monthly data files: mid-month dates = [ $(all_dates[Int(midmonth_idx)]) , $(all_dates[Int(midmonth_idx+1)]) ]" - bcf_info.segment_length .= (all_dates[Int(midmonth_idx + 1)] - all_dates[Int(midmonth_idx)]).value - bcf_info.monthly_fields[1] .= scaling_function( - hdread_regridfile(comms_ctx, outfile_root, all_dates[Int(midmonth_idx)], varname), - bcf_info, - ) - bcf_info.monthly_fields[2] .= scaling_function( - hdread_regridfile(comms_ctx, outfile_root, all_dates[Int(midmonth_idx + 1)], varname), - bcf_info, - ) - else - @error "Check boundary file specification" - end -end - -next_date_in_file(bcfile_info) = bcfile_info.all_dates[bcfile_info.segment_idx[1] + Int(1)] - -# IO - daily -""" - interpolate_midmonth_to_daily(date, bcf_info) - -Interpolates linearly between two `Fields` in the `bcf_info` struct, or returns the first Field if interpolation is switched off. -""" -function interpolate_midmonth_to_daily(date, bcf_info) - - if bcf_info.interpolate_daily && bcf_info.segment_length[1] > FT(0) - segment_length = bcf_info.segment_length - segment_idx = bcf_info.segment_idx - all_dates = bcf_info.all_dates - monthly_fields = bcf_info.monthly_fields - - return interpol.( - monthly_fields[1], - monthly_fields[2], - FT((date - all_dates[Int(segment_idx[1])]).value), - FT(segment_length[1]), - ) - else - return bcf_info.monthly_fields[1] - end -end - -""" - interpol(f1::FT, f2::FT, Δt_tt1::FT, Δt_t2t1::FT) where {FT} - -Performs linear interpolation of `f` at time `t` within a segment `Δt_t2t1 = (t2 - t1)`, of fields `f1` and `f2`, with `t2 > t1`. - -`Δt_tt1 = (t - t1)` -`f(t1) = f1` - -""" -function interpol(f1::FT, f2::FT, Δt_tt1::FT, Δt_t2t1::FT) where {FT} - interp_fraction = Δt_tt1 / Δt_t2t1 - @assert abs(interp_fraction) <= FT(1) "time interpolation weights must be <= 1, but `interp_fraction` = $interp_fraction" - return f1 * interp_fraction + f2 * (FT(1) - interp_fraction) -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/calendar_timer.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/calendar_timer.jl deleted file mode 100644 index cc624d67e9..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/calendar_timer.jl +++ /dev/null @@ -1,61 +0,0 @@ -# calendar timer -# - facilitates calendar functions and temporal interpolations - -""" - current_date(cs, t) - -Return the model date -""" -current_date(cs, t) = cs.dates.date0[1] + Dates.Second(t) - -""" - strdate_to_datetime(strdate) - -Convert from String ("YYYYMMDD") to Date format -""" -strdate_to_datetime(strdate::String) = - Dates.DateTime(parse(Int, strdate[1:4]), parse(Int, strdate[5:6]), parse(Int, strdate[7:8])) # required by the official AMIP input files - -""" - datetime_to_strdate(datetime) - -Convert from Date to String ("YYYYMMDD") format -""" -datetime_to_strdate(datetime::DateTime) = - string(Dates.year(datetime)) * - string(string(lpad(Dates.month(datetime), 2, "0"))) * - string(lpad(Dates.day(datetime), 2, "0")) - -""" - calendar_callback(ex, model_date, callback_date) - -Evaluate `ex` when `model_date` is on/after `callback_date` and do nothing otherwise -""" -macro calendar_callback(ex::Expr, model_date::Union{Symbol, Expr}, callback_date::Union{Symbol, Expr}) - quote - if ($model_date - $callback_date).value < FT(0) - nothing - else - eval($ex) - end - end -end - -# TODO -# - unit test for @calendar_callback - -# # test for @calendar_callback (TODO: modify and use when move to `src/`) -# Δt_cpl = 0.5 * 86400 -# tspan = (0,60* 86400) -# date0 = strdate_to_datetime("19000101") -# midmonth_dates = map(x -> date0 + Dates.Day(x), cumsum((15,31,29))) -# segment_idx = 1 -# for t in ((tspan[1] + Δt_cpl):Δt_cpl:tspan[end]) -# date = current_date(date0, t, FT) -# @show date -# next_month = midmonth_dates[segment_idx] -# @show next_month -# #calendar_callback( :(println(Dates.days(esc(curr_date) - esc(callback_date)) ) , segment_idx +=1 ), date, next_month) -# global expression = :(println(Dates.days(date - next_month) ) , segment_idx +=1 ) -# @calendar_callback( expression, date, next_month) -# end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/conservation_checker.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/conservation_checker.jl deleted file mode 100644 index d3488dfa19..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/conservation_checker.jl +++ /dev/null @@ -1,172 +0,0 @@ -# generalise this into coupler-specific function - -abstract type AbstractCheck end - -struct OnlineConservationCheck{A} <: AbstractCheck - ρe_tot_atmos::A - ρe_tot_land::A - ρe_tot_ocean::A - ρe_tot_seaice::A - toa_net_source::A - ice_base_source::A - friction_sink::A -end - -""" - check_conservation( - cc::OnlineConservationCheck, - coupler_sim, - radiation = true, - ) - -computes the total energy ∫ ρe dV of the various components -of the coupled simulations, and updates cc with the values. - -Note: in the future this should not use ``push!``. -""" -function check_conservation(cc::OnlineConservationCheck, coupler_sim) - @unpack model_sims, surface_masks = cs - @unpack atmos_sim, land_sim, ocean_sim, ice_sim = model_sims - radiation = integrator.p.radiation_model - - @assert ice_sim != nothing - @assert atmos_sim != nothing - - FT = eltype(coupler_sim.surface_masks.land) - - u_atm = atmos_sim.integrator.u.c.ρe_tot - - if land_sim !== nothing - e_per_area_land = zeros(axes(land_sim.integrator.u.bucket.W)) - get_land_energy(land_sim, e_per_area_land) - end - - u_ocn = - ocean_sim !== nothing ? swap_space!(zeros(coupler_sim.boundary_space), ocean_sim.integrator.u.T_sfc) : nothing - u_ice = ice_sim !== nothing ? swap_space!(zeros(coupler_sim.boundary_space), ice_sim.integrator.u.T_sfc) : nothing - - # global sums - atmos_e = sum(u_atm) - - # save radiation source - if radiation != nothing - face_space = axes(atmos_sim.integrator.u.f) - z = parent(Fields.coordinate_field(face_space).z) - Δz_top = round(FT(0.5) * (z[end, 1, 1, 1, 1] - z[end - 1, 1, 1, 1, 1])) - n_faces = length(z[:, 1, 1, 1, 1]) - - LWd_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_lw_flux_dn), face_space), - n_faces - half, - ) - LWu_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_lw_flux_up), face_space), - n_faces - half, - ) - SWd_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_sw_flux_dn), face_space), - n_faces - half, - ) - SWu_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_sw_flux_up), face_space), - n_faces - half, - ) - - radiation_sources = -sum(LWd_TOA .+ SWd_TOA .- LWu_TOA .- SWu_TOA) ./ Δz_top - radiation_sources_accum = - size(cc.toa_net_source)[1] > 0 ? cc.toa_net_source[end] + radiation_sources .* coupler_sim.Δt_cpl : - radiation_sources .* coupler_sim.Δt_cpl# accumulated radiation sources + sinks - push!(cc.toa_net_source, radiation_sources_accum) - end - - # save atmos - push!(cc.ρe_tot_atmos, atmos_e) - - # save land - parent(e_per_area_land) .= parent(e_per_area_land .* surface_masks.land) - land_e = land_sim !== nothing ? sum(e_per_area_land) : FT(0) - push!(cc.ρe_tot_land, land_e) - - # save sea ice - parent(u_ice) .= parent(u_ice .* surface_masks.ice) - seaice_e = ice_sim !== nothing ? sum(get_slab_energy(ice_sim, u_ice)) : FT(0) - push!(cc.ρe_tot_seaice, seaice_e) - - # save ocean - if ocean_sim != nothing - parent(u_ocn) .= parent(u_ocn .* surface_masks.ocean) - ocean_e = sum(get_slab_energy(ocean_sim, u_ocn)) - else - ocean_e = FT(0) - end - push!(cc.ρe_tot_ocean, ocean_e) - - # save surface friction sink - push!(cc.friction_sink, sum((ke_dissipation(atmos_sim)) .* coupler_sim.Δt_cpl)) # ρ d ke_friction / dt - -end -function ke_dissipation(sim) - drag_uv = - Geometry.UVVector.( - Geometry.Covariant12Vector.( - sim.integrator.p.ρ_dif_flux_uₕ.components.data.:1, - sim.integrator.p.ρ_dif_flux_uₕ.components.data.:2, - ) - ) - dot.(Geometry.UVVector.(level(sim.integrator.u.c.uₕ, 1)), drag_uv) .* level(sim.integrator.u.c.ρ, 1) -end - -import Plots -# https://github.com/jheinen/GR.jl/issues/278#issuecomment-587090846 -ENV["GKSwstype"] = "nul" - -""" - plot_global_energy(cc, - coupler_sim, - figname1 = "total_energy.png", - figname2 = "total_energy_log.png") - -Creates two plots: one showing fractional total energy change - over time on a log scale, -and the other showing the energy of each component as a function of time, -relative to the initial value. -""" -function plot_global_energy(cc, coupler_sim, figname1 = "total_energy.png", figname2 = "total_energy_log.png") - - times = 0:(coupler_sim.Δt_cpl):(atmos_sim.integrator.t) - diff_ρe_tot_atmos = (cc.ρe_tot_atmos .- cc.ρe_tot_atmos[1]) - diff_ρe_tot_slab = (cc.ρe_tot_land .- cc.ρe_tot_land[1]) - diff_ρe_tot_slab_seaice = (cc.ρe_tot_seaice .- cc.ρe_tot_seaice[1]) - diff_toa_net_source = (cc.toa_net_source .- cc.toa_net_source[1]) - # diff_friction_sink = (cc.friction_sink .- cc.friction_sink[1]) # currently, kinetic energy dissipation is neglected in total energy tendency - diff_ρe_tot_slab_ocean = (cc.ρe_tot_ocean .- cc.ρe_tot_ocean[1]) - - times_days = times ./ (24 * 60 * 60) - Plots.plot(times_days, diff_ρe_tot_atmos[1:length(times_days)], label = "atmos") - Plots.plot!(times_days, diff_ρe_tot_slab[1:length(times_days)], label = "land") - Plots.plot!(times_days, diff_ρe_tot_slab_seaice[1:length(times_days)], label = "seaice") - Plots.plot!(times_days, diff_toa_net_source[1:length(times_days)], label = "toa") - # Plots.plot!(times_days, diff_friction_sink[1:length(times_days)], label = "friction") - Plots.plot!(times_days, diff_ρe_tot_slab_ocean[1:length(times_days)], label = "ocean") - - tot = cc.ρe_tot_atmos .+ cc.ρe_tot_ocean .+ cc.ρe_tot_land .+ cc.ρe_tot_seaice .+ cc.toa_net_source #.+ cc.friction_sink - - Plots.plot!( - times_days, - tot .- tot[1], - label = "tot", - xlabel = "time [days]", - ylabel = "energy(t) - energy(t=0) [J]", - ) - Plots.savefig(figname1) - Plots.plot( - times_days, - log.(abs.(tot .- tot[1]) / tot[1]), - label = "tot", - xlabel = "time [days]", - ylabel = "log( | e(t) - e(t=0)| / e(t=0))", - ) - Plots.savefig(figname2) - - @assert abs(tot[end] - tot[1]) < tot[end] * 1e-3 # TODO make this more stringent once small errors resolved -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/diagnostics_gatherer.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/diagnostics_gatherer.jl deleted file mode 100644 index 34fa357167..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/diagnostics_gatherer.jl +++ /dev/null @@ -1,60 +0,0 @@ -# output_dumper.jl -# dumps specified output on model grid - -""" - save_output_func(diags::NamedTuple, date::DateTime, output_dir::String) - -Saves all entries in `diags` in separate HDF5 files in `output_dir`. -It can be callled by @calendar_callback to dump snapshots at a particular time frequency -""" -function save_hdf5(comms_ctx, diags::NamedTuple, date::DateTime, output_dir::String; name_tag = "") - diags_names = propertynames(diags) - diags_values = map(x -> getproperty(diags, x), diags_names) - - @info "Coupler: dumping data on $date" - - # convert to 1st of month (convention for monthly data) - date_m1 = date - Dates.Day(1) - year_month = Dates.DateTime(Dates.yearmonth(date_m1)[1], Dates.yearmonth(date_m1)[2]) - - for (name, values) in zip(diags_names, diags_values) - output_file = joinpath(output_dir, name_tag * "$name.monthly_" * string(year_month) * ".hdf5") - hdfwriter = InputOutput.HDF5Writer(output_file, comms_ctx) - InputOutput.HDF5.write_attribute(hdfwriter.file, "unix time", Dates.datetime2unix(year_month)) # TODO: a better way to write metadata, CMIP convention - InputOutput.write!(hdfwriter, values, string(name)) - Base.close(hdfwriter) - end - return nothing -end - -""" - accumulate_diags(diags::Union{NamedTuple, Fields.Field}, diags_cache::NamedTuple) - -Accumulates all entries in `diags` and saves the result in `diags_cache.fields`, while increasing the `diags_cache.ct` counter. -""" -function accumulate_diags(diags::Union{NamedTuple, Fields.Field}, diags_cache::NamedTuple) - diags_names = propertynames(diags_cache.fields) - - for (v, name) in zip(diags_cache.fields, diags_names) - v .+= getproperty(diags, name) # @. breaks for NamedTuples in test - end - diags_cache.ct[1] += FT(1) - - return nothing -end - -""" - collect_diags(cs, diags_names) - -collect diagnostics in diags names -""" -function collect_diags(cs, diags_names) - - diags = (;) - - for name in diags_names - diags = (; diags..., zip((name,), (get_var(cs, Val(name)),))...) - end - - return diags -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/flux_calculator.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/flux_calculator.jl deleted file mode 100644 index b659b2e99d..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/flux_calculator.jl +++ /dev/null @@ -1,63 +0,0 @@ -using ClimaCore.Geometry: ⊗ -using ClimaCore.Utilities: half, PlusHalf -import ClimaAtmos: get_surface_fluxes! - -""" - set_ρ_sfc!(ρ_sfc, T_S, integrator) - -sets the value of the ρ_sfc field based on the temperature of the surface, -the temperature of the atmosphere at the lowest level, and the heigh -of the lowest level. -""" -function set_ρ_sfc!(ρ_sfc, T_S, integrator) - ts = integrator.p.ᶜts - thermo_params = CAP.thermodynamics_params(integrator.p.params) - ts_int = Spaces.level(ts, 1) - parent(ρ_sfc) .= parent(ρ_sfc_at_point.(thermo_params, ts_int, swap_space!(zeros(axes(ts_int)), T_S))) -end - -""" - ρ_sfc_at_point(params, ts_int, T_sfc) - -Computes the surface density at a point given the atmospheric state -at the lowest level, the surface temperature, and the assumption of -an ideal gas and hydrostatic balance. - -Required because the surface models do not compute air density as a -variable. -""" -function ρ_sfc_at_point(params, ts_int, T_sfc) - T_int = TD.air_temperature(params, ts_int) - Rm_int = TD.gas_constant_air(params, ts_int) - ρ_air = TD.air_density(params, ts_int) - ρ_sfc = ρ_air * (T_sfc / T_int)^(TD.cv_m(params, ts_int) / Rm_int) # use ideal gas law and hydrostatic balance to extrapolate for surface density - return ρ_sfc -end - -""" - calculate_surface_fluxes_atmos_grid!(integrator) - -Calculates surface fluxes using adapter function `get_surface_fluxes!` -from ClimaAtmos that calls `SurfaceFluxes.jl`. The coupler updates in -atmos model cache fluxes at each coupling timestep. - -- TODO: generalize interface for regridding and take land state out of atmos's integrator.p -""" - -function calculate_surface_fluxes_atmos_grid!(integrator, info_sfc) - Y = integrator.u - p = integrator.p - t = integrator.t - ice_mask = info_sfc.ice_mask - Fields.bycolumn(axes(Y.c.uₕ)) do colidx - get_surface_fluxes!(Y, p, colidx) - # corrections (accounting for inhomogeneous surfaces) - @. p.ρ_dif_flux_h_tot[colidx] = # checking right quantity in ClimaAtmos v0.11.0 - -Geometry.WVector(correct_e_over_ice(p.surface_conditions[colidx], ice_mask[colidx])) - @. p.ρ_dif_flux_q_tot[colidx] = - -Geometry.WVector(correct_q_over_ice(p.surface_conditions[colidx], ice_mask[colidx])) - end -end -correct_e_over_ice(surface_conditions, ice_mask) = - .-surface_conditions.shf .- surface_conditions.lhf .* (FT(1) .- ice_mask) -correct_q_over_ice(surface_conditions, ice_mask) = .-surface_conditions.E .* (FT(1) .- ice_mask) diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/general_helper.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/general_helper.jl deleted file mode 100644 index c5c7aacdcb..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/general_helper.jl +++ /dev/null @@ -1,28 +0,0 @@ -# most of these functions are temporary helpers until upstream issues are resolved - -# TODO: unify with coupler interface -struct CouplerSimulation{FT, C, S, D, B, P} - comms_ctx::C - tspan::S - dates::D - boundary_space::B - parsed_args::P - t::FT - Δt_cpl::FT - surface_masks::NamedTuple - fields::NamedTuple - model_sims::NamedTuple - mode::NamedTuple - monthly_3d_diags::NamedTuple - monthly_2d_diags::NamedTuple -end - -CouplerSimulation{FT}(args...) where {FT} = CouplerSimulation{FT, typeof.(args[1:5])...}(args...) -float_type(::CouplerSimulation{FT}) where {FT} = FT - -function swap_space!(field_out, field_in) - parent(field_out) .= parent(field_in) - return field_out -end - -heaviside(var, FT) = var < FT(0) ? FT(0) : var diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/masker.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/masker.jl deleted file mode 100644 index 5d9469822f..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/masker.jl +++ /dev/null @@ -1,114 +0,0 @@ -function land_sea_mask( - FT, - REGRID_DIR, - comms_ctx::ClimaComms.AbstractCommsContext, - infile, - varname, - boundary_space; - outfile_root = "land_sea_cgll", - mono = false, - threshold = 0.7, -) - - if ClimaComms.iamroot(comms_ctx) - hdwrite_regridfile_rll_to_cgll( - comms_ctx, - infile, - varname, - boundary_space; - hd_outfile_root = outfile_root, - mono = mono, - ) - end - ClimaComms.barrier(comms_ctx) - file_dates = load(joinpath(REGRID_DIR, outfile_root * "_times.jld2"), "times") - mask = hdread_regridfile(comms_ctx, outfile_root, file_dates[1], varname) - mask = swap_space!(zeros(boundary_space), mask) # needed if we are reading from previous run - return mono ? mask : binary_mask.(mask, threshold = threshold) -end - -""" - update_masks!(cs) - -Updates dynamically changing masks. -""" -function update_masks!(cs) - - # dynamic masks - ice_d = cs.model_sims.ice_sim.integrator.p.ice_mask - FT = eltype(ice_d) - - # static mask - land_s = cs.surface_masks.land - - cs.surface_masks.ice .= min.(ice_d .+ land_s, FT(1)) .- land_s - cs.surface_masks.ocean .= (FT(1) .- cs.surface_masks.ice .- land_s) - - @assert minimum(cs.surface_masks.ice) >= FT(0) - @assert minimum(cs.surface_masks.land) >= FT(0) - @assert minimum(cs.surface_masks.ocean) >= FT(0) -end - -""" - binary_mask(var::FT; threshold = 0.5) - -Converts a number to 1 or 0 of the same type, based on a threashold. -""" - -binary_mask(var::FT; threshold = 0.5) where {FT} = (var - FT(threshold)) > FT(0) ? FT(1) : FT(0) - -""" - combine_surfaces!(combined_field::Fields.Field, masks::NamedTuple, fields::NamedTuple) - -Sums Field objects in `fields` weighted by the respective masks. -""" -function combine_surfaces!(combined_field::Fields.Field, masks::NamedTuple, fields::NamedTuple) - combined_field .= eltype(combined_field)(0) - warn_nans = false - for surface_name in propertynames(fields) # could use dot here? - if any(x -> isnan(x), getproperty(fields, surface_name)) - warn_nans = true - end - combined_field .+= getproperty(masks, surface_name) .* nans_to_zero.(getproperty(fields, surface_name)) - end - warn_nans && @warn "NaNs were detected and converted to zeros." -end - -#= Converts NaNs to zeros of the same type. =# -nans_to_zero(v) = isnan(v) ? typeof(v)(0) : v - -""" - update_masks!(cs) - -Updates dynamically changing masks. -""" -function update_masks!(cs) - - # dynamic masks - ice_d = cs.model_sims.ice_sim.integrator.p.ice_mask - FT = eltype(ice_d) - - # static mask - land_s = cs.surface_masks.land - - cs.surface_masks.ice .= min.(ice_d .+ land_s, FT(1)) .- land_s - cs.surface_masks.ocean .= (FT(1) .- cs.surface_masks.ice .- land_s) - - @assert minimum(cs.surface_masks.ice) >= FT(0) - @assert minimum(cs.surface_masks.land) >= FT(0) - @assert minimum(cs.surface_masks.ocean) >= FT(0) - -end - -""" - time_slice_ncfile(sic_data, time_idx = 1) -- slices a dataset at time index `time_idx` and saves it under `sic_data_slice`. Used for more efficient regridding of mask, SST and SIC files. -""" -function time_slice_ncfile(sic_data, time_idx = 1) - sic_data_slice = sic_data[1:(end - 3)] * "_one_time.nc" - isfile(sic_data_slice) ? run(`rm $sic_data_slice`) : nothing - NCDataset(sic_data) do ds - write(sic_data_slice, ds, idimensions = Dict("time" => time_idx:time_idx)) - end - return sic_data_slice -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/ncep_visualizer.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/ncep_visualizer.jl deleted file mode 100644 index 4a2acbeae0..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/ncep_visualizer.jl +++ /dev/null @@ -1,138 +0,0 @@ -""" - ncep_paperplots( - post_spec, - plot_spec, - files_dir; - month_date = Dates.DateTime(1979, 01, 01), - output_dir = ".", - fig_name = "ncep_paperplots", - ) - -Coordinates the postprocessing and plotting of sample fields (specified in `post_spec`) -of a particular monthly mean dataset (specified by `month_date`). Any plot NCEP- specific -customization should be done here. -""" -function ncep_paperplots( - post_spec, - plot_spec, - files_dir; - month_date = Dates.DateTime(1979, 01, 01), - output_dir = ".", - fig_name = "ncep_paperplots", -) - - @info month_date - - tmp_dir = joinpath(files_dir, "ncep_tmp") - isdir(tmp_dir) ? nothing : mkpath(tmp_dir) - - ncep_src = NCEPMonthlyDataSource(tmp_dir, [month_date]) - diags_vnames = propertynames(post_spec) - - all_plots = [] - for vname in diags_vnames - @info vname - - # download and read data of this month - diag_data = get_var(ncep_src, Val(vname)) - - # postprocess - post_data = postprocess(vname, diag_data, getproperty(post_spec, vname)) - - # create individual plots - zonal_mean_params = (; ylabel = "p (hPa)", yaxis = (;), yflip = true, getproperty(plot_spec, vname)...) # overwrite defaults - p = plot(post_data, zmd_params = zonal_mean_params, hsd_params = (; getproperty(plot_spec, vname)...)) - - push!(all_plots, p) - end - - # combine plots and save figure - save_fig = Plots.plot( - all_plots..., - size = (1500, 800), - right_margin = 12Plots.mm, - left_margin = 12Plots.mm, - bottom_margin = 12Plots.mm, - top_margin = 12Plots.mm, - ) - - Plots.png(save_fig, joinpath(output_dir, fig_name * ".png")) - - return all_plots -end - -using Downloads -using NCDatasets -abstract type DataSource end -struct NCEPMonthlyDataSource <: DataSource - tmp_dir::String - month_date::Array -end - -""" - download_read_nc(https, tmp_dir, ncep_vname ) - -Downloads and reads nc datafile of a specified NCEP variable -""" -function download_read_nc(data_source::NCEPMonthlyDataSource, https, ncep_vname) - local_file = joinpath(data_source.tmp_dir, ncep_vname * ".nc") - Downloads.download(https, local_file) - NCDataset(local_file) do ds - t_i = findall(x -> Dates.yearmonth(x) == Dates.yearmonth(data_source.month_date[1]), ds["time"][:]) # time index of month in file - d_i = length(size(ds[ncep_vname][:])) # index of time in the dimension list - lev = "level" in keys(ds) ? ds["level"][:] : [Float64(-999)] - data = dropdims(selectdim(ds[ncep_vname][:], d_i, t_i), dims = d_i) - if length(size(data)) == 3 - data .= data[:, end:-1:1, end:-1:1] - else - data .= data[:, end:-1:1] - end - (; lon = ds["lon"][:], lat = ds["lat"][:][end:-1:1], lev = lev[end:-1:1], data = data) - end -end - -# specification of variables -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:T}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/pressure/air.mon.mean.nc" - ncep_vname = "air" - download_read_nc(data_source, https, ncep_vname) - -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:u}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/pressure/uwnd.mon.mean.nc" - ncep_vname = "uwnd" - download_read_nc(data_source, https, ncep_vname) -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:q_tot}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/pressure/shum.mon.mean.nc" # Note that not ncep.reanalysis2 - ncep_vname = "shum" - download_read_nc(data_source, https, ncep_vname) -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:toa}) - https_root = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/gaussian_grid/" - https_suffix = ".ntat.mon.mean.nc" - - # sum, with upward positive. NB: dlwrf not available - toa_tuple = download_read_nc(data_source, https_root * "uswrf" * https_suffix, "uswrf") - toa_tuple.data .-= download_read_nc(data_source, https_root * "dswrf" * https_suffix, "dswrf").data - toa_tuple.data .+= download_read_nc(data_source, https_root * "ulwrf" * https_suffix, "ulwrf").data - - return toa_tuple -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:precipitation}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/gaussian_grid/prate.sfc.mon.mean.nc" - ncep_vname = "prate" - download_read_nc(data_source, https, ncep_vname) -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:T_sfc}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/surface/air.sig995.mon.mean.nc" # NB: strictly speaking this is air temperature not T_sfc - ncep_vname = "air" - t_tuple = download_read_nc(data_source, https, ncep_vname) - t_tuple.data .= t_tuple.data .+ 273.15 - return t_tuple -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/offline_postprocessor.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/offline_postprocessor.jl deleted file mode 100644 index 077e65b66f..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/offline_postprocessor.jl +++ /dev/null @@ -1,112 +0,0 @@ - -using Statistics -using ClimaCoupler.Regridder: remap_field_cgll_to_rll - -# data types for postprocessing -abstract type PostProcessedData end - -struct ZonalMeanData <: PostProcessedData - data_2d::Array - name::String - pressure_interpol::Bool - lev::Array - lat::Array -end -function ZonalMeanData(post_data, name; pressure_interpol = false) - ZonalMeanData( - getproperty(post_data, :data), - name, - pressure_interpol, - getproperty(post_data, :lev), - getproperty(post_data, :lat), - ) -end - -struct HorizontalSliceData <: PostProcessedData - data_2d::Array - name::String - lat::Array - lon::Array -end -function HorizontalSliceData(post_data, name) - HorizontalSliceData(getproperty(post_data, :data), name, getproperty(post_data, :lat), getproperty(post_data, :lon)) -end - -""" - postprocess( - name, - raw_data::Union{Fields.Field, NamedTuple}, - p_methods; - lev_slice = 1, - datafile_latlon = nothing, - ) - -Coordinates regridding, averaging or slicing of variable `name` corresponding -to `raw_data`. Postprocessing methods are specified in `p_methods`. -""" - -function postprocess( - name, - raw_data::Union{Fields.Field, NamedTuple}, - p_methods; - lev_slice = 1, - datafile_latlon = nothing, -) # TODO: this should be extended to acount for different vartical spaces - if (:regridded_3d in p_methods) || (:regridded_2d in p_methods) - DIR = joinpath(REGRID_DIR, "cgll2rll") - isdir(DIR) ? nothing : mkpath(DIR) - datafile_latlon = - (datafile_latlon == nothing) ? datafile_latlon = DIR * "/remapped_" * string(name) * ".nc" : datafile_latlon - remap_field_cgll_to_rll(name, raw_data, DIR, datafile_latlon) - grid_data = read_remapped_field(name, datafile_latlon) - else - @info "No regridding required." - grid_data = raw_data - end - - if :zonal_mean in p_methods - post_data = ZonalMeanData( - (; - data = Statistics.mean(Array(FT.(getproperty(grid_data, :data))), dims = 1)[1, :, :], - lat = getproperty(grid_data, :lat), - lev = getproperty(grid_data, :lev), - ), - string(name), - ) - end - if :horizontal_2d in p_methods - if length(size(getproperty(grid_data, :data))) == 2 - post_data = HorizontalSliceData( - (; - data = getproperty(grid_data, :data), - lat = getproperty(grid_data, :lat), - lon = getproperty(grid_data, :lon), - ), - string(name), - ) - - else - post_data = HorizontalSliceData( - (; - data = getproperty(grid_data, :data)[:, :, lev_slice], - lat = getproperty(grid_data, :lat), - lon = getproperty(grid_data, :lon), - lev = getproperty(grid_data, :lev)[lev_slice], - ), - string(name), - ) - end - end - return post_data -end - -function read_remapped_field(name, datafile_latlon, lev_name = "z") - nc = NCDataset(datafile_latlon, "r") - lon = nc["lon"][:] - lat = nc["lat"][:] - lev = lev_name in keys(nc) ? nc[lev_name][:] : Float64(-999) - var = nc[name][:] - close(nc) - - (; lon = lon, lat = lat, lev = lev, data = var) -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/plotter.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/plotter.jl deleted file mode 100644 index 4a74d203b5..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/plotter.jl +++ /dev/null @@ -1,52 +0,0 @@ -using Glob -using Printf - -function plot(post_data::PostProcessedData; zmd_params = (;), hsd_params = (;)) - - if post_data isa ZonalMeanData - plot_params = zmd_params - elseif post_data isa HorizontalSliceData - plot_params = hsd_params - else - plot_params = (;) - end - contourf(post_data; plot_params...) -end - -function contourf( - p::ZonalMeanData; - xlabel = "lat (deg N)", - ylabel = "z (km)", - yaxis = (:log,), - yflip = false, - clims = nothing, - units = " ", -) - clims = clims == nothing ? extrema(p.data_2d) : clims - plot_p = Plots.contourf( - p.lat, - p.lev, - p.data_2d', - color = :rainbow, - title = string(p.name) * " [" * units * "]", - xlabel = xlabel, - ylabel = ylabel, - yaxis = yaxis, - yflip = yflip, - clims = clims, - ) -end - -function contourf(p::HorizontalSliceData; xlabel = "lon (deg E)", ylabel = "lat (deg N)", clims = nothing, units = " ") - clims = clims == nothing ? extrema(p.data_2d) : clims - plot_p = Plots.contourf( - p.lon, - p.lat, - p.data_2d', - color = :rainbow, - title = string(p.name) * " [" * units * "]", - xlabel = xlabel, - ylabel = ylabel, - clims = clims, - ) -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/regridder.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/regridder.jl deleted file mode 100644 index 4702bc8d1f..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/regridder.jl +++ /dev/null @@ -1,232 +0,0 @@ - -using ClimaCore -using ClimaCore: Domains, Topologies, Meshes, Spaces, Fields, InputOutput -using NCDatasets -using ClimaCoreTempestRemap -using Dates - -REGRID_DIR = @isdefined(REGRID_DIR) ? REGRID_DIR : joinpath(".", "regrid_tmp/") -if ClimaComms.iamroot(comms_ctx) - rm(REGRID_DIR; recursive = true, force = true) -end -ClimaComms.barrier(comms_ctx) - -""" - reshape_cgll_sparse_to_field!(field::Fields.Field, in_array::Array, R) - -Reshapes a sparse vector array (raw output of the TempestRemap) to a Field object. -Redundant nodes are populated using `dss` operations. -""" -function reshape_cgll_sparse_to_field!(field::Fields.Field, in_array::Array, R) - field_array = parent(field) - - fill!(field_array, zero(eltype(field_array))) - Nf = size(field_array, 3) - - f = 1 - for (n, row) in enumerate(R.row_indices) - it, jt, et = (view(R.target_idxs[1], n), view(R.target_idxs[2], n), view(R.target_idxs[3], n)) - for f in 1:Nf - field_array[it, jt, f, et] .= in_array[row] - end - end - # broadcast to the redundant nodes using unweighted dss - space = axes(field) - topology = Spaces.topology(space) - hspace = Spaces.horizontal_space(space) - Spaces.dss!(Fields.field_values(field), topology, hspace.quadrature_style) - return field -end - -""" - hdwrite_regridfile_rll_to_cgll(comms_ctx, datafile_rll, varname, space; hd_outfile_root = "data_cgll", mono = false) - -Reads and regrids data of the `varname` variable from an input NetCDF file and saves it as another NetCDF file using Tempest Remap. -The input NetCDF file needs to be `Exodus` formatted, and can contain time-dependent data. The output NetCDF file -is then read back, the output arrays converted into Fields and saved as HDF5 files (one per time slice). This function should -be called by the root process. The regridded HDF5 output is readable by multiple MPI processes. -""" -function hdwrite_regridfile_rll_to_cgll( - comms_ctx, - datafile_rll, - varname, - space; - hd_outfile_root = "data_cgll", - mono = false, -) - out_type = "cgll" - - outfile = hd_outfile_root * ".nc" - outfile_root = mono ? outfile[1:(end - 3)] * "_mono" : outfile[1:(end - 3)] - datafile_cgll = joinpath(REGRID_DIR, outfile_root * ".g") - - meshfile_rll = joinpath(REGRID_DIR, outfile_root * "_mesh_rll.g") - meshfile_cgll = joinpath(REGRID_DIR, outfile_root * "_mesh_cgll.g") - meshfile_overlap = joinpath(REGRID_DIR, outfile_root * "_mesh_overlap.g") - weightfile = joinpath(REGRID_DIR, outfile_root * "_remap_weights.nc") - - topology = Topologies.Topology2D(space.topology.mesh, Topologies.spacefillingcurve(space.topology.mesh)) - Nq = Spaces.Quadratures.polynomial_degree(space.quadrature_style) + 1 - space_undistributed = ClimaCore.Spaces.SpectralElementSpace2D(topology, ClimaCore.Spaces.Quadratures.GLL{Nq}()) - - if isfile(datafile_cgll) == false - isdir(REGRID_DIR) ? nothing : mkpath(REGRID_DIR) - - nlat, nlon = NCDataset(datafile_rll) do ds - (ds.dim["lat"], ds.dim["lon"]) - end - # write lat-lon mesh - rll_mesh(meshfile_rll; nlat = nlat, nlon = nlon) - - # write cgll mesh, overlap mesh and weight file - write_exodus(meshfile_cgll, topology) - overlap_mesh(meshfile_overlap, meshfile_rll, meshfile_cgll) - - # 'in_np = 1' and 'mono = true' arguments ensure mapping is conservative and monotone - # Note: for a kwarg not followed by a value, set it to true here (i.e. pass 'mono = true' to produce '--mono') - # Note: out_np = degrees of freedom = polynomial degree + 1 - - kwargs = (; out_type = out_type, out_np = Nq) - kwargs = mono ? (; (kwargs)..., in_np = mono ? 1 : false, mono = mono) : kwargs - remap_weights(weightfile, meshfile_rll, meshfile_cgll, meshfile_overlap; kwargs...) - # remap - apply_remap(datafile_cgll, datafile_rll, weightfile, [varname]) - else - @warn "Using the existing $datafile_cgll : check topology is consistent" - end - - function get_time(ds) - if "time" in ds - data_dates = Dates.DateTime.(ds["time"][:]) - elseif "date" in ds - data_dates = strdate_to_datetime.(string.(ds["date"][:])) - else - @warn "No dates available in file $datafile_rll" - data_dates = [Dates.DateTime(0)] - end - end - - # read the remapped file with sparse matrices - offline_outvector, times = NCDataset(datafile_cgll, "r") do ds_wt - ( - offline_outvector = ds_wt[varname][:][:, :], # ncol, times - times = get_time(ds_wt), - ) - end - - # weightfile info needed to populate all nodes and save into fields with sparse matrices - _, _, row_indices = NCDataset(weightfile, "r") do ds_wt - (Array(ds_wt["S"]), Array(ds_wt["col"]), Array(ds_wt["row"])) - end - - target_unique_idxs = - out_type == "cgll" ? collect(Spaces.unique_nodes(space_undistributed)) : - collect(Spaces.all_nodes(space_undistributed)) - target_unique_idxs_i = map(row -> target_unique_idxs[row][1][1], row_indices) - target_unique_idxs_j = map(row -> target_unique_idxs[row][1][2], row_indices) - target_unique_idxs_e = map(row -> target_unique_idxs[row][2], row_indices) - target_unique_idxs = (target_unique_idxs_i, target_unique_idxs_j, target_unique_idxs_e) - - R = (; target_idxs = target_unique_idxs, row_indices = row_indices) - - offline_field = Fields.zeros(FT, space_undistributed) - - offline_fields = ntuple(x -> similar(offline_field), length(times)) - - ntuple(x -> reshape_cgll_sparse_to_field!(offline_fields[x], offline_outvector[:, x], R), length(times)) - - # save save_hdf5 # TODO: extend write! to handle time-dependent fields - map(x -> save_remap_hdf5(hd_outfile_root, times[x], offline_fields[x], varname), 1:length(times)) - jldsave(joinpath(REGRID_DIR, hd_outfile_root * "_times.jld2"); times = times) - - return times -end - -""" - save_remap_hdf5(hd_outfile_root, tx, field, varname) - -Helper to save individual hdf5 files after remapping. -""" -function save_remap_hdf5(hd_outfile_root, tx, field, varname) - t = Dates.datetime2unix.(tx) - hdfwriter = InputOutput.HDF5Writer(joinpath(REGRID_DIR, hd_outfile_root * "_" * string(tx) * ".hdf5")) - - InputOutput.HDF5.write_attribute(hdfwriter.file, "unix time", t) # TODO: a better way to write metadata, CMIP convention - InputOutput.write!(hdfwriter, field, string(varname)) - Base.close(hdfwriter) -end - -function hdread_regridfile(comms_ctx, hd_outfile_root, time, varname) - hdfreader = InputOutput.HDF5Reader(joinpath(REGRID_DIR, hd_outfile_root * "_" * string(time) * ".hdf5"), comms_ctx) - field = InputOutput.read_field(hdfreader, varname) - Base.close(hdfreader) - return field -end - -function dummmy_remap!(target, source) - parent(target) .= parent(source) -end - -""" - remap_field_cgll_to_rll(name::Symbol, field::Fields.Field, remap_tmpdir, datafile_latlon) -Remap individual Field from model (CGLL) nodes to a lat-lon (RLL) grid using TempestRemap -""" -function remap_field_cgll_to_rll( - name::Symbol, - field::Fields.Field, - remap_tmpdir, - datafile_latlon; - nlat = 90, - nlon = 180, -) - - space = axes(field) - hspace = :topology in propertynames(space) ? space : space.horizontal_space - topology = hspace.topology - Nq = Spaces.Quadratures.polynomial_degree(hspace.quadrature_style) + 1 - - # write out our cubed sphere mesh - meshfile_cc = remap_tmpdir * "/mesh_cubedsphere.g" - write_exodus(meshfile_cc, hspace.topology) - - meshfile_rll = remap_tmpdir * "/mesh_rll.g" - rll_mesh(meshfile_rll; nlat = nlat, nlon = nlon) - - meshfile_overlap = remap_tmpdir * "/mesh_overlap.g" - overlap_mesh(meshfile_overlap, meshfile_cc, meshfile_rll) - - weightfile = remap_tmpdir * "/remap_weights.nc" - remap_weights(weightfile, meshfile_cc, meshfile_rll, meshfile_overlap; in_type = "cgll", in_np = Nq) - - datafile_cc = remap_tmpdir * "/datafile_cc.nc" - write_datafile_cc(datafile_cc, field, name) - - apply_remap( # TODO: this can be done online - datafile_latlon, - datafile_cc, - weightfile, - [string(name)], - ) -end -function write_datafile_cc(datafile_cc, field, name) - space = axes(field) - # write data - NCDataset(datafile_cc, "c") do nc - def_space_coord(nc, space; type = "cgll") - # nc_time = def_time_coord(nc) - nc_field = defVar(nc, name, Float64, space) - nc_field[:, 1] = field - - nothing - end -end - - -function create_space(; R = FT(6371e3), ne = 4, polynomial_degree = 3) - domain = Domains.SphereDomain(R) - mesh = Meshes.EquiangularCubedSphere(domain, ne) - topology = Topologies.Topology2D(mesh) - Nq = polynomial_degree + 1 - quad = Spaces.Quadratures.GLL{Nq}() - space = Spaces.SpectralElementSpace2D(topology, quad) -end # debugging tool, also to be used in tests diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/unit_tester.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/unit_tester.jl deleted file mode 100644 index 42be9b0aec..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/unit_tester.jl +++ /dev/null @@ -1,178 +0,0 @@ -# unit_tester - contains temporaty unit tests that will be moved to the `/test` folder - -import Test: @test -using Pkg -using Dates - -# Pkg.activate("../") - -# import coupler utils -include("regridder.jl") -include("masker.jl") -cc_dir = dirname(dirname(dirname(dirname(@__DIR__)))) -include(joinpath(cc_dir, "artifacts", "artifact_funcs.jl")) -sst_data = joinpath(sst_dataset_path(), "sst.nc") -sic_data = joinpath(sic_dataset_path(), "sic.nc") -mask_data = joinpath(mask_dataset_path(), "seamask.nc") - -include("../atmos/atmos_init.jl") -include("general_helper.jl") -include("bcfile_reader.jl") - -# test setup -TEST_DATA_DIR = "tmp_test_data/" -isdir(TEST_DATA_DIR) ? rm(TEST_DATA_DIR; recursive = true, force = true) : nothing -REGRID_DIR = joinpath(TEST_DATA_DIR, "regrid_tmp/") - -FT = Float32 - -date0 = date1 = DateTime(1979, 01, 01, 01, 00, 00) -date = DateTime(1979, 01, 01, 00, 00, 00) -tspan = (1, 90 * 86400) # Jan-Mar -Δt = 1 * 3600 - -radius = FT(6731e3) -Nq = 4 - -domain = Domains.SphereDomain(radius) -mesh = Meshes.EquiangularCubedSphere(domain, 4) -topology = Topologies.Topology2D(mesh) -quad = Spaces.Quadratures.GLL{Nq}() -boundary_space_t = Spaces.SpectralElementSpace2D(topology, quad) - -# IO monthly -# unit test for update_midmonth_data! - -land_mask_t = ClimaCore.Fields.zeros(boundary_space_t) -dummy_data = (; test_data = zeros(axes(land_mask_t))) - -_info = bcfile_info_init( - FT, - ClimaComms.SingletonCommsContext(), - sst_data, - "SST", - boundary_space_t, - segment_idx0 = [Int(1309)], - interpolate_daily = false, - land_mask = land_mask_t, -) - -dates = (; date = [date], date0 = [date0], date1 = [date1]) -cs_t = (; - _info = _info, - dates = dates, - SST_all = [], - updating_dates = [], - monthly_state_diags = (; fields = deepcopy(dummy_data), ct = [0]), -) - -@info "test_update_midmonth_callback()" -function test_update_midmonth_callback() - # step in time - walltime = @elapsed for t in ((tspan[1] + Δt):Δt:tspan[end]) - cs_t.dates.date[1] = current_date(cs_t, t) # if not global, `date`` is not updated. Check that this still runs when distributed. - - # monthly read of boundary condition data - @calendar_callback :( - update_midmonth_data!(cs_t.dates.date[1], cs_t._info), - push!(cs_t.SST_all, deepcopy(cs_t._info.monthly_fields[1])), - push!(cs_t.updating_dates, deepcopy(cs_t.dates.date[1])), - ) cs_t.dates.date[1] next_date_in_file(cs_t._info) - - end - @show walltime - @test cs_t.SST_all[end] !== cs_t.SST_all[end - 1] # test if the SST field was modified - @test Date(cs_t.updating_dates[end]) == Date(1979, 03, 16) # check that the final file date is as expected -end -test_update_midmonth_callback() - -# IO daily -@info "test_interpol()" -function test_interpol(boundary_space) - f1 = zeros(boundary_space) - f2 = ones(boundary_space) - out = interpol.(f1, f2, FT(15), FT(30)) - @test parent(out)[1] ≈ FT(0.5) -end -test_interpol(boundary_space_t) - -# monthly data averaging and dump -@info "test_monthly_accumulation()" -function test_monthly_accumulation() - - walltime = @elapsed for t in ((tspan[1] + Δt):Δt:tspan[end]) - cs_t.dates.date[1] = current_date(cs_t, t) # if n - - dummy_data.test_data .= 1 - - # accumulate data at each timestep - accumulate_diags(dummy_data, cs_t.monthly_state_diags) - - # monthly averages - @calendar_callback :( - map(x -> x ./= cs_t.monthly_state_diags.ct[1], cs_t.monthly_state_diags.fields), - save_hdf5(cs.comms_ctx, cs_t.monthly_state_diags.fields, cs_t.dates.date[1], TEST_DATA_DIR), - map(x -> x .= FT(0), cs_t.monthly_state_diags.fields), - cs_t.monthly_state_diags.ct .= FT(0), - ) cs_t.dates.date[1] cs_t.dates.date1[1] - ## step to next calendar month - @calendar_callback :(cs_t.dates.date1[1] += Dates.Month(1)) cs_t.dates.date[1] cs_t.dates.date1[1] - - end - - # read Feb data - hdfreader = InputOutput.HDF5Reader(joinpath(TEST_DATA_DIR, "test_data.monthly_1979-02-01T00:00:00.hdf5")) - hdf5_data = InputOutput.read_field(hdfreader, "test_data") - close(hdfreader) - @test parent(hdf5_data)[1] ≈ 1 # no hours in March - -end -test_monthly_accumulation() - -@info "test_surfacearea_ones()" -# create dataset of all ones with lat/lon dimensions based on seamask.nc -function gen_data_all_ones!(path, varname) - # Create dataset of all ones - ds = NCDataset(path, "c") - - # define the dimensions "lon" and "lat" - defDim(ds, "lon", 64) - defDim(ds, "lat", 32) - - # define a global attribute - ds.attrib["title"] = "this is an NCDataset file containing all 1s" - - # define variables - lon = defVar(ds, "lon", Float64, ("lon",)) - lat = defVar(ds, "lat", Float64, ("lat",)) - v = defVar(ds, varname, Int64, ("lon", "lat")) - - # populate lon and lat - lon[:] = [i for i in 0.0:(360 / 64):(360 - (360 / 64))] - lat[:] = [i for i in (-90 + (180 / 64)):(180 / 32):(90 - (180 / 64))] - - # generate some example data and write it to v - v[:, :] = [1 for i in 1:ds.dim["lon"], j in 1:ds.dim["lat"]] - - # write attributes - v.attrib["comments"] = "arbitrary variable with all values 1" - - close(ds) -end -# test that remapping a dataset of all ones conserves surface area -function test_surfacearea_ones() - varname = "surfacevar" - - mask_data = joinpath(TEST_DATA_DIR, "all_ones_.nc") - gen_data_all_ones!(mask_data, varname) - - # init land-sea mask - land_mask = land_sea_mask(FT, REGRID_DIR, ClimaComms.SingletonCommsContext(), mask_data, varname, boundary_space_t) - - @test sum(land_mask) ≈ 4 * π * (radius^2) - -end -test_surfacearea_ones() - -# clean -rm(TEST_DATA_DIR; recursive = true, force = true) diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/variable_definer.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/variable_definer.jl deleted file mode 100644 index daa6e41b15..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/variable_definer.jl +++ /dev/null @@ -1,61 +0,0 @@ -# coupler_diagnostics_list.jl - a temporary prequel to ClimaDiagnostics's diagnostic table - -""" - get_var(cs::CouplerSimulation, ::Symbol) - -Defines variable extraction from the coupler simulation. -""" -get_var(cs, ::Val{:T}) = air_temperature(cs) - -get_var(cs, ::Val{:u}) = ClimaCore.Geometry.UVVector.(cs.model_sims.atmos_sim.integrator.u.c.uₕ).components.data.:1 - -get_var(cs, ::Val{:q_tot}) = - cs.model_sims.atmos_sim.integrator.u.c.ρq_tot ./ cs.model_sims.atmos_sim.integrator.u.c.ρ .* float_type(cs)(1000) - -get_var(cs, ::Val{:toa}) = swap_space!(zeros(cs.boundary_space), toa_fluxes(cs)) - -get_var(cs, ::Val{:precipitation}) = - .-swap_space!( - zeros(cs.boundary_space), - cs.model_sims.atmos_sim.integrator.p.col_integrated_rain .+ - cs.model_sims.atmos_sim.integrator.p.col_integrated_snow, - ) - -get_var(cs, ::Val{:T_sfc}) = swap_space!(zeros(cs.boundary_space), cs.fields.T_S) - -# more complex calculations -function zonal_wind(cs) - cs.model_sims.atmos_sim.integrator.u.c.uₕ -end -function air_temperature(cs) - p = cs.model_sims.atmos_sim.integrator.p - (; ᶜts, params) = p - thermo_params = CAP.thermodynamics_params(params) - ᶜT = @. TD.air_temperature(thermo_params, ᶜts) -end -function toa_fluxes(cs) - atmos_sim = cs.model_sims.atmos_sim - face_space = axes(atmos_sim.integrator.u.f) - z = parent(Fields.coordinate_field(face_space).z) - Δz_top = round(FT(0.5) * (z[end, 1, 1, 1, 1] - z[end - 1, 1, 1, 1, 1])) - n_faces = length(z[:, 1, 1, 1, 1]) - - LWd_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_lw_flux_dn), face_space), - n_faces - half, - ) - LWu_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_lw_flux_up), face_space), - n_faces - half, - ) - SWd_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_sw_flux_dn), face_space), - n_faces - half, - ) - SWu_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_sw_flux_up), face_space), - n_faces - half, - ) - - radiation_sources = @. -(LWd_TOA + SWd_TOA - LWu_TOA - SWu_TOA) -end diff --git a/experiments/AMIP/moist_mpi_earth/coupler_utils/viz_explorer.jl b/experiments/AMIP/moist_mpi_earth/coupler_utils/viz_explorer.jl deleted file mode 100644 index 1911fb2507..0000000000 --- a/experiments/AMIP/moist_mpi_earth/coupler_utils/viz_explorer.jl +++ /dev/null @@ -1,75 +0,0 @@ -using Plots -using ClimaCorePlots -using ClimaCore: Geometry - -function plot_anim(cs, out_dir = ".") - - atmos_sim = cs.model_sims.atmos_sim - slab_land_sim = cs.model_sims.land_sim - slab_ocean_sim = cs.model_sims.ocean_sim - slab_ice_sim = cs.model_sims.ice_sim - mode_name = cs.mode.name - SST = cs.fields.T_S - - # plot the lowest atmos (center) levels of key variables - sol_atm = atmos_sim.integrator.sol - - anim = Plots.@animate for u in sol_atm.u - Plots.plot(Fields.level(Geometry.UVVector.(u.c.uₕ).components.data.:1, 5)) - end - Plots.mp4(anim, joinpath(out_dir, "anim_u.mp4"), fps = 10) - - anim = Plots.@animate for u in sol_atm.u - Plots.plot(Fields.level(u.c.ρe_tot, 1) .- Fields.level(sol_atm.u[1].c.ρe_tot, 1), clims = (-5000, 50000)) - println(parent(Fields.level(u.c.ρe_tot, 1) .- Fields.level(sol_atm.u[1].c.ρe_tot, 1))[1]) - end - Plots.mp4(anim, joinpath(out_dir, "anim_rhoe_anom.mp4"), fps = 10) - - anim = Plots.@animate for u in sol_atm.u - Plots.plot(Fields.level(u.c.ρq_tot ./ u.c.ρ, 1)) - end - Plots.mp4(anim, joinpath(out_dir, "anim_qt.mp4"), fps = 10) - - # plot combined surfaces - combined_field = zeros(boundary_space) - sol_slab = slab_land_sim.integrator.sol - - if mode_name == "slabplanet" - sol_slab_ocean = slab_ocean_sim.integrator.sol - anim = Plots.@animate for (bucketu, oceanu) in zip(sol_slab.u, sol_slab_ocean.u) - land_T_sfc = get_land_temp_from_state(cs.model_sims.land_sim, bucketu) - combine_surfaces!( - combined_field, - cs.surface_masks, - (; land = land_T_sfc, ocean = oceanu.T_sfc, ice = FT(0)), - ) - Plots.plot(combined_field) - end - - elseif mode_name == "amip" - sol_slab_ice = slab_ice_sim.integrator.sol - anim = Plots.@animate for (bucketu, iceu) in zip(sol_slab.u, sol_slab_ice.u) - land_T_sfc = get_land_temp_from_state(cs.model_sims.land_sim, bucketu) - combine_surfaces!(combined_field, cs.surface_masks, (; land = land_T_sfc, ocean = SST, ice = iceu.T_sfc)) - Plots.plot(combined_field) - end - end - Plots.mp4(anim, joinpath(out_dir, "earth_T.mp4"), fps = 10) - - combined_field = zeros(boundary_space) - anim = Plots.@animate for bucketu in sol_slab.u - combine_surfaces!(combined_field, cs.surface_masks, (; land = bucketu.bucket.W, ocean = 0.0, ice = 0.0)) - Plots.plot(combined_field) - end - Plots.mp4(anim, joinpath(out_dir, "bucket_W.mp4"), fps = 10) - - combined_field = zeros(boundary_space) - anim = Plots.@animate for bucketu in sol_slab.u - combine_surfaces!(combined_field, cs.surface_masks, (; land = bucketu.bucket.σS, ocean = 0.0, ice = 0.0)) - Plots.plot(combined_field) - end - Plots.mp4(anim, joinpath(out_dir, "bucket_snow.mp4"), fps = 10) - - # plot surface fluxes - # TODO as part of the flux accumulation PR -end diff --git a/experiments/AMIP/moist_mpi_earth/mpi/mpi_init.jl b/experiments/AMIP/moist_mpi_earth/mpi/mpi_init.jl deleted file mode 100644 index df045c372f..0000000000 --- a/experiments/AMIP/moist_mpi_earth/mpi/mpi_init.jl +++ /dev/null @@ -1,20 +0,0 @@ -# TODO: const comms_ctx cannot be overwritten in ClimaAtmos - add if statement to clima atmos -using ClimaComms -using ClimaCommsMPI -using Logging - -const is_distributed = get(ENV, "CLIMACORE_DISTRIBUTED", "") == "MPI" -if is_distributed - const comms_ctx = ClimaCommsMPI.MPICommsContext() - const pid, nprocs = ClimaComms.init(comms_ctx) - - if ClimaComms.iamroot(comms_ctx) - Logging.global_logger(Logging.ConsoleLogger(stderr, Logging.Info)) - else - Logging.global_logger(Logging.NullLogger()) - end -else - using TerminalLoggers: TerminalLogger - const comms_ctx = ClimaComms.SingletonCommsContext() - const pid, nprocs = ClimaComms.init(comms_ctx) -end diff --git a/experiments/AMIP/moist_mpi_earth/mpi/mpi_postprocess.jl b/experiments/AMIP/moist_mpi_earth/mpi/mpi_postprocess.jl deleted file mode 100644 index cd39d9a496..0000000000 --- a/experiments/AMIP/moist_mpi_earth/mpi/mpi_postprocess.jl +++ /dev/null @@ -1,37 +0,0 @@ - -# function mpi_collapse_solu()# (comms_ctx, horizontal_mesh, quad, z_max, z_elem, z_stretch, Y) # TODO: it's using the global scope here -if is_distributed # replace sol.u on the root processor with the global sol.u - - if ClimaComms.iamroot(comms_ctx) - global_h_space = make_horizontal_space(horizontal_mesh, quad, nothing) - global_center_space, global_face_space = make_hybrid_spaces(global_h_space, z_max, z_elem, z_stretch) - global_Y_c_type = Fields.Field{typeof(Fields.field_values(Y.c)), typeof(global_center_space)} - global_Y_f_type = Fields.Field{typeof(Fields.field_values(Y.f)), typeof(global_face_space)} - global_Y_type = Fields.FieldVector{FT, NamedTuple{(:c, :f), Tuple{global_Y_c_type, global_Y_f_type}}} - global_Y_slab_type = - Fields.Field{typeof(Fields.field_values(slab_sim.integrator.u.T_sfc)), typeof(global_h_space)} - global_sol_u_atmos = similar(sol_atm.u, global_Y_type) - global_sol_u_slab = similar(sol_slab.u, global_Y_slab_type) - end - for i in 1:length(sol_atm.u) - global_Y_c = DataLayouts.gather(comms_ctx, Fields.field_values(sol_atm.u[i].c)) - global_Y_f = DataLayouts.gather(comms_ctx, Fields.field_values(sol_atm.u[i].f)) - global_Y_slab = DataLayouts.gather(comms_ctx, Fields.field_values(sol_slab.u[i].T_sfc)) - if ClimaComms.iamroot(comms_ctx) - global_sol_u_atmos[i] = Fields.FieldVector( - c = Fields.Field(global_Y_c, global_center_space), - f = Fields.Field(global_Y_f, global_face_space), - ) - global_sol_u_slab[i] = Fields.Field(global_Y_slab, global_h_space) - end - end - if ClimaComms.iamroot(comms_ctx) - solu_atm = global_sol_u_atmos - solu_slab = global_sol_u_slab - return solu_atm, solu_slab - end -else - solu_atm = sol_atm.u - h_space = make_horizontal_space(horizontal_mesh, quad, nothing) #TODO move this to the beginning (once same the instance error sorted) - solu_slab = Fields.FieldVector(T_sfc = [Fields.Field(Fields.field_values(u.T_sfc), h_space) for u in sol_slab.u]) -end diff --git a/experiments/AMIP/moist_mpi_earth/push_pull.jl b/experiments/AMIP/moist_mpi_earth/push_pull.jl deleted file mode 100644 index 22b18180c1..0000000000 --- a/experiments/AMIP/moist_mpi_earth/push_pull.jl +++ /dev/null @@ -1,181 +0,0 @@ -""" - atmos_push!(cs) - -updates F_A, F_R, P_liq, and F_E in place based on values used in the atmos_sim for the current step. -""" -function atmos_push!(cs) - atmos_sim = cs.model_sims.atmos_sim - csf = cs.fields - dummmy_remap!(csf.F_A, atmos_sim.integrator.p.ρ_dif_flux_h_tot) - dummmy_remap!(csf.F_E, atmos_sim.integrator.p.ρ_dif_flux_q_tot) - dummmy_remap!(csf.F_R, level(atmos_sim.integrator.p.ᶠradiation_flux, half)) - dummmy_remap!(csf.P_liq, atmos_sim.integrator.p.col_integrated_rain .+ atmos_sim.integrator.p.col_integrated_snow) -end - -""" - land_pull!(cs) - -Updates the land_sim cache state in place with the current values of F_A, F_R, F_E, P_liq, and ρ_sfc. -The surface air density is computed using the atmospheric state at the first level and making ideal gas -and hydrostatic balance assumptions. The land model does not compute the surface air density so this is -a reasonable stand-in. -""" -function land_pull!(cs) - FT = float_type(cs) - land_sim = cs.model_sims.land_sim - csf = cs.fields - land_mask = cs.surface_masks.land - parent(land_sim.integrator.p.bucket.ρ_sfc) .= parent(csf.ρ_sfc) - parent(land_sim.integrator.p.bucket.turbulent_energy_flux) .= - apply_mask.(parent(land_mask), >, parent(csf.F_A), parent(csf.F_A) .* FT(0), FT(0)) - ρ_liq = (LSMP.ρ_cloud_liq(land_sim.model.parameters.earth_param_set)) - parent(land_sim.integrator.p.bucket.evaporation) .= - apply_mask.(parent(land_mask), >, parent(csf.F_E) ./ ρ_liq, parent(csf.F_E) .* FT(0), FT(0)) - parent(land_sim.integrator.p.bucket.R_n) .= - apply_mask.(parent(land_mask), >, parent(csf.F_R), parent(csf.F_R) .* FT(0), FT(0)) - parent(land_sim.integrator.p.bucket.P_liq) .= FT(-1.0) .* parent(csf.P_liq) # land expects this to be positive - parent(land_sim.integrator.p.bucket.P_snow) .= FT(0.0) .* parent(csf.P_snow) - -end - -""" - ocean_pull!(cs) - -Updates the ocean_sim cache state in place with the current values of F_A and F_R. -The ocean model does not require moisture fluxes at the surface, so F_E is not returned. -""" -function ocean_pull!(cs) - ocean_sim = cs.model_sims.ocean_sim - csf = cs.fields - @. ocean_sim.integrator.p.F_aero = csf.F_A - @. ocean_sim.integrator.p.F_rad = csf.F_R -end - -""" - ice_pull!(cs) - -Updates the ice_sim cache state in place with the current values of F_A and F_R. -In the current version, the sea ice has a prescribed thickness, and we assume that it is not -sublimating. That contribution has been zeroed out in the atmos fluxes. -""" -function ice_pull!(cs) - FT = float_type(cs) - ice_sim = cs.model_sims.ice_sim - csf = cs.fields - ice_mask = cs.surface_masks.ice - parent(ice_sim.integrator.p.F_rad) .= - apply_mask.(parent(ice_mask), >, parent(csf.F_R), parent(csf.F_R) .* FT(0), FT(0)) - parent(ice_sim.integrator.p.F_aero) .= - apply_mask.(parent(ice_mask), >, parent(csf.F_A), parent(csf.F_A) .* FT(0), FT(0)) -end - -""" - atmos_pull!(cs) - -Creates the surface fields for temperature, roughness length, albedo, and specific humidity; computes -turbulent surface fluxes; updates the atmosphere boundary flux cache variables in place; updates the -RRTMGP cache variables in place. -""" -function atmos_pull!(cs) - - @unpack model_sims = cs - @unpack atmos_sim, land_sim, ocean_sim, ice_sim = model_sims - radiation = atmos_sim.integrator.p.radiation_model - - csf = cs.fields - T_sfc_cpl = csf.T_S - z0m_cpl = csf.z0m_S - z0b_cpl = csf.z0b_S - albedo_sfc_cpl = csf.albedo - beta_sfc_cpl = csf.beta - - thermo_params = CAP.thermodynamics_params(atmos_sim.integrator.p.params) - - T_land = get_land_temp(land_sim) - z0m_land, z0b_land = get_land_roughness(land_sim) - T_ocean = ocean_sim.integrator.u.T_sfc - z0m_ocean = ocean_sim.integrator.p.params.z0m - z0b_ocean = ocean_sim.integrator.p.params.z0b - α_ocean = ocean_sim.integrator.p.params.α - T_ice = ice_sim.integrator.u.T_sfc - ice_mask = ice_sim.integrator.p.ice_mask - z0m_ice = ice_sim.integrator.p.params.z0m - z0b_ice = ice_sim.integrator.p.params.z0b - - update_masks!(cs) - - # combine models' surfaces onlo one coupler field - combined_field = zeros(boundary_space) - - # surface temperature - combine_surfaces!(combined_field, cs.surface_masks, (; land = T_land, ocean = T_ocean, ice = T_ice)) - dummmy_remap!(T_sfc_cpl, combined_field) - - # roughness length for momentum - combine_surfaces!(combined_field, cs.surface_masks, (; land = z0m_land, ocean = z0m_ocean, ice = z0m_ice)) - dummmy_remap!(z0m_cpl, combined_field) - - # roughness length for tracers - combine_surfaces!(combined_field, cs.surface_masks, (; land = z0b_land, ocean = z0b_ocean, ice = z0b_ice)) - dummmy_remap!(z0b_cpl, combined_field) - - # TODO replace functions that used ρ_sfc and q_sfc from atmos - - # albedo - α_land = land_albedo(land_sim) - α_ice = ice_sim.integrator.p.params.α - combine_surfaces!(combined_field, cs.surface_masks, (; land = α_land, ocean = α_ocean, ice = α_ice)) - dummmy_remap!(albedo_sfc_cpl, combined_field) - - if radiation != nothing - atmos_sim.integrator.p.radiation_model.diffuse_sw_surface_albedo .= - reshape(RRTMGPI.field2array(albedo_sfc_cpl), 1, length(parent(albedo_sfc_cpl))) - atmos_sim.integrator.p.radiation_model.direct_sw_surface_albedo .= - reshape(RRTMGPI.field2array(albedo_sfc_cpl), 1, length(parent(albedo_sfc_cpl))) - atmos_sim.integrator.p.radiation_model.surface_temperature .= RRTMGPI.field2array(T_sfc_cpl) - end - - # beta factor for evaporation - should be 1 over ocean and ice - β_ocean = ones(axes(combined_field)) - β_ice = ones(axes(combined_field)) - β_land = land_beta(land_sim) - - combine_surfaces!(combined_field, cs.surface_masks, (; land = β_land, ocean = β_ocean, ice = β_ice)) - dummmy_remap!(beta_sfc_cpl, combined_field) - @assert all(i -> parent(beta_sfc_cpl)[i] == 1, findall(==(1), parent(ice_mask))) - - # calculate turbulent fluxes on atmos grid and save in atmos cache - parent(atmos_sim.integrator.p.T_sfc) .= parent(T_sfc_cpl) - if :z0b in propertynames(atmos_sim.integrator.p.surface_scheme) - parent(atmos_sim.integrator.p.sfc_inputs.z0b) .= parent(z0b_cpl) - parent(atmos_sim.integrator.p.sfc_inputs.z0m) .= parent(z0m_cpl) - end - - Fields.bycolumn(axes(atmos_sim.integrator.p.ts_sfc)) do colidx - ClimaAtmos.set_surface_thermo_state!( - ClimaAtmos.Decoupled(), - atmos_sim.integrator.p.surface_scheme.sfc_thermo_state_type, - atmos_sim.integrator.p.ts_sfc[colidx], - atmos_sim.integrator.p.T_sfc[colidx], - Spaces.level(atmos_sim.integrator.p.ᶜts[colidx], 1), - thermo_params, - atmos_sim.integrator.t, - ) - - get_surface_fluxes!( - atmos_sim.integrator.u, - atmos_sim.integrator.p, - atmos_sim.integrator.t, - colidx, - atmos_sim.integrator.p.atmos.vert_diff, - ) - end - - # TODO correct for ice coverage -end - -function atmos_pull!(cs, surfces) - # placehoolder: add method to calculate fluxes above individual surfaces and then split fluxes (separate PR) -end - -maximumfield(el1, el2) = maximum([el1, el2]) diff --git a/experiments/AMIP/moist_mpi_earth/sbatch_job.sh b/experiments/AMIP/moist_mpi_earth/sbatch_job.sh deleted file mode 100644 index 739f651a93..0000000000 --- a/experiments/AMIP/moist_mpi_earth/sbatch_job.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -#SBATCH --ntasks=64 -#SBATCH --time=30:00:00 # walltime - -set -euo pipefail # kill the job if anything fails -set -x # echo script - -module purge -module load julia/1.8.1 openmpi/4.1.1 hdf5/1.12.1-ompi411 #netcdf-c/4.6.1 - -export CLIMACORE_DISTRIBUTED="MPI" -export JUlIA_MPI_BINARY="system" -export JULIA_HDF5_PATH="" - -# run instantiate/precompile serial -julia --project -e 'using Pkg; Pkg.instantiate(); Pkg.build()' -julia --project -e 'using Pkg; Pkg.build("MPI"); Pkg.build("HDF5")' - -#mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad clearsky --microphy 0M --z_elem 50 --dz_top 3000 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --alpha_rayleigh_w 10 --dt_cpl 150 --dt_rad 1hours --idealized_insolation true --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 360days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name monin_spg10_fixmsk_csky_iinsol_vereq3_dztop_Wf0p5 -#mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad clearsky --microphy 0M --z_elem 50 --dz_top 3000 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --alpha_rayleigh_w 10 --dt_cpl 150 --dt_rad 1hours --idealized_insolation true --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 360days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name test_full_ -#mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad clearsky --microphy 0M --z_elem 50 --dz_top 3000 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --alpha_rayleigh_w 10 --dt_cpl 150 --dt_rad 1hours --idealized_insolation true --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 360days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name test_full_maxmin -# mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad clearsky --microphy 0M --z_elem 50 --dz_top 3000 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --alpha_rayleigh_w 10 --dt_cpl 50 --dt_rad 1hours --idealized_insolation true --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 360days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name test_full_maxmin50 -#mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad clearsky --microphy 0M --z_elem 45 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --dt_cpl 150 --dt_rad 6hours --idealized_insolation true --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 360days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name test_full_maxmin150_lessdz -#mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad allskywithclear --microphy 0M --z_elem 45 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --dt_cpl 150 --dt_rad 1hours --idealized_insolation false --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 360days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name test_full_maxminq150_lessdz_albedoadjusted04allsky_rinsol -mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad allskywithclear --microphy 0M --z_elem 45 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --dt_cpl 150 --dt_rad 1hours --idealized_insolation false --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 360days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name test_rinsol_ntasks64 - - - -#mpiexec julia --project coupler_driver.jl --surface_scheme monin_obukhov --moist equil --rad clearsky --microphy 0M --z_elem 50 --dz_top 3000 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --alpha_rayleigh_w 10 --dt_cpl 50 --dt_rad 1hours --idealized_insolation true --FLOAT_TYPE Float64 --vert_diff true --energy_check false --mode_name amip --t_end 120days --dt_save_to_sol 10days --mono_surface false --dt_save_to_disk 1days --run_name test_full50 - -# goal: mpiexec julia --project=examples examples/hybrid/driver.jl --surface_scheme monin_obukhov --moist equil --rad allskywithclear --microphy 0M --z_elem 45 --dz_bottom 30 --h_elem 16 --kappa_4 1e16 --rayleigh_sponge true --alpha_rayleigh_uh 0 --dt 150secs --dt_rad 1hours --idealized_insolation false --t_end 365days --job_id longrun_aquaplanet_rhoe_equil_highres_allsky --dt_save_to_disk 10days --FLOAT_TYPE Float64 \ No newline at end of file diff --git a/experiments/AMIP/moist_mpi_earth/slab/slab_init.jl b/experiments/AMIP/moist_mpi_earth/slab/slab_init.jl deleted file mode 100644 index 95556878ce..0000000000 --- a/experiments/AMIP/moist_mpi_earth/slab/slab_init.jl +++ /dev/null @@ -1,146 +0,0 @@ -# slab_rhs! -using ClimaCore - -""" - ThermalSlabParameters{FT<:AbstractFloat} - -Parameters needed for a thermal slab model. - -""" -struct ThermalSlabParameters{FT <: AbstractFloat} - h::FT - ρ::FT - c::FT - z0m::FT - z0b::FT - α::FT -end - - -""" - slab_space_init - -Creates the state vector and sets initial conditions. -""" -function slab_space_init(::Type{FT}, space, T_init; anomaly = false, hs_sfc = false) where {FT} - - coords = ClimaCore.Fields.coordinate_field(space) - - # initial condition - T_sfc = map(coords) do coord - T_sfc_0 = FT(T_init) - radlat = coord.lat / FT(180) * pi - ΔT = FT(0) - if anomaly == true - anom_ampl = FT(0) - lat_0 = FT(60) / FT(180) * pi - lon_0 = FT(-90) / FT(180) * pi - radlon = coord.long / FT(180) * pi - stdev = FT(5) / FT(180) * pi - ΔT = anom_ampl * exp(-((radlat - lat_0)^2 / 2stdev^2 + (radlon - lon_0)^2 / 2stdev^2)) - elseif hs_sfc == true - ΔT = -FT(60) * sin(radlat)^2 - end - T_sfc_0 + ΔT - end - - # prognostic variable - Y = ClimaCore.Fields.FieldVector(T_sfc = T_sfc) - - return Y, space -end - -""" - slab_rhs!(dY, Y, cache, t) - -Computes the rhs of the slab model. -""" -function slab_rhs!(dY, Y, cache, t) - p, F_aero, F_rad, land_mask = cache - FT = eltype(Y.T_sfc) - rhs = @. -(F_aero + F_rad) / (p.h * p.ρ * p.c) - parent(dY.T_sfc) .= parent(rhs) # apply_mask.(FT, parent(land_mask), parent(rhs)) -end - -""" - slab_init - -Initializes the slab simulation. -""" -function slab_init(::Type{FT}; tspan, dt, saveat, space, land_mask, stepper = Euler()) where {FT} - - params = ThermalSlabParameters(FT(1), FT(1500.0), FT(800.0), FT(1e-3), FT(1e-5), FT(0.2)) - T_init = FT(315) - Y, space = slab_space_init(FT, space, T_init, hs_sfc = true) - cache = ( - params = params, - F_aero = ClimaCore.Fields.zeros(space), - F_rad = ClimaCore.Fields.zeros(space), - land_mask = land_mask, - ) - problem = OrdinaryDiffEq.ODEProblem(slab_rhs!, Y, tspan, cache) - integrator = OrdinaryDiffEq.init(problem, stepper, dt = dt, saveat = saveat) - - SlabSimulation(params, Y, space, integrator) -end - -""" - get_land_energy(slab_sim::SlabSimulation, T_sfc) - -Returns the energy of the slab; a method for the slab -when used as the land model. -""" -function get_land_energy(slab_sim::SlabSimulation, T_sfc) - return get_slab_energy(slab_sim, T_sfc) -end - -""" - get_land_temp(slab_sim::SlabSimulation) - -Returns the surface temperature of the slab; -a method for the slab -when used as the land model. -""" -function get_land_temp(slab_sim) - return slab_sim.integrator.u.T_sfc -end - -""" - get_land_roughness(slab_sim::SlabSimulation) - -Returns the roughness length parameters of the slab; -a method for the slab -when used as the land model. -""" -function get_land_roughness(slab_sim::SlabSimulation) - return slab_sim.integrator.p.params.z0m, slab_sim.integrator.p.params.z0b -end - -""" - land_albedo(slab_sim::SlabSimulation) - -Returns the surface albedo of the slab; -a method for the slab -when used as the land model. -""" -land_albedo(slab_sim::SlabSimulation) = slab_sim.params.α - -""" - land_beta(slab_sim::SlabSimulation) - -Returns the beta factor of the slab; -a method for the slab -when used as the land model. -""" -land_beta(slab_sim::SlabSimulation) = slab_sim.params.β - -""" - get_land_q(slab_sim::SlabSimulation, atmos_sim, T_land, ρ_sfc) - -Returns the surface specific humidity of the slab; -a method for the slab -when used as the land model. -""" -function get_land_q(slab_sim::SlabSimulation, atmos_sim, T_land, ρ_sfc) - return TD.q_vap_saturation_generic.(atmos_sim.integrator.p.params, T_land, ρ_sfc, TD.Liquid()) -end diff --git a/experiments/AMIP/moist_mpi_earth/slab/slab_utils.jl b/experiments/AMIP/moist_mpi_earth/slab/slab_utils.jl deleted file mode 100644 index d511c9bbf4..0000000000 --- a/experiments/AMIP/moist_mpi_earth/slab/slab_utils.jl +++ /dev/null @@ -1,19 +0,0 @@ -""" - SlabSimulation{P, Y, D, I} - -The simulation structure for slab models. -""" -struct SlabSimulation{P, Y, D, I} - params::P - Y_init::Y - domain::D - integrator::I -end - -""" - get_slab_energy(slab_sim, T_sfc) - -Returns the internal energy per unit area of the slab. -""" -get_slab_energy(slab_sim, T_sfc) = - slab_sim.integrator.p.params.ρ .* slab_sim.integrator.p.params.c .* T_sfc .* slab_sim.integrator.p.params.h diff --git a/experiments/AMIP/moist_mpi_earth/slab_ice/slab_init.jl b/experiments/AMIP/moist_mpi_earth/slab_ice/slab_init.jl deleted file mode 100644 index 798b92ab8a..0000000000 --- a/experiments/AMIP/moist_mpi_earth/slab_ice/slab_init.jl +++ /dev/null @@ -1,81 +0,0 @@ -# slab_ice - -# sea-ice parameters -struct IceSlabParameters{FT <: AbstractFloat} - h::FT # sea ice height - ρ::FT - c::FT - T_base::FT - z0m::FT - z0b::FT - T_freeze::FT # temperature at freezing point [K] - k_ice::FT # thermal conductivity of ice [W / m / K] - α::FT # albedo -end - -# init simulation -function slab_ice_space_init(::Type{FT}, space, p) where {FT} - Y = Fields.FieldVector(T_sfc = ones(space) .* p.T_freeze) - return Y -end - - -function ice_rhs!(du, u, p, t) - dY = du - Y = u - FT = eltype(dY) - - params = p.params - F_aero = p.F_aero - F_rad = p.F_rad - ice_mask = p.ice_mask - - F_conductive = @. params.k_ice / (params.h) * (params.T_base - Y.T_sfc) - rhs = @. (-F_aero - F_rad + F_conductive) / (params.h * params.ρ * params.c) - parent(dY.T_sfc) .= parent(rhs) # apply_mask.(parent(ice_mask), >, parent(rhs), parent(rhs) .* FT(0), FT(0) ) -end - -""" -ice_init(::Type{FT}; tspan, dt, saveat, space, ice_mask, stepper = Euler()) where {FT} - -Initializes the `DiffEq` problem, and creates a Simulation-type object containing the necessary information for `step!` in the coupling loop. -""" -function ice_init(::Type{FT}; tspan, saveat, dt, space, ice_mask, stepper = Euler()) where {FT} - - params = IceSlabParameters( - FT(2), - FT(1500.0), - FT(800.0), - FT(280.0), - FT(1e-3), - FT(1e-5), - FT(273.15), - FT(2.0),# k_ice - FT(0.8), # albedo - ) - - Y = slab_ice_space_init(FT, space, params) - cache = (; F_aero = ClimaCore.Fields.zeros(space), F_rad = ClimaCore.Fields.zeros(space), ice_mask = ice_mask) - - problem = OrdinaryDiffEq.ODEProblem(ice_rhs!, Y, tspan, (; cache..., params = params)) - integrator = OrdinaryDiffEq.init(problem, stepper, dt = dt, saveat = saveat) - - - SlabSimulation(params, Y, space, integrator) -end - -# file-specific -""" - clean_sic(SIC, _info) -Ensures that the space of the SIC struct matches that of the mask, and converts the units from area % to area fraction. -""" -clean_sic(SIC, _info) = swap_space!(zeros(axes(_info.land_mask)), SIC) ./ float_type_bcf(_info)(100.0) - -# setting that SIC < 0.5 os counted as ocean if binary remapping of landsea mask. -get_ice_mask(h_ice::FT, mono, threshold = 0.5) where {FT} = mono ? h_ice : binary_mask.(h_ice, threshold = threshold) - -""" -apply_mask(mask, condition, yes, no, value = 0.5) -- apply mask mased on a threshold value in the mask -""" -apply_mask(mask, condition, yes, no, value) = condition(mask, value) ? yes : no diff --git a/experiments/AMIP/moist_mpi_earth/slab_ocean/slab_init.jl b/experiments/AMIP/moist_mpi_earth/slab_ocean/slab_init.jl deleted file mode 100644 index 83d22a7c21..0000000000 --- a/experiments/AMIP/moist_mpi_earth/slab_ocean/slab_init.jl +++ /dev/null @@ -1,75 +0,0 @@ -# slab_rhs! -using ClimaCore - -# ocean parameters -struct OceanSlabParameters{FT <: AbstractFloat} - h::FT - ρ::FT - c::FT - T_init::FT - z0m::FT - z0b::FT - α::FT -end - -# init simulation -function slab_ocean_space_init(::Type{FT}, space, p) where {FT} - - coords = ClimaCore.Fields.coordinate_field(space) - - # initial condition - T_sfc = map(coords) do coord - T_sfc_0 = FT(p.T_init) #- FT(275) # close to the average of T_1 in atmos - anom_ampl = FT(0) - radlat = coord.lat / FT(180) * pi - lat_0 = FT(60) / FT(180) * pi - lon_0 = FT(-90) / FT(180) * pi - radlon = coord.long / FT(180) * pi - stdev = FT(5) / FT(180) * pi - anom = anom_ampl * exp(-((radlat - lat_0)^2 / 2stdev^2 + (radlon - lon_0)^2 / 2stdev^2)) - T_sfc = T_sfc_0 + anom - end - - # prognostic variable - Y = ClimaCore.Fields.FieldVector(T_sfc = T_sfc) - - return Y, space -end - -# ode -function slab_ocean_rhs!(dY, Y, cache, t) - p, F_aero, F_rad, ocean_mask = cache - FT = eltype(Y.T_sfc) - rhs = @. -(F_aero + F_rad) / (p.h * p.ρ * p.c) - parent(dY.T_sfc) .= parent(rhs) # apply_mask.(FT, parent(ocean_mask), parent(rhs)) -end - - -""" - ocean_init(::Type{FT}; tspan, dt, saveat, space, land_mask, stepper = Euler()) where {FT} - -Initializes the `DiffEq` problem, and creates a Simulation-type object containing the necessary information for `step!` in the coupling loop. -""" -function ocean_init(::Type{FT}; tspan, dt, saveat, space, ocean_mask, stepper = Euler()) where {FT} - - params = OceanSlabParameters(FT(20), FT(1500.0), FT(800.0), FT(280.0), FT(1e-3), FT(1e-5), FT(0.06)) - - Y, space = slab_ocean_space_init(FT, space, params) - cache = ( - params = params, - F_aero = ClimaCore.Fields.zeros(space), - F_rad = ClimaCore.Fields.zeros(space), - ocean_mask = ocean_mask, - ) - problem = OrdinaryDiffEq.ODEProblem(slab_ocean_rhs!, Y, tspan, cache) - integrator = OrdinaryDiffEq.init(problem, stepper, dt = dt, saveat = saveat) - - SlabSimulation(params, Y, space, integrator) -end - -# file specific -""" - clean_sst(SST::FT, _info) -Ensures that the space of the SST struct matches that of the mask, and converts the units to Kelvin (N.B.: this is dataset specific) -""" -clean_sst(SST, _info) = (swap_space!(zeros(axes(_info.land_mask)), SST) .+ float_type_bcf(_info)(273.15)) diff --git a/experiments/AMIP/moist_mpi_earth/user_diagnostics.jl b/experiments/AMIP/moist_mpi_earth/user_diagnostics.jl deleted file mode 100644 index dd7bd8afdd..0000000000 --- a/experiments/AMIP/moist_mpi_earth/user_diagnostics.jl +++ /dev/null @@ -1,86 +0,0 @@ -#import Diagnostics: get_var - -# Atmos diagnostics - -""" - get_var(cs::CoupledSimulation, ::Val{:T}) - -Air temperature (K). -""" -function get_var(cs::CoupledSimulation, ::Val{:T}) - p = cs.model_sims.atmos_sim.integrator.p - (; ᶜts, params) = p - thermo_params = CAP.thermodynamics_params(params) - @. TD.air_temperature(thermo_params, ᶜts) -end - -""" - get_var(cs::CoupledSimulation, ::Val{:u}) - -Zonal wind (m s⁻¹). -""" -get_var(cs::CoupledSimulation, ::Val{:u}) = - ClimaCore.Geometry.UVVector.(cs.model_sims.atmos_sim.integrator.u.c.uₕ).components.data.:1 - -""" - get_var(cs::CoupledSimulation, ::Val{:q_tot}) - -Total specific humidity (kg kg⁻¹). -""" -get_var(cs::CoupledSimulation, ::Val{:q_tot}) = - cs.model_sims.atmos_sim.integrator.u.c.ρq_tot ./ cs.model_sims.atmos_sim.integrator.u.c.ρ .* float_type(cs)(1000) - -""" - get_var(cs::CoupledSimulation, ::Val{:toa}) - -Top of the atmosphere radiation fluxes (W m⁻²). -""" -function get_var(cs::CoupledSimulation, ::Val{:toa}) - atmos_sim = cs.model_sims.atmos_sim - face_space = axes(atmos_sim.integrator.u.f) - z = parent(Fields.coordinate_field(face_space).z) - Δz_top = round(FT(0.5) * (z[end, 1, 1, 1, 1] - z[end - 1, 1, 1, 1, 1])) - n_faces = length(z[:, 1, 1, 1, 1]) - - LWd_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_lw_flux_dn), face_space), - n_faces - half, - ) - LWu_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_lw_flux_up), face_space), - n_faces - half, - ) - SWd_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_sw_flux_dn), face_space), - n_faces - half, - ) - SWu_TOA = Fields.level( - RRTMGPI.array2field(FT.(atmos_sim.integrator.p.radiation_model.face_sw_flux_up), face_space), - n_faces - half, - ) - - radiation_sources = @. -(LWd_TOA + SWd_TOA - LWu_TOA - SWu_TOA) - swap_space!(zeros(cs.boundary_space), radiation_sources) -end - -""" - get_var(cs::CoupledSimulation, ::Val{:precipitation}) - -Precipitation (m m⁻²). -""" -get_var(cs::CoupledSimulation, ::Val{:precipitation}) = - .-swap_space!( - zeros(cs.boundary_space), - cs.model_sims.atmos_sim.integrator.p.col_integrated_rain .+ - cs.model_sims.atmos_sim.integrator.p.col_integrated_snow, - ) - -# coupler diagnotics -""" - get_var(cs::CoupledSimulation, ::Val{:T_sfc}) - -Combined surface temperature (K). -""" -get_var(cs::CoupledSimulation, ::Val{:T_sfc}) = swap_space!(zeros(cs.boundary_space), cs.fields.T_S) - -# land diagnotics diff --git a/experiments/AMIP/moist_mpi_earth/user_plots/amip_visualizer.jl b/experiments/AMIP/moist_mpi_earth/user_plots/amip_visualizer.jl deleted file mode 100644 index d151ac7ed3..0000000000 --- a/experiments/AMIP/moist_mpi_earth/user_plots/amip_visualizer.jl +++ /dev/null @@ -1,76 +0,0 @@ -include("plot_helper.jl") - -""" - function amip_paperplots( - post_spec::NamedTuple, - plot_spec::NamedTuple, - files_dir::String; - output_dir = ".", - files_root = ".hdf5", - fig_name = "amip_paperplots", - ) -Coordinates the postprocessing and plotting of sample fields (specified in `post_spec`) -of the last monthly mean file. Any specific plot customization should be done here. -""" -function amip_paperplots( - post_spec::NamedTuple, - plot_spec::NamedTuple, - files_dir::String; - output_dir = ".", - files_root = ".hdf5", - fig_name = "amip_paperplots", -) - - diags_names = propertynames(post_spec) - - all_plots = [] - for name in diags_names - @info name - - # extract data - diag_data = read_latest_model_data(name, files_dir, files_root) - - # postprocess - post_data = postprocess(name, diag_data, getproperty(post_spec, name)) - post_data.data[1] = sum(post_data.data) == 0 ? post_data.data[1] + eps() : post_data.data[1] # avoids InexactError - - # create individual plots - p = plot( - post_data, - zmd_params = (; getproperty(plot_spec, name)...), - hsd_params = (; getproperty(plot_spec, name)...), - ) - - push!(all_plots, p) - end - - # combine plots and save figure - save_fig = Plots.plot( - all_plots..., - size = (1500, 800), - right_margin = 12Plots.mm, - left_margin = 12Plots.mm, - bottom_margin = 12Plots.mm, - top_margin = 12Plots.mm, - ) - - Plots.png(save_fig, joinpath(output_dir, fig_name * ".png")) - - return all_plots -end - -""" - read_latest_model_data(name::Symbol, filedir::String, root::String) - -Reads in a variable from a HDF5 file, as outputted by `ClimaCoupler.Dignostics`. -""" -function read_latest_model_data(name::Symbol, filedir::String, root::String) - - varfile_root = @sprintf "%s%s" string(name) root - filename = glob("*" * varfile_root * "*", filedir)[end] - - hdfreader = InputOutput.HDF5Reader(filename) - var = InputOutput.read_field(hdfreader, string(name)) - close(hdfreader) - return var -end diff --git a/experiments/AMIP/moist_mpi_earth/user_plots/ncep_visualizer.jl b/experiments/AMIP/moist_mpi_earth/user_plots/ncep_visualizer.jl deleted file mode 100644 index 2b245a1c12..0000000000 --- a/experiments/AMIP/moist_mpi_earth/user_plots/ncep_visualizer.jl +++ /dev/null @@ -1,146 +0,0 @@ -using Downloads -using NCDatasets - -include("plot_helper.jl") - -""" - ncep_paperplots( - post_spec::NamedTuple, - plot_spec::NamedTuple, - files_dir::String; - month_date = Dates.DateTime(1979, 01, 01), - output_dir = ".", - fig_name = "ncep_paperplots", - ) - -Coordinates the postprocessing and plotting of sample fields (specified in `post_spec`) -of a particular monthly mean dataset (specified by `month_date`). Any plot NCEP- specific -customization should be done here. -""" -function ncep_paperplots( - post_spec::NamedTuple, - plot_spec::NamedTuple, - files_dir::String; - month_date = Dates.DateTime(1979, 01, 01), - output_dir = ".", - fig_name = "ncep_paperplots", -) - - @info month_date - - tmp_dir = joinpath(files_dir, "ncep_tmp") - isdir(tmp_dir) ? nothing : mkpath(tmp_dir) - - ncep_src = NCEPMonthlyDataSource(tmp_dir, [month_date]) - diags_vnames = propertynames(post_spec) - - all_plots = [] - for vname in diags_vnames - @info vname - - # download and read data of this month - data, coords = get_var(ncep_src, Val(vname)) - raw_tag = length(size(data)) == 3 ? ZLatLonData() : LatLonData() - - # postprocess - post_data = postprocess(vname, data, getproperty(post_spec, vname), coords = coords, raw_tag = raw_tag) - - # create individual plots - zonal_mean_params = (; ylabel = "p (hPa)", yaxis = (;), yflip = true, getproperty(plot_spec, vname)...) # overwrite defaults - p = plot(post_data, zmd_params = zonal_mean_params, hsd_params = (; getproperty(plot_spec, vname)...)) - - push!(all_plots, p) - end - - # combine plots and save figure - save_fig = Plots.plot( - all_plots..., - size = (1500, 800), - right_margin = 12Plots.mm, - left_margin = 12Plots.mm, - bottom_margin = 12Plots.mm, - top_margin = 12Plots.mm, - ) - - Plots.png(save_fig, joinpath(output_dir, fig_name * ".png")) - - return all_plots -end - -abstract type DataSource end -struct NCEPMonthlyDataSource <: DataSource - tmp_dir::String - month_date::Array -end - -""" - download_read_nc(data_source::NCEPMonthlyDataSource, https::String, ncep_vname::String) - -Downloads and reads nc datafile of a specified NCEP variable -""" -function download_read_nc(data_source::NCEPMonthlyDataSource, https::String, ncep_vname::String) - local_file = joinpath(data_source.tmp_dir, ncep_vname * ".nc") - Downloads.download(https, local_file) - NCDataset(local_file) do ds - t_i = findall(x -> Dates.yearmonth(x) == Dates.yearmonth(data_source.month_date[1]), ds["time"][:]) # time index of month in file - d_i = length(size(ds[ncep_vname][:])) # index of time in the dimension list - lev = "level" in keys(ds) ? ds["level"][:] : [Float64(-999)] - data = dropdims(selectdim(ds[ncep_vname][:], d_i, t_i), dims = d_i) - if length(size(data)) == 3 - data .= data[:, end:-1:1, end:-1:1] - else - data .= data[:, end:-1:1] - end - coords = (; lon = ds["lon"][:], lat = ds["lat"][:][end:-1:1], lev = lev[end:-1:1]) - (Array(data), coords) - end -end - -# specification of variables -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:T}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/pressure/air.mon.mean.nc" - ncep_vname = "air" - download_read_nc(data_source, https, ncep_vname) - -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:u}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/pressure/uwnd.mon.mean.nc" - ncep_vname = "uwnd" - download_read_nc(data_source, https, ncep_vname) -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:q_tot}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/pressure/shum.mon.mean.nc" # Note that not ncep.reanalysis2 - ncep_vname = "shum" - download_read_nc(data_source, https, ncep_vname) -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:toa}) - https_root = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/gaussian_grid/" - https_suffix = ".ntat.mon.mean.nc" - - # sum, with upward positive. NB: dlwrf not available - # toa_tuple = download_read_nc(data_source, https_root * "uswrf" * https_suffix, "uswrf") - # toa_tuple.data .-= download_read_nc(data_source, https_root * "dswrf" * https_suffix, "dswrf").data - # toa_tuple.data .+= download_read_nc(data_source, https_root * "ulwrf" * https_suffix, "ulwrf").data - - data_uswrf, coords = download_read_nc(data_source, https_root * "uswrf" * https_suffix, "uswrf") - data_dswrf, _ = download_read_nc(data_source, https_root * "dswrf" * https_suffix, "dswrf") - data_ulwrf, _ = download_read_nc(data_source, https_root * "ulwrf" * https_suffix, "ulwrf") - - return (data_uswrf .- data_dswrf .+ data_ulwrf, coords) -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:precipitation}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis2/Monthlies/gaussian_grid/prate.sfc.mon.mean.nc" - ncep_vname = "prate" - download_read_nc(data_source, https, ncep_vname) -end - -function get_var(data_source::NCEPMonthlyDataSource, ::Val{:T_sfc}) - https = "https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/surface/air.sig995.mon.mean.nc" # NB: strictly speaking this is air temperature not T_sfc - ncep_vname = "air" - t_celsius, coords = download_read_nc(data_source, https, ncep_vname) - return (t_celsius .+ 273.15, coords) -end diff --git a/experiments/AMIP/moist_mpi_earth/user_plots/plot_helper.jl b/experiments/AMIP/moist_mpi_earth/user_plots/plot_helper.jl deleted file mode 100644 index c5dd8c176d..0000000000 --- a/experiments/AMIP/moist_mpi_earth/user_plots/plot_helper.jl +++ /dev/null @@ -1,95 +0,0 @@ -using Glob -using Printf -using ClimaCoupler.PostProcessor: PostProcessedData, ZLatData, LatLonData, DataPackage, ZLatLonData -using Plots - -""" - plot(post_data::DataPackage; zmd_params = (;), hsd_params = (;)) - -Coordinates plotting based on parsed data types. -""" -function plot(post_data::DataPackage; zmd_params = (;), hsd_params = (;)) - - if post_data isa ZLatData - plot_params = zmd_params - elseif post_data isa LatLonData - plot_params = hsd_params - else - plot_params = (;) - end - contourf(post_data.tag, post_data; plot_params...) -end - -""" - function contourf( - ::ZLatData, - p::DataPackage; - xlabel = "lat (deg N)", - ylabel = "z (km)", - yaxis = (:log,), - yflip = false, - clims = nothing, - units = " ", - ) - -Plots a filled contour plot on the latitude-level plane. -""" -function contourf( - ::ZLatData, - p::DataPackage; - xlabel = "lat (deg N)", - ylabel = "z (km)", - yaxis = (:log,), - yflip = false, - clims = nothing, - units = " ", -) - clims = clims == nothing ? extrema(p.data) : clims - plot_p = Plots.contourf( - p.coords.lat, - p.coords.lev, - p.data', - color = :rainbow, - title = string(p.name) * " [" * units * "]", - xlabel = xlabel, - ylabel = ylabel, - yaxis = yaxis, - yflip = yflip, - clims = clims, - ) -end - -""" - function contourf( - ::LatLonData, - p::DataPackage; - xlabel = "lat (deg N)", - ylabel = "z (km)", - yaxis = (:log,), - yflip = false, - clims = nothing, - units = " ", - ) - -Plots a filled contour plot on the longitude-latitude plane. -""" -function contourf( - ::LatLonData, - p::DataPackage; - xlabel = "lon (deg E)", - ylabel = "lat (deg N)", - clims = nothing, - units = " ", -) - clims = clims == nothing ? extrema(p.data) : clims - plot_p = Plots.contourf( - p.coords.lon, - p.coords.lat, - p.data', - color = :rainbow, - title = string(p.name) * " [" * units * "]", - xlabel = xlabel, - ylabel = ylabel, - clims = clims, - ) -end