diff --git a/Manifest.toml b/Manifest.toml
index a70a5f40b..e3eaace68 100644
--- a/Manifest.toml
+++ b/Manifest.toml
@@ -2,29 +2,36 @@
julia_version = "1.12.6"
manifest_format = "2.0"
-project_hash = "4a1c54453712ec36523d0a77fe2ba0726bb1dfec"
+project_hash = "ea0c53f331d7eac673bf44febd817737c30df434"
[[deps.ADTypes]]
git-tree-sha1 = "d9aaef7c63466eee4de23b4d9dad03629df54bea"
uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
version = "1.22.1"
+weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"]
[deps.ADTypes.extensions]
ADTypesChainRulesCoreExt = "ChainRulesCore"
ADTypesConstructionBaseExt = "ConstructionBase"
ADTypesEnzymeCoreExt = "EnzymeCore"
- [deps.ADTypes.weakdeps]
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
- ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
- EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
-
[[deps.AMD]]
deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"]
git-tree-sha1 = "45a1272e3f809d36431e57ab22703c6896b8908f"
uuid = "14f7f29c-3bd6-536c-9a0b-7339e30b5a3e"
version = "0.5.3"
+[[deps.AbstractFFTs]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef"
+uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
+version = "1.5.0"
+weakdeps = ["ChainRulesCore", "Test"]
+
+ [deps.AbstractFFTs.extensions]
+ AbstractFFTsChainRulesCoreExt = "ChainRulesCore"
+ AbstractFFTsTestExt = "Test"
+
[[deps.AbstractTrees]]
git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177"
uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
@@ -65,12 +72,23 @@ weakdeps = ["SparseArrays", "StaticArrays"]
AdaptSparseArraysExt = "SparseArrays"
AdaptStaticArraysExt = "StaticArrays"
+[[deps.AdaptivePredicates]]
+git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6"
+uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7"
+version = "1.2.0"
+
[[deps.AliasTables]]
deps = ["PtrArrays", "Random"]
git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff"
uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8"
version = "1.1.3"
+[[deps.Animations]]
+deps = ["Colors"]
+git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7"
+uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340"
+version = "0.4.2"
+
[[deps.Aqua]]
deps = ["Compat", "Pkg", "Test"]
git-tree-sha1 = "4537cc8ed3fba5d88b844a18f7e9bb93f07d2742"
@@ -134,10 +152,33 @@ version = "7.27.0"
uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
version = "1.11.0"
+[[deps.Automa]]
+deps = ["PrecompileTools", "TranscodingStreams"]
+git-tree-sha1 = "94eab0b3ccdcac361188cc661daf69d4433c1818"
+uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b"
+version = "1.2.0"
+
+[[deps.AxisAlgorithms]]
+deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
+git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712"
+uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
+version = "1.1.0"
+
+[[deps.AxisArrays]]
+deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"]
+git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad"
+uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9"
+version = "0.4.8"
+
[[deps.Base64]]
uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
version = "1.11.0"
+[[deps.BaseDirs]]
+git-tree-sha1 = "8c290a1b223deaeea9aea44b235d24546da8eb98"
+uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f"
+version = "1.4.0"
+
[[deps.BasicModelInterface]]
git-tree-sha1 = "ca36dc6dc9bbeea3dbbe3901837496ece85276e5"
uuid = "59605e27-edc0-445a-b93d-c09a3a50b330"
@@ -164,21 +205,23 @@ deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools
git-tree-sha1 = "6e7c9b6ab9aa711009a49252e45a122212c1d869"
uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e"
version = "1.12.2"
+weakdeps = ["ChainRulesCore", "ForwardDiff"]
[deps.BracketingNonlinearSolve.extensions]
BracketingNonlinearSolveChainRulesCoreExt = ["ChainRulesCore", "ForwardDiff"]
BracketingNonlinearSolveForwardDiffExt = "ForwardDiff"
- [deps.BracketingNonlinearSolve.weakdeps]
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
- ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
-
[[deps.Bzip2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e"
uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
version = "1.0.9+0"
+[[deps.CEnum]]
+git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc"
+uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
+version = "0.5.0"
+
[[deps.CFTime]]
deps = ["Dates", "Printf"]
git-tree-sha1 = "fad2f199d1f1ae0c8e820ab68f81f6dbf62e60b2"
@@ -189,18 +232,52 @@ version = "0.2.10"
uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc"
version = "1.11.0"
+[[deps.CRlibm]]
+deps = ["CRlibm_jll"]
+git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e"
+uuid = "96374032-68de-5a5b-8d9e-752f78720389"
+version = "1.0.2"
+
+[[deps.CRlibm_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc"
+uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0"
+version = "1.0.1+0"
+
[[deps.CSV]]
deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"]
git-tree-sha1 = "8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d"
uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
version = "0.10.16"
+[[deps.Cairo]]
+deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"]
+git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9"
+uuid = "159f3aea-2a34-519c-b102-8c37f9878175"
+version = "1.1.1"
+
+[[deps.CairoMakie]]
+deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"]
+git-tree-sha1 = "47142129b1777e21da58cff265050b10d8560588"
+uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
+version = "0.15.13"
+
[[deps.Cairo_jll]]
deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
git-tree-sha1 = "1fa950ebc3e37eccd51c6a8fe1f92f7d86263522"
uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
version = "1.18.7+0"
+[[deps.ChainRulesCore]]
+deps = ["Compat", "LinearAlgebra"]
+git-tree-sha1 = "12177ad6b3cad7fd50c8b3825ce24a99ad61c18f"
+uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+version = "1.26.1"
+weakdeps = ["SparseArrays"]
+
+ [deps.ChainRulesCore.extensions]
+ ChainRulesCoreSparseArraysExt = "SparseArrays"
+
[[deps.CodeTracking]]
deps = ["InteractiveUtils", "REPL", "UUIDs"]
git-tree-sha1 = "cfb7a2e89e245a9d5016b70323db412b3a7438d5"
@@ -219,6 +296,18 @@ git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9"
uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
version = "0.7.8"
+[[deps.CodecZstd]]
+deps = ["TranscodingStreams", "Zstd_jll"]
+git-tree-sha1 = "da54a6cd93c54950c15adf1d336cfd7d71f51a56"
+uuid = "6b39b394-51ab-5f42-8807-6242bab2b4c2"
+version = "0.8.7"
+
+[[deps.ColorBrewer]]
+deps = ["Colors", "JSON"]
+git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349"
+uuid = "a2cac450-b92f-5266-8821-25eda20663c8"
+version = "0.4.2"
+
[[deps.ColorSchemes]]
deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34"
@@ -297,6 +386,12 @@ weakdeps = ["InverseFunctions"]
[deps.CompositionsBase.extensions]
CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+[[deps.ComputePipeline]]
+deps = ["Observables", "Preferences"]
+git-tree-sha1 = "7bc84b769c1d384315e7b5c4ac03a6c303e6cf35"
+uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c"
+version = "0.1.8"
+
[[deps.ConcreteStructs]]
git-tree-sha1 = "1988532cb3b4525bb718b99ba07e433bbf0e600b"
uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
@@ -324,22 +419,30 @@ version = "0.17.6"
git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb"
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
version = "1.6.0"
+weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"]
[deps.ConstructionBase.extensions]
ConstructionBaseIntervalSetsExt = "IntervalSets"
ConstructionBaseLinearAlgebraExt = "LinearAlgebra"
ConstructionBaseStaticArraysExt = "StaticArrays"
- [deps.ConstructionBase.weakdeps]
- IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
- LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
- StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
-
[[deps.Contour]]
git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8"
uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
version = "0.6.3"
+[[deps.CoreMath]]
+deps = ["CoreMath_jll"]
+git-tree-sha1 = "8c0480f92b1b1796239156a1b9b1bfb1b39499b4"
+uuid = "b7a15901-be09-4a0e-87d2-2e66b0e09b5a"
+version = "0.1.0"
+
+[[deps.CoreMath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "a692a4c1dc59a4b8bc0b6403876eb3250fde2bc3"
+uuid = "a38c48d9-6df1-5ac9-9223-b6ada3b5572b"
+version = "0.1.0+0"
+
[[deps.Crayons]]
git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15"
uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
@@ -407,6 +510,12 @@ git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd"
uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab"
version = "1.16.2+0"
+[[deps.DelaunayTriangulation]]
+deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"]
+git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8"
+uuid = "927a84f5-c5f4-47a5-9785-b46e178433df"
+version = "1.6.6"
+
[[deps.DelimitedFiles]]
deps = ["Mmap"]
git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae"
@@ -549,6 +658,24 @@ deps = ["Random", "Serialization", "Sockets"]
uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
version = "1.11.0"
+[[deps.Distributions]]
+deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"]
+git-tree-sha1 = "cd3c5ac74cd3923c8945c6a81518c46abd0e73a3"
+uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
+version = "0.25.129"
+
+ [deps.Distributions.extensions]
+ DistributionsChainRulesCoreExt = "ChainRulesCore"
+ DistributionsDensityInterfaceExt = "DensityInterface"
+ DistributionsSparseConnectivityTracerExt = "SparseConnectivityTracer"
+ DistributionsTestExt = "Test"
+
+ [deps.Distributions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d"
+ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
+ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+
[[deps.DocStringExtensions]]
git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
@@ -569,6 +696,12 @@ weakdeps = ["JuMP"]
[deps.Dualization.extensions]
DualizationJuMPExt = "JuMP"
+[[deps.EarCut_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053"
+uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
+version = "2.2.4+0"
+
[[deps.EnumX]]
git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c"
uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
@@ -578,21 +711,24 @@ version = "1.0.7"
git-tree-sha1 = "971d7831cc85f43bc9f51d615a3f7f21270c2f1d"
uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
version = "0.8.21"
+weakdeps = ["Adapt", "ChainRulesCore"]
[deps.EnzymeCore.extensions]
AdaptExt = "Adapt"
EnzymeCoreChainRulesCoreExt = "ChainRulesCore"
- [deps.EnzymeCore.weakdeps]
- Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
-
[[deps.EpollShim_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d"
uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43"
version = "0.0.20230411+1"
+[[deps.ExactPredicates]]
+deps = ["IntervalArithmetic", "Random", "StaticArrays"]
+git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f"
+uuid = "429591f6-91af-11e9-00e2-59fbe8cec110"
+version = "2.2.9"
+
[[deps.ExceptionUnwrapping]]
deps = ["Test"]
git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a"
@@ -627,6 +763,12 @@ git-tree-sha1 = "7a58e45171b63ed4782f2d36fdee8713a469e6e0"
uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
version = "8.1.2+0"
+[[deps.FFTA]]
+deps = ["AbstractFFTs", "DocStringExtensions", "LinearAlgebra", "MuladdMacro", "Primes", "Random", "Reexport"]
+git-tree-sha1 = "65e55303b72f4a567a51b174dd2c47496efeb95a"
+uuid = "b86e33f2-c0db-4aa1-a6e0-ab43e668529e"
+version = "0.3.1"
+
[[deps.FastBroadcast]]
deps = ["ArrayInterface", "LinearAlgebra"]
git-tree-sha1 = "8b77b1a6d20b051c223c4907d92dbf9af7b23fa5"
@@ -669,6 +811,32 @@ version = "1.3.3"
ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+[[deps.FileIO]]
+deps = ["Pkg", "Requires", "UUIDs"]
+git-tree-sha1 = "8e9c059d6857607253e837730dbf780b6b151acd"
+uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
+version = "1.19.0"
+weakdeps = ["HTTP"]
+
+ [deps.FileIO.extensions]
+ HTTPExt = "HTTP"
+
+[[deps.FilePaths]]
+deps = ["FilePathsBase", "MacroTools", "Reexport"]
+git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c"
+uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824"
+version = "0.9.0"
+
+ [deps.FilePaths.extensions]
+ FilePathsGlobExt = "Glob"
+ FilePathsURIParserExt = "URIParser"
+ FilePathsURIsExt = "URIs"
+
+ [deps.FilePaths.weakdeps]
+ Glob = "c27321d9-0574-5035-807b-f59d2c89b15c"
+ URIParser = "30578b45-9adc-5946-b283-645ec420af67"
+ URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
+
[[deps.FilePathsBase]]
deps = ["Compat", "Dates"]
git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2"
@@ -689,6 +857,7 @@ deps = ["LinearAlgebra"]
git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3"
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
version = "1.16.0"
+weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"]
[deps.FillArrays.extensions]
FillArraysPDMatsExt = "PDMats"
@@ -696,12 +865,6 @@ version = "1.16.0"
FillArraysStaticArraysExt = "StaticArrays"
FillArraysStatisticsExt = "Statistics"
- [deps.FillArrays.weakdeps]
- PDMats = "90014a1f-27ba-587c-ab20-58faa44d9150"
- SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
- StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
- Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
-
[[deps.FindFirstFunctions]]
deps = ["PrecompileTools"]
git-tree-sha1 = "e6e5cbf7e6f2e3c075f0aea1a43a61306a990c3d"
@@ -753,12 +916,24 @@ weakdeps = ["StaticArrays"]
[deps.ForwardDiff.extensions]
ForwardDiffStaticArraysExt = "StaticArrays"
+[[deps.FreeType]]
+deps = ["CEnum", "FreeType2_jll"]
+git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999"
+uuid = "b38be410-82b0-50bf-ab77-7b57e271db43"
+version = "4.1.1"
+
[[deps.FreeType2_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e"
uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
version = "2.14.3+1"
+[[deps.FreeTypeAbstraction]]
+deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"]
+git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11"
+uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
+version = "0.10.8"
+
[[deps.FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7"
@@ -820,6 +995,27 @@ git-tree-sha1 = "6fada551286ab6ea4ca1628cb2de9f166a2ec966"
uuid = "d2c73de3-f751-5644-a686-071e5b155ba9"
version = "0.73.26+0"
+[[deps.Gamma]]
+git-tree-sha1 = "86f86b6168a016ed88e4ae4e64577b98c3b59e8e"
+uuid = "a0844989-3bd2-4988-8bea-c9407ab0941b"
+version = "1.1.0"
+
+[[deps.GeometryBasics]]
+deps = ["EarCut_jll", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"]
+git-tree-sha1 = "364685f5ffde25deb1bbcfd5bb278a5c6b7a9b37"
+uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
+version = "0.5.11"
+
+ [deps.GeometryBasics.extensions]
+ ExtentsExt = "Extents"
+ GeometryBasicsGeoInterfaceExt = "GeoInterface"
+ IntervalSetsExt = "IntervalSets"
+
+ [deps.GeometryBasics.weakdeps]
+ Extents = "411431e0-e8b7-467b-b5e0-f676ba4f2910"
+ GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+
[[deps.GettextRuntime_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"]
git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340"
@@ -832,6 +1028,12 @@ git-tree-sha1 = "38044a04637976140074d0b0621c1edf0eb531fd"
uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b"
version = "9.55.1+0"
+[[deps.Giflib_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a"
+uuid = "59f7168a-df46-5410-90c8-f2779963d0ec"
+version = "5.2.3+0"
+
[[deps.Glib_jll]]
deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed"
@@ -843,6 +1045,12 @@ git-tree-sha1 = "246c628cec062230b7d183aab88841fa94fcabe9"
uuid = "c27321d9-0574-5035-807b-f59d2c89b15c"
version = "1.5.0"
+[[deps.Graphics]]
+deps = ["Colors", "LinearAlgebra", "NaNMath"]
+git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c"
+uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
+version = "1.1.3"
+
[[deps.Graphite2_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "69ffb934a5c5b7e086a0b4fee3427db2556fba6e"
@@ -854,13 +1062,16 @@ deps = ["ArnoldiMethod", "DataStructures", "Inflate", "LinearAlgebra", "Random",
git-tree-sha1 = "7eb45fe833a5b7c51cf6d89c5a841d5967e44be3"
uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
version = "1.14.0"
+weakdeps = ["Distributed", "SharedArrays"]
[deps.Graphs.extensions]
GraphsSharedArraysExt = "SharedArrays"
- [deps.Graphs.weakdeps]
- Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b"
- SharedArrays = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+[[deps.GridLayoutBase]]
+deps = ["GeometryBasics", "InteractiveUtils", "Observables"]
+git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f"
+uuid = "3955a311-db13-416c-9275-1d80ed98e5e9"
+version = "0.11.2"
[[deps.Grisu]]
git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
@@ -903,12 +1114,59 @@ git-tree-sha1 = "c35847ca5b4997fc8418836354a56c459bcf48d8"
uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
version = "2.14.0+0"
+[[deps.HypergeometricFunctions]]
+deps = ["Gamma", "LinearAlgebra"]
+git-tree-sha1 = "18d7deab5fb0440dc6a7b6993c5c27b25420de10"
+uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
+version = "0.3.29"
+
[[deps.IOCapture]]
deps = ["Logging", "Random"]
git-tree-sha1 = "0ee181ec08df7d7c911901ea38baf16f755114dc"
uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89"
version = "1.0.0"
+[[deps.ImageAxes]]
+deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"]
+git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba"
+uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac"
+version = "0.6.12"
+
+[[deps.ImageBase]]
+deps = ["ImageCore", "Reexport"]
+git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909"
+uuid = "c817782e-172a-44cc-b673-b171935fbb9e"
+version = "0.1.7"
+
+[[deps.ImageCore]]
+deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"]
+git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3"
+uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
+version = "0.10.5"
+
+[[deps.ImageIO]]
+deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"]
+git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7"
+uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
+version = "0.6.9"
+
+[[deps.ImageMetadata]]
+deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"]
+git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec"
+uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49"
+version = "0.9.10"
+
+[[deps.Imath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65"
+uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1"
+version = "3.2.2+0"
+
+[[deps.IndirectArrays]]
+git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f"
+uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959"
+version = "1.0.0"
+
[[deps.Infiltrator]]
deps = ["InteractiveUtils", "Markdown", "REPL", "UUIDs"]
git-tree-sha1 = "0330ef9ac27dc069bf97fa5ab1a4391be4fcc4f6"
@@ -933,6 +1191,11 @@ version = "1.4.5"
ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
+[[deps.IntegerMathUtils]]
+git-tree-sha1 = "4c1acff2dc6b6967e7e750633c50bc3b8d83e617"
+uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235"
+version = "0.1.3"
+
[[deps.IntelOpenMP_jll]]
deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303"
@@ -944,6 +1207,54 @@ deps = ["Markdown"]
uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
version = "1.11.0"
+[[deps.Interpolations]]
+deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
+git-tree-sha1 = "48922d06068130f87e43edef52382e6a94305ae6"
+uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
+version = "0.16.3"
+weakdeps = ["ForwardDiff", "Unitful"]
+
+ [deps.Interpolations.extensions]
+ InterpolationsForwardDiffExt = "ForwardDiff"
+ InterpolationsUnitfulExt = "Unitful"
+
+[[deps.IntervalArithmetic]]
+deps = ["CRlibm", "CoreMath", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"]
+git-tree-sha1 = "c3ee408ae340565f41699e3a3fa1053698c7626e"
+uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253"
+version = "1.0.10"
+
+ [deps.IntervalArithmetic.extensions]
+ IntervalArithmeticArblibExt = "Arblib"
+ IntervalArithmeticDiffRulesExt = "DiffRules"
+ IntervalArithmeticForwardDiffExt = "ForwardDiff"
+ IntervalArithmeticIntervalSetsExt = "IntervalSets"
+ IntervalArithmeticIrrationalConstantsExt = "IrrationalConstants"
+ IntervalArithmeticLinearAlgebraExt = "LinearAlgebra"
+ IntervalArithmeticRecipesBaseExt = "RecipesBase"
+ IntervalArithmeticSparseArraysExt = "SparseArrays"
+
+ [deps.IntervalArithmetic.weakdeps]
+ Arblib = "fb37089c-8514-4489-9461-98f9c8763369"
+ DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ IrrationalConstants = "92d709cd-6900-40b7-9082-c6be49f344b6"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+
+[[deps.IntervalSets]]
+git-tree-sha1 = "79d6bd28c8d9bccc2229784f1bd637689b256377"
+uuid = "8197267c-284f-5f27-9208-e0e47529a953"
+version = "0.7.14"
+weakdeps = ["Random", "RecipesBase", "Statistics"]
+
+ [deps.IntervalSets.extensions]
+ IntervalSetsRandomExt = "Random"
+ IntervalSetsRecipesBaseExt = "RecipesBase"
+ IntervalSetsStatisticsExt = "Statistics"
+
[[deps.InverseFunctions]]
git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
@@ -964,6 +1275,12 @@ git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758"
uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
version = "0.2.6"
+[[deps.Isoband]]
+deps = ["isoband_jll"]
+git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137"
+uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4"
+version = "0.1.1"
+
[[deps.IterTools]]
git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023"
uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
@@ -1016,6 +1333,12 @@ git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c"
uuid = "ae98c720-c025-4a4a-838c-29b094483192"
version = "0.2.1"
+[[deps.JpegTurbo]]
+deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"]
+git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9"
+uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0"
+version = "0.1.6"
+
[[deps.JpegTurbo_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "1dae3057da6f2b9c857afef03177bbdc7c4afe92"
@@ -1051,6 +1374,12 @@ deps = ["StyledStrings"]
uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011"
version = "1.12.0"
+[[deps.KernelDensity]]
+deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"]
+git-tree-sha1 = "9eda8292dd3268b3b7ec9df21bbfac24e177ec52"
+uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b"
+version = "0.6.12"
+
[[deps.Krylov]]
deps = ["LinearAlgebra", "Printf", "SparseArrays"]
git-tree-sha1 = "fc2e5bc665dfa1be33fac60b5762d462bccfae7b"
@@ -1117,6 +1446,11 @@ deps = ["Artifacts", "Pkg"]
uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
version = "1.11.0"
+[[deps.LazyModules]]
+git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e"
+uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e"
+version = "0.3.1"
+
[[deps.LeftChildRightSiblingTrees]]
deps = ["AbstractTrees"]
git-tree-sha1 = "95ba48564903b43b2462318aa243ee79d81135ff"
@@ -1367,6 +1701,23 @@ git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522"
uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
version = "0.5.16"
+[[deps.Makie]]
+deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"]
+git-tree-sha1 = "f2c8715d05bf10f9d4dc354e69dee30b6be53239"
+uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
+version = "0.24.13"
+
+ [deps.Makie.extensions]
+ MakieDynamicQuantitiesExt = "DynamicQuantities"
+
+ [deps.Makie.weakdeps]
+ DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821"
+
+[[deps.MappedArrays]]
+git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40"
+uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
+version = "0.4.3"
+
[[deps.Markdown]]
deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"]
uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
@@ -1408,6 +1759,12 @@ version = "1.51.1"
BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8"
+[[deps.MathTeXEngine]]
+deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"]
+git-tree-sha1 = "aa1078778be5a8e5259ff04fbc3d258b3e78d464"
+uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
+version = "0.6.9"
+
[[deps.MaybeInplace]]
deps = ["ArrayInterface", "LinearAlgebra", "MacroTools"]
git-tree-sha1 = "bf287c2abdd365d73c9ee86b262c6d8af0d6e2a1"
@@ -1475,6 +1832,12 @@ git-tree-sha1 = "2c140d60d7cb82badf06d8783800d0bcd1a7daa2"
uuid = "78c3b35d-d492-501b-9361-3d52fe80e533"
version = "0.8.1"
+[[deps.MosaicViews]]
+deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
+git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe"
+uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389"
+version = "0.3.4"
+
[[deps.Moshi]]
deps = ["ExproniconLite", "Jieko"]
git-tree-sha1 = "999dfa2b4f8334c1c23bd307c2b0cb6f97c54591"
@@ -1521,6 +1884,12 @@ git-tree-sha1 = "8a36db9b934b0e72583e624abc8f3b3d60554f2c"
uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3"
version = "401.1000.0+0"
+[[deps.Netpbm]]
+deps = ["FileIO", "ImageCore", "ImageMetadata"]
+git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd"
+uuid = "f09324ee-3d7c-5217-9330-fc30815ba969"
+version = "1.1.1"
+
[[deps.NetworkOptions]]
uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
version = "1.3.0"
@@ -1622,6 +1991,11 @@ git-tree-sha1 = "22faba70c22d2f03e60fbc61da99c4ebfc3eb9ba"
uuid = "d8793406-e978-5875-9003-1fc021f44a92"
version = "0.5.0"
+[[deps.Observables]]
+git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225"
+uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
+version = "0.5.5"
+
[[deps.OffsetArrays]]
git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151"
uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
@@ -1643,11 +2017,29 @@ git-tree-sha1 = "565175ce692c065e50ad32efbb61ba69b1586593"
uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2"
version = "0.3.33+1"
+[[deps.OpenBLASConsistentFPCSR_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "dafdaa3ff15f20ff703d909d3a6f574a5b0586f3"
+uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af"
+version = "0.3.33+1"
+
[[deps.OpenBLAS_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
version = "0.3.29+0"
+[[deps.OpenEXR]]
+deps = ["Colors", "FileIO", "OpenEXR_jll"]
+git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7"
+uuid = "52e1d378-f018-4a11-a4be-720524705ac7"
+version = "0.3.3"
+
+[[deps.OpenEXR_jll]]
+deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "0d621a4beb5e48d195f907c3c5b0bea285d9ff9d"
+uuid = "18a262bb-aa17-5467-a713-aee519bc75cb"
+version = "3.4.13+0"
+
[[deps.OpenLibm_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
@@ -1765,12 +2157,40 @@ deps = ["Artifacts", "Libdl"]
uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"
version = "10.44.0+1"
+[[deps.PDMats]]
+deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "26766d4b5f1a410c218a19b85a672c6edb693c65"
+uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
+version = "0.11.40"
+weakdeps = ["StatsBase"]
+
+ [deps.PDMats.extensions]
+ StatsBaseExt = "StatsBase"
+
+[[deps.PNGFiles]]
+deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
+git-tree-sha1 = "32b657a0d57c310a1a172bfc8c8cf68c5e674323"
+uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
+version = "0.4.5"
+
[[deps.PackageCompiler]]
deps = ["Artifacts", "Glob", "LazyArtifacts", "Libdl", "Pkg", "Printf", "RelocatableFolders", "TOML", "UUIDs", "p7zip_jll"]
git-tree-sha1 = "513193b976208b1b646ad4303323153e8bff0997"
uuid = "9b87118b-4619-50d2-8e1e-99f35a4d4d9d"
version = "2.4.0"
+[[deps.Packing]]
+deps = ["GeometryBasics"]
+git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c"
+uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566"
+version = "0.5.1"
+
+[[deps.PaddedViews]]
+deps = ["OffsetArrays"]
+git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f"
+uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
+version = "0.5.12"
+
[[deps.Pango_jll]]
deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"]
git-tree-sha1 = "58e5ed5e386e156bd93e86b305ebd21ac63d2d04"
@@ -1816,6 +2236,12 @@ git-tree-sha1 = "30a1cf0b8fac0400f7f9790b1ad8ad89db325b84"
uuid = "6254a0f9-6143-4104-aa2e-fd339a2830a6"
version = "0.1.19"
+[[deps.PkgVersion]]
+deps = ["Pkg"]
+git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da"
+uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688"
+version = "0.3.3"
+
[[deps.PlotThemes]]
deps = ["PlotUtils", "Statistics"]
git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca"
@@ -1848,6 +2274,11 @@ version = "1.41.6"
ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+[[deps.PolygonOps]]
+git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
+uuid = "647866c9-e3ac-4575-94e7-e3d426903924"
+version = "0.1.2"
+
[[deps.PooledArrays]]
deps = ["DataAPI", "Future"]
git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3"
@@ -1896,6 +2327,12 @@ version = "3.4.0"
Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e"
XLSX = "fdbf4ff8-1666-58a4-91e7-1b58723a45e0"
+[[deps.Primes]]
+deps = ["IntegerMathUtils"]
+git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b"
+uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae"
+version = "0.5.7"
+
[[deps.Printf]]
deps = ["Unicode"]
uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
@@ -1907,6 +2344,12 @@ git-tree-sha1 = "f0803bc1171e455a04124affa9c21bba5ac4db32"
uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c"
version = "0.1.6"
+[[deps.ProgressMeter]]
+deps = ["Distributed", "Printf"]
+git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7"
+uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
+version = "1.11.0"
+
[[deps.PtrArrays]]
git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe"
uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d"
@@ -1936,6 +2379,12 @@ version = "0.9.35"
CategoricalArrays = "324d7699-5711-5eae-9e2f-1d82baa6b597"
PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0"
+[[deps.QOI]]
+deps = ["ColorTypes", "FileIO", "FixedPointNumbers"]
+git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106"
+uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65"
+version = "1.0.2"
+
[[deps.Qt6Base_jll]]
deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"]
git-tree-sha1 = "144895f6166994730ee7ff8113b981fc360638f1"
@@ -1966,6 +2415,18 @@ git-tree-sha1 = "672c938b4b4e3e0169a07a5f227029d4905456f2"
uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3"
version = "6.10.2+1"
+[[deps.QuadGK]]
+deps = ["DataStructures", "LinearAlgebra"]
+git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e"
+uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
+version = "2.11.3"
+
+ [deps.QuadGK.extensions]
+ QuadGKEnzymeExt = "Enzyme"
+
+ [deps.QuadGK.weakdeps]
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+
[[deps.REPL]]
deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"]
uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
@@ -1976,6 +2437,21 @@ deps = ["SHA"]
uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
version = "1.11.0"
+[[deps.RangeArrays]]
+git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5"
+uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d"
+version = "0.3.2"
+
+[[deps.Ratios]]
+deps = ["Requires"]
+git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b"
+uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
+version = "0.4.5"
+weakdeps = ["FixedPointNumbers"]
+
+ [deps.Ratios.extensions]
+ RatiosFixedPointNumbersExt = "FixedPointNumbers"
+
[[deps.RecipesBase]]
deps = ["PrecompileTools"]
git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff"
@@ -2067,6 +2543,45 @@ path = "core"
uuid = "aac5e3d9-0b8f-4d4f-8241-b1a7a9632635"
version = "2026.1.2"
+[[deps.Rmath]]
+deps = ["Random", "Rmath_jll"]
+git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b"
+uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
+version = "0.9.0"
+
+[[deps.Rmath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8"
+uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
+version = "0.5.1+0"
+
+[[deps.Roots]]
+deps = ["Accessors", "CommonSolve", "Printf"]
+git-tree-sha1 = "125cbd31a56de53169c3eed9c17180bc6c245f83"
+uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665"
+version = "3.0.4"
+
+ [deps.Roots.extensions]
+ RootsChainRulesCoreExt = "ChainRulesCore"
+ RootsForwardDiffExt = "ForwardDiff"
+ RootsIntervalRootFindingExt = "IntervalRootFinding"
+ RootsSymPyExt = "SymPy"
+ RootsSymPyPythonCallExt = "SymPyPythonCall"
+ RootsUnitfulExt = "Unitful"
+
+ [deps.Roots.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807"
+ SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6"
+ SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.RoundingEmulator]]
+git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b"
+uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705"
+version = "0.2.1"
+
[[deps.RuntimeGeneratedFunctions]]
deps = ["ExprTools", "SHA", "Serialization"]
git-tree-sha1 = "bd9d6c153d0c8a120b504bfb2f3be42308cc857a"
@@ -2077,6 +2592,12 @@ version = "0.5.21"
uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
version = "0.7.0"
+[[deps.SIMD]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4"
+uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
+version = "3.7.2"
+
[[deps.SPDX]]
deps = ["Dates", "JSON", "Logging", "SHA", "TimeZones", "UUIDs"]
git-tree-sha1 = "03332121e01c5191a1c12d9fbda2284a102a5155"
@@ -2209,12 +2730,29 @@ git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68"
uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46"
version = "1.1.2"
+[[deps.ShaderAbstractions]]
+deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"]
+git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6"
+uuid = "65257c39-d410-5151-9873-9b3e5be5013e"
+version = "0.5.0"
+
+[[deps.SharedArrays]]
+deps = ["Distributed", "Mmap", "Random", "Serialization"]
+uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+version = "1.11.0"
+
[[deps.Showoff]]
deps = ["Dates", "Grisu"]
git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de"
uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
version = "1.0.3"
+[[deps.SignedDistanceFields]]
+deps = ["Statistics"]
+git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92"
+uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96"
+version = "0.4.1"
+
[[deps.SimpleBufferStream]]
git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1"
uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7"
@@ -2242,6 +2780,12 @@ git-tree-sha1 = "7ddb0b49c109481b046972c0e4ab02b2127d6a75"
uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d"
version = "0.9.6"
+[[deps.Sixel]]
+deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"]
+git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743"
+uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47"
+version = "0.1.5"
+
[[deps.Sockets]]
uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
version = "1.11.0"
@@ -2314,33 +2858,34 @@ deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_j
git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f"
uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
version = "2.8.0"
+weakdeps = ["ChainRulesCore"]
[deps.SpecialFunctions.extensions]
SpecialFunctionsChainRulesCoreExt = "ChainRulesCore"
- [deps.SpecialFunctions.weakdeps]
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
-
[[deps.StableRNGs]]
deps = ["Random"]
git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc"
uuid = "860ef19b-820b-49d6-a774-d7a799459cd3"
version = "1.0.4"
+[[deps.StackViews]]
+deps = ["OffsetArrays"]
+git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621"
+uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
+version = "0.1.2"
+
[[deps.StaticArrays]]
deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db"
uuid = "90137ffa-7385-5640-81b9-e52037218182"
version = "1.9.18"
+weakdeps = ["ChainRulesCore", "Statistics"]
[deps.StaticArrays.extensions]
StaticArraysChainRulesCoreExt = "ChainRulesCore"
StaticArraysStatisticsExt = "Statistics"
- [deps.StaticArrays.weakdeps]
- ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
- Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
-
[[deps.StaticArraysCore]]
git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a"
uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
@@ -2368,6 +2913,17 @@ git-tree-sha1 = "e4d7a1a0edc20af42689ea6f4f3587a2175d50ee"
uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
version = "0.34.12"
+[[deps.StatsFuns]]
+deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
+git-tree-sha1 = "770240df9a3b8888065046948f7a09b4e0f997d5"
+uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
+version = "2.2.0"
+weakdeps = ["ChainRulesCore", "InverseFunctions"]
+
+ [deps.StatsFuns.extensions]
+ StatsFunsChainRulesCoreExt = "ChainRulesCore"
+ StatsFunsInverseFunctionsExt = "InverseFunctions"
+
[[deps.StringManipulation]]
deps = ["PrecompileTools"]
git-tree-sha1 = "d05693d339e37d6ab134c5ab53c29fce5ee5d7d5"
@@ -2426,6 +2982,10 @@ version = "2.8.2"
uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b"
version = "1.11.0"
+[[deps.SuiteSparse]]
+deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
+uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
+
[[deps.SuiteSparse_jll]]
deps = ["Artifacts", "Libdl", "libblastrampoline_jll"]
uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c"
@@ -2497,6 +3057,12 @@ git-tree-sha1 = "42fd9023fef18b9b78c8343a4e2f3813ffbcefcb"
uuid = "1c621080-faea-4a02-84b6-bbd5e436b8fe"
version = "1.0.0"
+[[deps.TiffImages]]
+deps = ["CodecZstd", "ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"]
+git-tree-sha1 = "9ca5f1f2d42f80df4b8c9f6ab5a64f438bbd9976"
+uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
+version = "0.11.9"
+
[[deps.TimeZones]]
deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "Scratch", "TZJData", "Unicode", "p7zip_jll"]
git-tree-sha1 = "d422301b2a1e294e3e4214061e44f338cafe18a2"
@@ -2524,6 +3090,11 @@ git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
version = "0.11.3"
+[[deps.TriplotBase]]
+git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b"
+uuid = "981d1d27-644d-49a2-9326-4793e63143c3"
+version = "0.1.0"
+
[[deps.TruncatedStacktraces]]
deps = ["InteractiveUtils", "MacroTools", "Preferences"]
git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1"
@@ -2550,6 +3121,21 @@ git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf"
uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1"
version = "0.4.1"
+[[deps.Unitful]]
+deps = ["Dates", "LinearAlgebra", "Random"]
+git-tree-sha1 = "57e1b2c9de4bd6f40ecb9de4ac1797b81970d008"
+uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
+version = "1.28.0"
+weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "LaTeXStrings", "Latexify", "NaNMath", "Printf"]
+
+ [deps.Unitful.extensions]
+ ConstructionBaseUnitfulExt = "ConstructionBase"
+ ForwardDiffExt = "ForwardDiff"
+ InverseFunctionsUnitfulExt = "InverseFunctions"
+ LatexifyExt = ["Latexify", "LaTeXStrings"]
+ NaNMathExt = "NaNMath"
+ PrintfExt = "Printf"
+
[[deps.UnsafePointers]]
git-tree-sha1 = "c81331b3b2e60a982be57c046ec91f599ede674a"
uuid = "e17b2a0c-0bdf-430a-bd0c-3a23cae4ff39"
@@ -2578,6 +3164,18 @@ git-tree-sha1 = "0716e01c3b40413de5dedbc9c5c69f27cddfddfc"
uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
version = "1.4.3"
+[[deps.WebP]]
+deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"]
+git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2"
+uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1"
+version = "0.1.3"
+
+[[deps.WoodburyMatrices]]
+deps = ["LinearAlgebra", "SparseArrays"]
+git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7"
+uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
+version = "1.1.0"
+
[[deps.WorkerUtilities]]
git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7"
uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60"
@@ -2822,6 +3420,12 @@ git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631"
uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09"
version = "0.61.1+0"
+[[deps.isoband_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c"
+uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4"
+version = "0.2.3+0"
+
[[deps.libaec_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "60f4792734488db6f42e2c7699f1d4594780bd03"
@@ -2881,6 +3485,12 @@ git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba"
uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
version = "1.6.58+0"
+[[deps.libsixel_jll]]
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"]
+git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a"
+uuid = "075b6546-f08a-558a-be8f-8157d0f608a5"
+version = "1.10.5+0"
+
[[deps.libva_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "libdrm_jll"]
git-tree-sha1 = "7dbf96baae3310fe2fa0df0ccbb3c6288d5816c9"
@@ -2893,6 +3503,12 @@ git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5"
uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
version = "1.3.8+0"
+[[deps.libwebp_jll]]
+deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"]
+git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3"
+uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2"
+version = "1.6.0+0"
+
[[deps.libzip_jll]]
deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "OpenSSL_jll", "XZ_jll", "Zlib_jll", "Zstd_jll"]
git-tree-sha1 = "86addc139bca85fdf9e7741e10977c45785727b7"
diff --git a/Project.toml b/Project.toml
index 918c7fdb4..252af0fb4 100644
--- a/Project.toml
+++ b/Project.toml
@@ -11,6 +11,7 @@ Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595"
Artifacts = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
BasicModelInterface = "59605e27-edc0-445a-b93d-c09a3a50b330"
+CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b"
Configurations = "5218b696-f38b-4ac9-8b61-a12ec717816d"
DBInterface = "a10d1c49-ce27-4219-8d33-6db1a4562965"
@@ -24,6 +25,7 @@ DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def"
DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
EnumX = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
FindFirstFunctions = "64ca27bc-2ba2-4a57-88aa-44e436879224"
+FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
Glob = "c27321d9-0574-5035-807b-f59d2c89b15c"
@@ -72,6 +74,7 @@ SciMLOperators = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35"
+StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
diff --git a/core/src/config.jl b/core/src/config.jl
index 502c173a7..3a79b5f16 100644
--- a/core/src/config.jl
+++ b/core/src/config.jl
@@ -225,9 +225,14 @@ end
route_priority::RoutePriority = RoutePriority()
end
+@option struct IrrigationConfig <: TableOption
+ dt::Float64 = 86400.0
+end
+
@option struct Experimental <: TableOption
concentration::Bool = false
allocation::Bool = false
+ irrigation::Bool = false
end
# For logging enabled experimental features
@@ -254,6 +259,7 @@ end
logging::Logging = Logging()
results::Results = Results()
experimental::Experimental = Experimental()
+ irrigation::IrrigationConfig = IrrigationConfig()
end
struct Config
diff --git a/core/src/model.jl b/core/src/model.jl
index 9e2764b4e..086cb3225 100644
--- a/core/src/model.jl
+++ b/core/src/model.jl
@@ -193,6 +193,7 @@ function Model(config::Config)::Model
saveat = convert_saveat(config.solver.saveat, t_end)
saveat isa Float64 && push!(tstops, range(0, t_end; step = saveat))
+ push!(tstops, get_irrigation_tstops(config))
tstops = sort(unique(reduce(vcat, tstops)))
adaptive = is_adaptive(config.solver.dt)
@@ -278,10 +279,55 @@ function is_finished(model::Model)::Bool
end
"""
- step!(model::Model, dt::Float64)::Model
+Before each allocation solve: pull irrigation demand from the soil model and
+write it into the corresponding UserDemand demand column.
+No-op when irrigation is disabled or the IrrigationModel has not been set yet.
+"""
+function update_irrigation_demand!(p_independent::ParametersIndependent, t::Float64)::Nothing
+ (; irrigation, user_demand) = p_independent
+ isnothing(irrigation) && return nothing
+ isnothing(irrigation.model) && return nothing
+ isnothing(irrigation.compute_demand!) && return nothing
+ demand_vec = irrigation.compute_demand!(irrigation.model)
+ for (i, id) in enumerate(irrigation.node_id)
+ val = isnan(demand_vec[i]) ? 0.0 : demand_vec[i]
+ user_demand.demand[id.idx, irrigation.demand_priority_idxs[i]] = val * irrigation.irrigated_area_m2[i]
+ end
+ return nothing
+end
-Take Model timesteps until `t + dt` is reached exactly.
"""
+After each allocation solve: pass the granted allocation back into the soil model
+and advance the soil model to `t + Δt`.
+No-op when irrigation is disabled or the IrrigationModel has not been set yet.
+"""
+function update_irrigation_supply!(p_independent::ParametersIndependent, Δt::Float64)::Nothing
+ (; irrigation, user_demand, allocation) = p_independent
+ isnothing(irrigation) && return nothing
+ isnothing(irrigation.model) && return nothing
+ isnothing(irrigation.advance!) && return nothing
+ for (i, id) in enumerate(irrigation.node_id)
+ # Sum realized volume [m³] over all inflow links of this UserDemand node,
+ # across all allocation models (there is typically one subnetwork).
+ realized_m3 = sum(
+ get(am.cumulative_supplied_volume, lm.link, 0.0)
+ for am in allocation.allocation_models
+ for lm in user_demand.inflow_links[id.idx];
+ init = 0.0,
+ )
+ # Convert m³ over Δt → m/s → set on soil model
+ irrigation.allocated_buffer[i] = realized_m3 / Δt / irrigation.irrigated_area_m2[i]
+ end
+ irrigation.model.allocation.irrigation_allocation .= irrigation.allocated_buffer
+ # Advance the soil model one step (update! increments tcurrent internally)
+ t_end_soil = irrigation.model.tcurrent + Δt
+ while irrigation.model.tcurrent < t_end_soil - 0.5 * irrigation.model.dt
+ irrigation.model.allocation.irrigation_allocation .= irrigation.allocated_buffer
+ irrigation.advance!(irrigation.model)
+ end
+ return nothing
+end
+
function step!(model::Model, dt::Float64)::Model
(; config, integrator) = model
(; t) = integrator
@@ -290,7 +336,11 @@ function step!(model::Model, dt::Float64)::Model
# set over BMI at time t before calling this function.
ntimes = t / something(config.allocation.dt, 86400.0)
if round(ntimes) ≈ ntimes
+ update_irrigation_demand!(integrator.p.p_independent, t)
update_allocation!(model)
+ SciMLBase.step!(integrator, dt, true)
+ update_irrigation_supply!(integrator.p.p_independent, dt)
+ return model
end
SciMLBase.step!(integrator, dt, true)
return model
@@ -334,24 +384,31 @@ function solve_with_allocation!(model::Model)::Nothing
(; config, integrator) = model
(; tspan::Tuple{Float64, Float64}) = integrator.sol.prob
+ p_independent = integrator.p.p_independent
if config.allocation.dt === nothing
saveat = config.solver.saveat
while integrator.t < tspan[end] - eps(tspan[end])
Δt = compute_and_set_adaptive_Δt!(model, saveat, tspan[end])
+ update_irrigation_demand!(p_independent, integrator.t)
update_allocation!(model, Δt; record = is_saveat_time(integrator.t, saveat, tspan[end]))
SciMLBase.step!(integrator, Δt, true)
+ update_irrigation_supply!(p_independent, Δt)
end
else
dt_alloc = config.allocation.dt
n_allocation_times = floor(Int, tspan[end] / dt_alloc)
for _ in 1:n_allocation_times
+ update_irrigation_demand!(p_independent, integrator.t)
update_allocation!(model)
SciMLBase.step!(integrator, dt_alloc, true)
+ update_irrigation_supply!(p_independent, dt_alloc)
end
dt = tspan[end] - integrator.t
if dt > 0
+ update_irrigation_demand!(p_independent, integrator.t)
update_allocation!(model)
SciMLBase.step!(integrator, dt, true)
+ update_irrigation_supply!(p_independent, dt)
end
end
return nothing
diff --git a/core/src/parameter.jl b/core/src/parameter.jl
index 49b6b0599..f618135d0 100644
--- a/core/src/parameter.jl
+++ b/core/src/parameter.jl
@@ -1129,6 +1129,38 @@ The part of the parameters passed to the rhs and callbacks that are mutable.
tprev::Float64 = 0.0
end
+"""
+Coupling parameters for the Wflow-based irrigation soil model.
+
+node_id: NodeIDs of the UserDemand nodes that have irrigation enabled
+model: The IrrigationModel instance from irrigation/src/irrigation.jl (set after construction)
+demand_priority_idx: Column index into UserDemand.demand / UserDemand.allocated to write/read
+allocated_buffer: Scratch buffer [m/s] for passing allocation results to the soil model
+"""
+mutable struct IrrigationCoupling
+ node_id::Vector{NodeID}
+ model::Any # Irrigation.IrrigationModel; set externally before solve
+ compute_demand!::Any # Function (model) -> demand_vec; set together with model
+ advance!::Any # Function (model) -> nothing; advances soil model one dt
+ demand_priority_idxs::Vector{Int} # per-node priority column index into UserDemand.demand
+ irrigated_area_m2::Vector{Float64} # irrigated area per soil column [m²]
+ # Parsed forcing per node (index i = node order in node_id)
+ precipitation_mmday::Vector{Vector{Float64}}
+ potential_evaporation_mmday::Vector{Vector{Float64}}
+ forcing_timestamps::Vector{DateTime}
+ allocated_buffer::Vector{Float64}
+end
+
+IrrigationCoupling(node_id::Vector{NodeID}, demand_priority_idxs::Vector{Int}) =
+ IrrigationCoupling(
+ node_id, nothing, nothing, nothing, demand_priority_idxs,
+ ones(length(node_id)),
+ [Float64[] for _ in node_id],
+ [Float64[] for _ in node_id],
+ DateTime[],
+ zeros(length(node_id)),
+)
+
"""
The part of the parameters passed to the rhs and callbacks that are non-mutable,
and not derived from the state vector `u` (or the time `t`). In this context e.g. a vector
@@ -1184,6 +1216,8 @@ the object itself is not.
u_reduced::RibasimReducedCVectorType{Float64}
# Solver constants
level_difference_threshold::Float64
+ # Optional irrigation soil model coupling (nothing when not enabled)
+ irrigation::Union{IrrigationCoupling, Nothing} = nothing
end
"""
diff --git a/core/src/read.jl b/core/src/read.jl
index 4b8f54cbd..2daf5fd50 100644
--- a/core/src/read.jl
+++ b/core/src/read.jl
@@ -1689,6 +1689,39 @@ function Parameters(db::DB, config::Config)::Parameters
),
)
+ irrigation = if config.experimental.irrigation
+ user_demand = nodes.user_demand
+ # Find the priority column index for each UserDemand node (first active priority)
+ demand_priority_idxs = [findfirst(user_demand.has_demand_priority[id.idx, :]) for id in user_demand.node_id]
+ # Fall back to 1 for any node with no priority set yet (will be overridden by soil model)
+ demand_priority_idxs = [isnothing(idx) ? 1 : idx for idx in demand_priority_idxs]
+ coupling = IrrigationCoupling(user_demand.node_id, demand_priority_idxs)
+
+ # Read irrigated area per node (optional; default 1.0 m²)
+ irr_static = load_structvector(db, config, Schema.UserDemand.IrrigationStatic)
+ for row in irr_static
+ idx = findfirst(id -> id.value == row.node_id, coupling.node_id)
+ isnothing(idx) && continue
+ coupling.irrigated_area_m2[idx] = row.irrigated_area_m2
+ end
+
+ # Read per-node forcing timeseries
+ irr_forcing = load_structvector(db, config, Schema.UserDemand.IrrigationForcing)
+ if !isempty(irr_forcing)
+ coupling.forcing_timestamps = sort(unique(irr_forcing.time))
+ for (i, id) in enumerate(coupling.node_id)
+ rows = filter(r -> r.node_id == id.value, irr_forcing)
+ sorted = sort(rows; by = r -> r.time)
+ coupling.precipitation_mmday[i] = [r.precipitation for r in sorted]
+ coupling.potential_evaporation_mmday[i] = [r.potential_evaporation for r in sorted]
+ end
+ end
+
+ coupling
+ else
+ nothing
+ end
+
p_independent = ParametersIndependent(;
config.starttime,
config.solver.reltol,
@@ -1711,6 +1744,7 @@ function Parameters(db::DB, config::Config)::Parameters
convergence = CVector(zeros(n_states), state_ranges),
u_reduced,
config.solver.level_difference_threshold,
+ irrigation,
)
collect_control_mappings!(p_independent)
diff --git a/core/src/schema.jl b/core/src/schema.jl
index b8be0a7aa..720287202 100644
--- a/core/src/schema.jl
+++ b/core/src/schema.jl
@@ -342,6 +342,18 @@ module Schema
concentration::Float64
end
+ struct IrrigationStatic <: Table
+ node_id::Int32
+ irrigated_area_m2::Float64
+ end
+
+ struct IrrigationForcing <: Table
+ node_id::Int32
+ time::DateTime
+ precipitation::Float64
+ potential_evaporation::Float64
+ end
+
end
module LevelDemand
diff --git a/core/src/util.jl b/core/src/util.jl
index b1d8ef4e3..d5a060c90 100644
--- a/core/src/util.jl
+++ b/core/src/util.jl
@@ -1336,3 +1336,18 @@ function add_substance_mass!(
end
return nothing
end
+
+get_t_end(config::Config) = seconds_since(config.endtime, config.starttime)
+
+"""
+Return the uniform grid of solver tstops [s] for the irrigation coupling, or an
+empty vector when irrigation is disabled.
+"""
+function get_irrigation_tstops(config::Config)::Vector{Float64}
+ return if config.experimental.irrigation
+ t_end = get_t_end(config)
+ collect(range(0, t_end; step = config.irrigation.dt))
+ else
+ Float64[]
+ end
+end
diff --git a/core/src/validation.jl b/core/src/validation.jl
index 4dac0401b..190803c66 100644
--- a/core/src/validation.jl
+++ b/core/src/validation.jl
@@ -244,6 +244,8 @@ sort_by(::StructVector{Schema.TabulatedRatingCurve.Time}) =
sort_by(::StructVector{Schema.UserDemand.Concentration}) =
x -> (x.node_id, x.substance, x.time)
+sort_by(::StructVector{Schema.UserDemand.IrrigationStatic}) = x -> (x.node_id)
+sort_by(::StructVector{Schema.UserDemand.IrrigationForcing}) = x -> (x.node_id, x.time)
sort_by(::StructVector{Schema.UserDemand.Static}) = x -> (x.node_id, x.demand_priority)
sort_by(::StructVector{Schema.UserDemand.Time}) =
x -> (x.node_id, x.demand_priority, x.time)
diff --git a/irrigation/Manifest.toml b/irrigation/Manifest.toml
new file mode 100644
index 000000000..00d4cf283
--- /dev/null
+++ b/irrigation/Manifest.toml
@@ -0,0 +1,3088 @@
+# This file is machine-generated - editing it directly is not advised
+
+julia_version = "1.12.6"
+manifest_format = "2.0"
+project_hash = "d41f153c0933b78ff938add5caa616441cd2e6c0"
+
+[[deps.ADTypes]]
+git-tree-sha1 = "d9aaef7c63466eee4de23b4d9dad03629df54bea"
+uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b"
+version = "1.22.1"
+weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"]
+
+ [deps.ADTypes.extensions]
+ ADTypesChainRulesCoreExt = "ChainRulesCore"
+ ADTypesConstructionBaseExt = "ConstructionBase"
+ ADTypesEnzymeCoreExt = "EnzymeCore"
+
+[[deps.AMD]]
+deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"]
+git-tree-sha1 = "45a1272e3f809d36431e57ab22703c6896b8908f"
+uuid = "14f7f29c-3bd6-536c-9a0b-7339e30b5a3e"
+version = "0.5.3"
+
+[[deps.AbstractFFTs]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef"
+uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
+version = "1.5.0"
+weakdeps = ["ChainRulesCore", "Test"]
+
+ [deps.AbstractFFTs.extensions]
+ AbstractFFTsChainRulesCoreExt = "ChainRulesCore"
+ AbstractFFTsTestExt = "Test"
+
+[[deps.AbstractTrees]]
+git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177"
+uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
+version = "0.4.5"
+
+[[deps.Accessors]]
+deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"]
+git-tree-sha1 = "7063ad1083578215c7c4bf410368150abe8d5524"
+uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
+version = "0.1.45"
+
+ [deps.Accessors.extensions]
+ AxisKeysExt = "AxisKeys"
+ IntervalSetsExt = "IntervalSets"
+ LinearAlgebraExt = "LinearAlgebra"
+ StaticArraysExt = "StaticArrays"
+ StructArraysExt = "StructArrays"
+ TestExt = "Test"
+ UnitfulExt = "Unitful"
+
+ [deps.Accessors.weakdeps]
+ AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.Adapt]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "daa72978cd7a624246e894a4f4f067706d4e17e2"
+uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+version = "4.7.0"
+weakdeps = ["SparseArrays", "StaticArrays"]
+
+ [deps.Adapt.extensions]
+ AdaptSparseArraysExt = "SparseArrays"
+ AdaptStaticArraysExt = "StaticArrays"
+
+[[deps.AdaptivePredicates]]
+git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6"
+uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7"
+version = "1.2.0"
+
+[[deps.AliasTables]]
+deps = ["PtrArrays", "Random"]
+git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff"
+uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8"
+version = "1.1.3"
+
+[[deps.Animations]]
+deps = ["Colors"]
+git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7"
+uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340"
+version = "0.4.2"
+
+[[deps.ArgTools]]
+uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f"
+version = "1.1.2"
+
+[[deps.ArnoldiMethod]]
+deps = ["LinearAlgebra", "Random", "StaticArrays"]
+git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6"
+uuid = "ec485272-7323-5ecc-a04f-4719b315124d"
+version = "0.4.0"
+
+[[deps.ArrayInterface]]
+deps = ["Adapt", "LinearAlgebra"]
+git-tree-sha1 = "75757da5d9f771ef5909fc84f81d2f9d24127315"
+uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
+version = "7.27.0"
+
+ [deps.ArrayInterface.extensions]
+ ArrayInterfaceAMDGPUExt = "AMDGPU"
+ ArrayInterfaceBandedMatricesExt = "BandedMatrices"
+ ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices"
+ ArrayInterfaceCUDAExt = "CUDA"
+ ArrayInterfaceCUDSSExt = ["CUDSS", "CUDA"]
+ ArrayInterfaceChainRulesCoreExt = "ChainRulesCore"
+ ArrayInterfaceChainRulesExt = "ChainRules"
+ ArrayInterfaceFillArraysExt = "FillArrays"
+ ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore"
+ ArrayInterfaceMetalExt = "Metal"
+ ArrayInterfaceReverseDiffExt = "ReverseDiff"
+ ArrayInterfaceSparseArraysExt = "SparseArrays"
+ ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore"
+ ArrayInterfaceTrackerExt = "Tracker"
+
+ [deps.ArrayInterface.weakdeps]
+ AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
+ BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
+ BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0"
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e"
+ ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
+ GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+
+[[deps.Artifacts]]
+uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
+version = "1.11.0"
+
+[[deps.Automa]]
+deps = ["PrecompileTools", "TranscodingStreams"]
+git-tree-sha1 = "94eab0b3ccdcac361188cc661daf69d4433c1818"
+uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b"
+version = "1.2.0"
+
+[[deps.AxisAlgorithms]]
+deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
+git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712"
+uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
+version = "1.1.0"
+
+[[deps.AxisArrays]]
+deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"]
+git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad"
+uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9"
+version = "0.4.8"
+
+[[deps.Base64]]
+uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
+version = "1.11.0"
+
+[[deps.BaseDirs]]
+git-tree-sha1 = "8c290a1b223deaeea9aea44b235d24546da8eb98"
+uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f"
+version = "1.4.0"
+
+[[deps.BasicModelInterface]]
+git-tree-sha1 = "ca36dc6dc9bbeea3dbbe3901837496ece85276e5"
+uuid = "59605e27-edc0-445a-b93d-c09a3a50b330"
+version = "0.1.1"
+
+[[deps.BinaryHeaps]]
+git-tree-sha1 = "3cf91ee7912c42f2785c50463a80b356494413fa"
+uuid = "b2a6c25c-c996-4615-94ab-6e519ffb8690"
+version = "1.0.1"
+
+[[deps.BitTwiddlingConvenienceFunctions]]
+deps = ["Static"]
+git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87"
+uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b"
+version = "0.1.6"
+
+[[deps.Blosc_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"]
+git-tree-sha1 = "535c80f1c0847a4c967ea945fca21becc9de1522"
+uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9"
+version = "1.21.7+0"
+
+[[deps.BracketingNonlinearSolve]]
+deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"]
+git-tree-sha1 = "6e7c9b6ab9aa711009a49252e45a122212c1d869"
+uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e"
+version = "1.12.2"
+weakdeps = ["ChainRulesCore", "ForwardDiff"]
+
+ [deps.BracketingNonlinearSolve.extensions]
+ BracketingNonlinearSolveChainRulesCoreExt = ["ChainRulesCore", "ForwardDiff"]
+ BracketingNonlinearSolveForwardDiffExt = "ForwardDiff"
+
+[[deps.Bzip2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e"
+uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
+version = "1.0.9+0"
+
+[[deps.CEnum]]
+git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc"
+uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
+version = "0.5.0"
+
+[[deps.CFTime]]
+deps = ["Dates", "Printf"]
+git-tree-sha1 = "fad2f199d1f1ae0c8e820ab68f81f6dbf62e60b2"
+uuid = "179af706-886a-5703-950a-314cd64e0468"
+version = "0.2.10"
+
+[[deps.CPUSummary]]
+deps = ["CpuId", "IfElse", "PrecompileTools", "Preferences", "Static"]
+git-tree-sha1 = "f3a21d7fc84ba618a779d1ed2fcca2e682865bab"
+uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9"
+version = "0.2.7"
+
+[[deps.CRC32c]]
+uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc"
+version = "1.11.0"
+
+[[deps.CRlibm]]
+deps = ["CRlibm_jll"]
+git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e"
+uuid = "96374032-68de-5a5b-8d9e-752f78720389"
+version = "1.0.2"
+
+[[deps.CRlibm_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc"
+uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0"
+version = "1.0.1+0"
+
+[[deps.Cairo]]
+deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"]
+git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9"
+uuid = "159f3aea-2a34-519c-b102-8c37f9878175"
+version = "1.1.1"
+
+[[deps.CairoMakie]]
+deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"]
+git-tree-sha1 = "47142129b1777e21da58cff265050b10d8560588"
+uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
+version = "0.15.13"
+
+[[deps.Cairo_jll]]
+deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
+git-tree-sha1 = "1fa950ebc3e37eccd51c6a8fe1f92f7d86263522"
+uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
+version = "1.18.7+0"
+
+[[deps.ChainRulesCore]]
+deps = ["Compat", "LinearAlgebra"]
+git-tree-sha1 = "12177ad6b3cad7fd50c8b3825ce24a99ad61c18f"
+uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+version = "1.26.1"
+weakdeps = ["SparseArrays"]
+
+ [deps.ChainRulesCore.extensions]
+ ChainRulesCoreSparseArraysExt = "SparseArrays"
+
+[[deps.CloseOpenIntervals]]
+deps = ["Static", "StaticArrayInterface"]
+git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581"
+uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9"
+version = "0.1.13"
+
+[[deps.CodecBzip2]]
+deps = ["Bzip2_jll", "TranscodingStreams"]
+git-tree-sha1 = "84990fa864b7f2b4901901ca12736e45ee79068c"
+uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd"
+version = "0.8.5"
+
+[[deps.CodecZlib]]
+deps = ["TranscodingStreams", "Zlib_jll"]
+git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9"
+uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
+version = "0.7.8"
+
+[[deps.CodecZstd]]
+deps = ["TranscodingStreams", "Zstd_jll"]
+git-tree-sha1 = "da54a6cd93c54950c15adf1d336cfd7d71f51a56"
+uuid = "6b39b394-51ab-5f42-8807-6242bab2b4c2"
+version = "0.8.7"
+
+[[deps.ColorBrewer]]
+deps = ["Colors", "JSON"]
+git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349"
+uuid = "a2cac450-b92f-5266-8821-25eda20663c8"
+version = "0.4.2"
+
+[[deps.ColorSchemes]]
+deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
+git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34"
+uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
+version = "3.31.0"
+
+[[deps.ColorTypes]]
+deps = ["FixedPointNumbers", "Random"]
+git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe"
+uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
+version = "0.12.1"
+weakdeps = ["StyledStrings"]
+
+ [deps.ColorTypes.extensions]
+ StyledStringsExt = "StyledStrings"
+
+[[deps.ColorVectorSpace]]
+deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"]
+git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1"
+uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
+version = "0.11.0"
+weakdeps = ["SpecialFunctions"]
+
+ [deps.ColorVectorSpace.extensions]
+ SpecialFunctionsExt = "SpecialFunctions"
+
+[[deps.Colors]]
+deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
+git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74"
+uuid = "5ae59095-9a9b-59fe-a467-6f913c188581"
+version = "0.13.1"
+
+[[deps.CommonDataModel]]
+deps = ["CFTime", "DataStructures", "Dates", "DiskArrays", "Preferences", "Printf", "Statistics"]
+git-tree-sha1 = "54d50f8a0a68ff4160564dfa09fc5de32465cfca"
+uuid = "1fbeeb36-5f17-413c-809b-666fb144f157"
+version = "0.4.4"
+
+[[deps.CommonSolve]]
+git-tree-sha1 = "99ee296f88c12485402e37c2fd025f95ae097637"
+uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2"
+version = "0.2.9"
+
+[[deps.CommonSubexpressions]]
+deps = ["MacroTools"]
+git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5"
+uuid = "bbf7d656-a473-5ed7-a52c-81e309532950"
+version = "0.3.1"
+
+[[deps.CommonWorldInvalidations]]
+git-tree-sha1 = "f1697a56da59e8a2cefcbbfe71c13354a6f18c61"
+uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8"
+version = "1.1.0"
+
+[[deps.Compat]]
+deps = ["TOML", "UUIDs"]
+git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad"
+uuid = "34da2185-b29b-5c13-b0c7-acf172513d20"
+version = "4.18.1"
+weakdeps = ["Dates", "LinearAlgebra"]
+
+ [deps.Compat.extensions]
+ CompatLinearAlgebraExt = "LinearAlgebra"
+
+[[deps.CompilerSupportLibraries_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae"
+version = "1.3.0+1"
+
+[[deps.CompositionsBase]]
+git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad"
+uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b"
+version = "0.1.2"
+weakdeps = ["InverseFunctions"]
+
+ [deps.CompositionsBase.extensions]
+ CompositionsBaseInverseFunctionsExt = "InverseFunctions"
+
+[[deps.ComputePipeline]]
+deps = ["Observables", "Preferences"]
+git-tree-sha1 = "7bc84b769c1d384315e7b5c4ac03a6c303e6cf35"
+uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c"
+version = "0.1.8"
+
+[[deps.ConcreteStructs]]
+git-tree-sha1 = "1988532cb3b4525bb718b99ba07e433bbf0e600b"
+uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
+version = "0.2.5"
+
+[[deps.Configurations]]
+deps = ["ExproniconLite", "OrderedCollections", "TOML"]
+git-tree-sha1 = "4358750bb58a3caefd5f37a4a0c5bfdbbf075252"
+uuid = "5218b696-f38b-4ac9-8b61-a12ec717816d"
+version = "0.17.6"
+
+[[deps.ConstructionBase]]
+git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb"
+uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+version = "1.6.0"
+weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"]
+
+ [deps.ConstructionBase.extensions]
+ ConstructionBaseIntervalSetsExt = "IntervalSets"
+ ConstructionBaseLinearAlgebraExt = "LinearAlgebra"
+ ConstructionBaseStaticArraysExt = "StaticArrays"
+
+[[deps.Contour]]
+git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8"
+uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
+version = "0.6.3"
+
+[[deps.CoreMath]]
+deps = ["CoreMath_jll"]
+git-tree-sha1 = "8c0480f92b1b1796239156a1b9b1bfb1b39499b4"
+uuid = "b7a15901-be09-4a0e-87d2-2e66b0e09b5a"
+version = "0.1.0"
+
+[[deps.CoreMath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "a692a4c1dc59a4b8bc0b6403876eb3250fde2bc3"
+uuid = "a38c48d9-6df1-5ac9-9223-b6ada3b5572b"
+version = "0.1.0+0"
+
+[[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.DBInterface]]
+git-tree-sha1 = "a444404b3f94deaa43ca2a58e18153a82695282b"
+uuid = "a10d1c49-ce27-4219-8d33-6db1a4562965"
+version = "2.6.1"
+
+[[deps.DataAPI]]
+git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe"
+uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a"
+version = "1.16.0"
+
+[[deps.DataInterpolations]]
+deps = ["EnumX", "FindFirstFunctions", "ForwardDiff", "LinearAlgebra", "PrettyTables", "RecipesBase", "Reexport"]
+git-tree-sha1 = "ab3e0909ad9a9f92b0a1b6920b081deaa30e5433"
+uuid = "82cc6244-b520-54b8-b5a6-8a565e85f1d0"
+version = "9.0.0"
+
+ [deps.DataInterpolations.extensions]
+ DataInterpolationsChainRulesCoreExt = "ChainRulesCore"
+ DataInterpolationsMakieExt = "Makie"
+ DataInterpolationsMooncakeExt = ["Mooncake", "ChainRulesCore"]
+ DataInterpolationsOptimExt = "Optim"
+ DataInterpolationsSparseConnectivityTracerExt = ["SparseConnectivityTracer", "FillArrays"]
+ DataInterpolationsSymbolicsExt = "Symbolics"
+
+ [deps.DataInterpolations.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
+ Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ Optim = "429524aa-4258-5aef-a3af-852621145aeb"
+ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
+ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+
+[[deps.DataStructures]]
+deps = ["OrderedCollections"]
+git-tree-sha1 = "6fb53a69613a0b2b68a0d12671717d307ab8b24e"
+uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
+version = "0.19.5"
+
+[[deps.DataValueInterfaces]]
+git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6"
+uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464"
+version = "1.0.0"
+
+[[deps.Dates]]
+deps = ["Printf"]
+uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
+version = "1.11.0"
+
+[[deps.DelaunayTriangulation]]
+deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"]
+git-tree-sha1 = "c55f5a9fd67bdbc8e089b5a3111fe4292986a8e8"
+uuid = "927a84f5-c5f4-47a5-9785-b46e178433df"
+version = "1.6.6"
+
+[[deps.DelimitedFiles]]
+deps = ["Mmap"]
+git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae"
+uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab"
+version = "1.9.1"
+
+[[deps.DiffEqBase]]
+deps = ["ArrayInterface", "BracketingNonlinearSolve", "ConcreteStructs", "DocStringExtensions", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLLogging", "SciMLOperators", "SciMLStructures", "Setfield", "StaticArraysCore", "SymbolicIndexingInterface", "TruncatedStacktraces"]
+git-tree-sha1 = "3696ff4a00fe366e768ba6df61779ac6f5079c2d"
+uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
+version = "7.6.1"
+
+ [deps.DiffEqBase.extensions]
+ DiffEqBaseCUDAExt = "CUDA"
+ DiffEqBaseChainRulesCoreExt = "ChainRulesCore"
+ DiffEqBaseDynamicQuantitiesExt = "DynamicQuantities"
+ DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"]
+ DiffEqBaseFlexUnitsExt = "FlexUnits"
+ DiffEqBaseForwardDiffExt = ["ForwardDiff"]
+ DiffEqBaseGTPSAExt = "GTPSA"
+ DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated"
+ DiffEqBaseMPIExt = "MPI"
+ DiffEqBaseMeasurementsExt = "Measurements"
+ DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements"
+ DiffEqBaseMooncakeExt = "Mooncake"
+ DiffEqBaseReverseDiffExt = "ReverseDiff"
+ DiffEqBaseSparseArraysExt = "SparseArrays"
+ DiffEqBaseTrackerExt = "Tracker"
+ DiffEqBaseUnitfulExt = "Unitful"
+
+ [deps.DiffEqBase.weakdeps]
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
+ DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821"
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+ FlexUnits = "76e01b6b-c995-4ce6-8559-91e72a3d4e95"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8"
+ GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb"
+ MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
+ Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
+ MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.DiffEqCallbacks]]
+deps = ["ConcreteStructs", "DataStructures", "DiffEqBase", "DifferentiationInterface", "LinearAlgebra", "Markdown", "PrecompileTools", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"]
+git-tree-sha1 = "1028a398b137a52cc0027a28d99b231531636b1b"
+uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def"
+version = "4.18.1"
+
+ [deps.DiffEqCallbacks.extensions]
+ DiffEqCallbacksFunctorsExt = "Functors"
+
+ [deps.DiffEqCallbacks.weakdeps]
+ Functors = "d9f16b24-f501-4c13-a1f2-28368ffc5196"
+
+[[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 = "79a2aca180a85c690c58a020d47b426954b590f8"
+uuid = "b552c78f-8df3-52c6-915a-8e097449b14b"
+version = "1.16.0"
+
+[[deps.DifferentiationInterface]]
+deps = ["ADTypes", "LinearAlgebra"]
+git-tree-sha1 = "2348cf722e74ef177e165986c765b61217f7433a"
+uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
+version = "0.7.19"
+
+ [deps.DifferentiationInterface.extensions]
+ DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore"
+ DifferentiationInterfaceDiffractorExt = "Diffractor"
+ DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"]
+ DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation"
+ DifferentiationInterfaceFiniteDiffExt = "FiniteDiff"
+ DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences"
+ DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"]
+ DifferentiationInterfaceGPUArraysCoreExt = ["GPUArraysCore", "Adapt"]
+ DifferentiationInterfaceGTPSAExt = "GTPSA"
+ DifferentiationInterfaceHyperHessiansExt = "HyperHessians"
+ DifferentiationInterfaceMooncakeExt = "Mooncake"
+ DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"]
+ DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"]
+ DifferentiationInterfaceSparseArraysExt = "SparseArrays"
+ DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer"
+ DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings"
+ DifferentiationInterfaceStaticArraysExt = "StaticArrays"
+ DifferentiationInterfaceSymbolicsExt = "Symbolics"
+ DifferentiationInterfaceTrackerExt = "Tracker"
+ DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"]
+
+ [deps.DifferentiationInterface.weakdeps]
+ Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5"
+ Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c"
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+ EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
+ FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be"
+ FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
+ FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+ GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8"
+ HyperHessians = "06b494a0-c8e0-40cc-ad32-d99506a00a6c"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
+ SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+
+[[deps.DiskArrays]]
+deps = ["ConstructionBase", "LRUCache", "Mmap", "OffsetArrays"]
+git-tree-sha1 = "9903195c34a488c5265d9a105f39718b7a2b3568"
+uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3"
+version = "0.4.22"
+
+[[deps.Distributed]]
+deps = ["Random", "Serialization", "Sockets"]
+uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
+version = "1.11.0"
+
+[[deps.Distributions]]
+deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"]
+git-tree-sha1 = "cd3c5ac74cd3923c8945c6a81518c46abd0e73a3"
+uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
+version = "0.25.129"
+
+ [deps.Distributions.extensions]
+ DistributionsChainRulesCoreExt = "ChainRulesCore"
+ DistributionsDensityInterfaceExt = "DensityInterface"
+ DistributionsSparseConnectivityTracerExt = "SparseConnectivityTracer"
+ DistributionsTestExt = "Test"
+
+ [deps.Distributions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d"
+ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
+ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+
+[[deps.DocStringExtensions]]
+git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c"
+uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
+version = "0.9.5"
+
+[[deps.Downloads]]
+deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
+uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
+version = "1.7.0"
+
+[[deps.Dualization]]
+deps = ["LinearAlgebra", "MathOptInterface"]
+git-tree-sha1 = "2186a7ffcd33ea52dcc28321020e049f00454b2f"
+uuid = "191a621a-6537-11e9-281d-650236a99e60"
+version = "0.7.7"
+weakdeps = ["JuMP"]
+
+ [deps.Dualization.extensions]
+ DualizationJuMPExt = "JuMP"
+
+[[deps.EarCut_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053"
+uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
+version = "2.2.4+0"
+
+[[deps.EnumX]]
+git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c"
+uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
+version = "1.0.7"
+
+[[deps.EnzymeCore]]
+git-tree-sha1 = "971d7831cc85f43bc9f51d615a3f7f21270c2f1d"
+uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
+version = "0.8.21"
+weakdeps = ["Adapt", "ChainRulesCore"]
+
+ [deps.EnzymeCore.extensions]
+ AdaptExt = "Adapt"
+ EnzymeCoreChainRulesCoreExt = "ChainRulesCore"
+
+[[deps.ExactPredicates]]
+deps = ["IntervalArithmetic", "Random", "StaticArrays"]
+git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f"
+uuid = "429591f6-91af-11e9-00e2-59fbe8cec110"
+version = "2.2.9"
+
+[[deps.Expat_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e6c4a6407a949e79a9d3f249bf49e6987c80e01f"
+uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
+version = "2.8.2+0"
+
+[[deps.ExprTools]]
+git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec"
+uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04"
+version = "0.1.10"
+
+[[deps.ExproniconLite]]
+git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2"
+uuid = "55351af7-c7e9-48d6-89ff-24e801d99491"
+version = "0.10.14"
+
+[[deps.FFMPEG_jll]]
+deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libva_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
+git-tree-sha1 = "7a58e45171b63ed4782f2d36fdee8713a469e6e0"
+uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
+version = "8.1.2+0"
+
+[[deps.FFTA]]
+deps = ["AbstractFFTs", "DocStringExtensions", "LinearAlgebra", "MuladdMacro", "Primes", "Random", "Reexport"]
+git-tree-sha1 = "65e55303b72f4a567a51b174dd2c47496efeb95a"
+uuid = "b86e33f2-c0db-4aa1-a6e0-ab43e668529e"
+version = "0.3.1"
+
+[[deps.FastBroadcast]]
+deps = ["ArrayInterface", "LinearAlgebra"]
+git-tree-sha1 = "8b77b1a6d20b051c223c4907d92dbf9af7b23fa5"
+uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898"
+version = "1.3.3"
+weakdeps = ["Polyester", "Static"]
+
+ [deps.FastBroadcast.extensions]
+ FastBroadcastPolyesterExt = "Polyester"
+ FastBroadcastStaticExt = "Static"
+
+[[deps.FastClosures]]
+git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef"
+uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a"
+version = "0.3.2"
+
+[[deps.FastPower]]
+git-tree-sha1 = "1b078ec113773ef9a5b07ea71ff90630eff88f58"
+uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b"
+version = "1.3.3"
+
+ [deps.FastPower.extensions]
+ FastPowerEnzymeExt = "Enzyme"
+ FastPowerForwardDiffExt = "ForwardDiff"
+ FastPowerMeasurementsExt = "Measurements"
+ FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements"
+ FastPowerMooncakeExt = "Mooncake"
+ FastPowerReverseDiffExt = "ReverseDiff"
+ FastPowerTrackerExt = "Tracker"
+
+ [deps.FastPower.weakdeps]
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
+ MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+
+[[deps.FileIO]]
+deps = ["Pkg", "Requires", "UUIDs"]
+git-tree-sha1 = "8e9c059d6857607253e837730dbf780b6b151acd"
+uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
+version = "1.19.0"
+
+ [deps.FileIO.extensions]
+ HTTPExt = "HTTP"
+
+ [deps.FileIO.weakdeps]
+ HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"
+
+[[deps.FilePaths]]
+deps = ["FilePathsBase", "MacroTools", "Reexport"]
+git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c"
+uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824"
+version = "0.9.0"
+
+ [deps.FilePaths.extensions]
+ FilePathsGlobExt = "Glob"
+ FilePathsURIParserExt = "URIParser"
+ FilePathsURIsExt = "URIs"
+
+ [deps.FilePaths.weakdeps]
+ Glob = "c27321d9-0574-5035-807b-f59d2c89b15c"
+ URIParser = "30578b45-9adc-5946-b283-645ec420af67"
+ URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4"
+
+[[deps.FilePathsBase]]
+deps = ["Compat", "Dates"]
+git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2"
+uuid = "48062228-2e41-5def-b9a4-89aafe57970f"
+version = "0.9.24"
+weakdeps = ["Mmap", "Test"]
+
+ [deps.FilePathsBase.extensions]
+ FilePathsBaseMmapExt = "Mmap"
+ FilePathsBaseTestExt = "Test"
+
+[[deps.FileWatching]]
+uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
+version = "1.11.0"
+
+[[deps.FillArrays]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "2f979084d1e13948a3352cf64a25df6bd3b4dca3"
+uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
+version = "1.16.0"
+weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"]
+
+ [deps.FillArrays.extensions]
+ FillArraysPDMatsExt = "PDMats"
+ FillArraysSparseArraysExt = "SparseArrays"
+ FillArraysStaticArraysExt = "StaticArrays"
+ FillArraysStatisticsExt = "Statistics"
+
+[[deps.FindFirstFunctions]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "e6e5cbf7e6f2e3c075f0aea1a43a61306a990c3d"
+uuid = "64ca27bc-2ba2-4a57-88aa-44e436879224"
+version = "3.0.1"
+
+[[deps.FiniteDiff]]
+deps = ["ArrayInterface", "LinearAlgebra", "Setfield"]
+git-tree-sha1 = "2e5742cda07276e1834281ada4cc71b6bfc87586"
+uuid = "6a86dc24-6348-571c-b903-95158fe2bd41"
+version = "2.31.1"
+
+ [deps.FiniteDiff.extensions]
+ FiniteDiffBandedMatricesExt = "BandedMatrices"
+ FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices"
+ FiniteDiffSparseArraysExt = "SparseArrays"
+ FiniteDiffStaticArraysExt = "StaticArrays"
+
+ [deps.FiniteDiff.weakdeps]
+ BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
+ BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.FixedPointNumbers]]
+deps = ["Random", "Statistics"]
+git-tree-sha1 = "59af96b98217c6ef4ae0dfe065ac7c20831d1a84"
+uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
+version = "0.8.6"
+
+[[deps.Fontconfig_jll]]
+deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"]
+git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d"
+uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
+version = "2.17.1+0"
+
+[[deps.Format]]
+git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc"
+uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8"
+version = "1.3.7"
+
+[[deps.ForwardDiff]]
+deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"]
+git-tree-sha1 = "2c5d0b0e12088cde2cf84afb2784415b1ea3dfee"
+uuid = "f6369f11-7733-5829-9624-2563aa707210"
+version = "1.4.1"
+weakdeps = ["StaticArrays"]
+
+ [deps.ForwardDiff.extensions]
+ ForwardDiffStaticArraysExt = "StaticArrays"
+
+[[deps.FreeType]]
+deps = ["CEnum", "FreeType2_jll"]
+git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999"
+uuid = "b38be410-82b0-50bf-ab77-7b57e271db43"
+version = "4.1.1"
+
+[[deps.FreeType2_jll]]
+deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e"
+uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
+version = "2.14.3+1"
+
+[[deps.FreeTypeAbstraction]]
+deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"]
+git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11"
+uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
+version = "0.10.8"
+
+[[deps.FriBidi_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7"
+uuid = "559328eb-81f9-559d-9380-de523a88c83c"
+version = "1.0.17+0"
+
+[[deps.FunctionWrappers]]
+git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e"
+uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e"
+version = "1.1.3"
+
+[[deps.FunctionWrappersWrappers]]
+deps = ["FunctionWrappers", "PrecompileTools", "TruncatedStacktraces"]
+git-tree-sha1 = "ffa0d00178e2004db4da70d96e17ee02e85e8966"
+uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf"
+version = "1.10.0"
+
+ [deps.FunctionWrappersWrappers.extensions]
+ FunctionWrappersWrappersEnzymeExt = ["Enzyme", "EnzymeCore"]
+ FunctionWrappersWrappersMooncakeExt = "Mooncake"
+
+ [deps.FunctionWrappersWrappers.weakdeps]
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+ EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+
+[[deps.Future]]
+deps = ["Random"]
+uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820"
+version = "1.11.0"
+
+[[deps.GPUArraysCore]]
+deps = ["Adapt"]
+git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627"
+uuid = "46192b85-c4d5-4398-a991-12ede77f4527"
+version = "0.2.0"
+
+[[deps.Gamma]]
+git-tree-sha1 = "86f86b6168a016ed88e4ae4e64577b98c3b59e8e"
+uuid = "a0844989-3bd2-4988-8bea-c9407ab0941b"
+version = "1.1.0"
+
+[[deps.GeometryBasics]]
+deps = ["EarCut_jll", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"]
+git-tree-sha1 = "364685f5ffde25deb1bbcfd5bb278a5c6b7a9b37"
+uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
+version = "0.5.11"
+
+ [deps.GeometryBasics.extensions]
+ ExtentsExt = "Extents"
+ GeometryBasicsGeoInterfaceExt = "GeoInterface"
+ IntervalSetsExt = "IntervalSets"
+
+ [deps.GeometryBasics.weakdeps]
+ Extents = "411431e0-e8b7-467b-b5e0-f676ba4f2910"
+ GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+
+[[deps.GettextRuntime_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"]
+git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340"
+uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a"
+version = "0.22.4+0"
+
+[[deps.Giflib_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a"
+uuid = "59f7168a-df46-5410-90c8-f2779963d0ec"
+version = "5.2.3+0"
+
+[[deps.Glib_jll]]
+deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
+git-tree-sha1 = "24f6def62397474a297bfcec22384101609142ed"
+uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
+version = "2.86.3+0"
+
+[[deps.Glob]]
+git-tree-sha1 = "246c628cec062230b7d183aab88841fa94fcabe9"
+uuid = "c27321d9-0574-5035-807b-f59d2c89b15c"
+version = "1.5.0"
+
+[[deps.Graphics]]
+deps = ["Colors", "LinearAlgebra", "NaNMath"]
+git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c"
+uuid = "a2bd30eb-e257-5431-a919-1863eab51364"
+version = "1.1.3"
+
+[[deps.Graphite2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "69ffb934a5c5b7e086a0b4fee3427db2556fba6e"
+uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
+version = "1.3.16+0"
+
+[[deps.Graphs]]
+deps = ["ArnoldiMethod", "DataStructures", "Inflate", "LinearAlgebra", "Random", "SimpleTraits", "SparseArrays", "Statistics"]
+git-tree-sha1 = "7eb45fe833a5b7c51cf6d89c5a841d5967e44be3"
+uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
+version = "1.14.0"
+weakdeps = ["Distributed", "SharedArrays"]
+
+ [deps.Graphs.extensions]
+ GraphsSharedArraysExt = "SharedArrays"
+
+[[deps.GridLayoutBase]]
+deps = ["GeometryBasics", "InteractiveUtils", "Observables"]
+git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f"
+uuid = "3955a311-db13-416c-9275-1d80ed98e5e9"
+version = "0.11.2"
+
+[[deps.HDF5_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "aws_c_s3_jll", "dlfcn_win32_jll", "libaec_jll", "mpif_jll"]
+git-tree-sha1 = "45337643a2d97262d5fe72ce1f13e8a662d13d62"
+uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
+version = "2.1.2+0"
+
+[[deps.HarfBuzz_jll]]
+deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"]
+git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813"
+uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566"
+version = "8.5.1+0"
+
+[[deps.HiGHS]]
+deps = ["HiGHS_jll", "LinearAlgebra", "MathOptIIS", "MathOptInterface", "OpenBLAS32_jll", "PrecompileTools", "SparseArrays"]
+git-tree-sha1 = "01a5241985559c08a5baadbcebd6d87daaf84a84"
+uuid = "87dc4568-4c63-4d18-b0c0-bb2238e4078b"
+version = "1.24.1"
+
+[[deps.HiGHS_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Zlib_jll", "libblastrampoline_jll"]
+git-tree-sha1 = "5814a4409f49e8430c184cbe4bc19fa2957bbf0a"
+uuid = "8fd58aa0-07eb-5a78-9b36-339c94fd15ea"
+version = "1.15.1+0"
+
+[[deps.Hwloc_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libpciaccess_jll"]
+git-tree-sha1 = "c35847ca5b4997fc8418836354a56c459bcf48d8"
+uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
+version = "2.14.0+0"
+
+[[deps.HypergeometricFunctions]]
+deps = ["Gamma", "LinearAlgebra"]
+git-tree-sha1 = "18d7deab5fb0440dc6a7b6993c5c27b25420de10"
+uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
+version = "0.3.29"
+
+[[deps.IfElse]]
+git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1"
+uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173"
+version = "0.1.1"
+
+[[deps.ImageAxes]]
+deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"]
+git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba"
+uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac"
+version = "0.6.12"
+
+[[deps.ImageBase]]
+deps = ["ImageCore", "Reexport"]
+git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909"
+uuid = "c817782e-172a-44cc-b673-b171935fbb9e"
+version = "0.1.7"
+
+[[deps.ImageCore]]
+deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"]
+git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3"
+uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
+version = "0.10.5"
+
+[[deps.ImageIO]]
+deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"]
+git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7"
+uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
+version = "0.6.9"
+
+[[deps.ImageMetadata]]
+deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"]
+git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec"
+uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49"
+version = "0.9.10"
+
+[[deps.Imath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65"
+uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1"
+version = "3.2.2+0"
+
+[[deps.IndirectArrays]]
+git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f"
+uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959"
+version = "1.0.0"
+
+[[deps.Inflate]]
+git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d"
+uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
+version = "0.1.5"
+
+[[deps.InlineStrings]]
+git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d"
+uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48"
+version = "1.4.5"
+
+ [deps.InlineStrings.extensions]
+ ArrowTypesExt = "ArrowTypes"
+ ParsersExt = "Parsers"
+
+ [deps.InlineStrings.weakdeps]
+ ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
+ Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
+
+[[deps.IntegerMathUtils]]
+git-tree-sha1 = "4c1acff2dc6b6967e7e750633c50bc3b8d83e617"
+uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235"
+version = "0.1.3"
+
+[[deps.IntelOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
+git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303"
+uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
+version = "2025.2.0+0"
+
+[[deps.InteractiveUtils]]
+deps = ["Markdown"]
+uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
+version = "1.11.0"
+
+[[deps.Interpolations]]
+deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
+git-tree-sha1 = "48922d06068130f87e43edef52382e6a94305ae6"
+uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
+version = "0.16.3"
+weakdeps = ["ForwardDiff", "Unitful"]
+
+ [deps.Interpolations.extensions]
+ InterpolationsForwardDiffExt = "ForwardDiff"
+ InterpolationsUnitfulExt = "Unitful"
+
+[[deps.IntervalArithmetic]]
+deps = ["CRlibm", "CoreMath", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"]
+git-tree-sha1 = "c3ee408ae340565f41699e3a3fa1053698c7626e"
+uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253"
+version = "1.0.10"
+
+ [deps.IntervalArithmetic.extensions]
+ IntervalArithmeticArblibExt = "Arblib"
+ IntervalArithmeticDiffRulesExt = "DiffRules"
+ IntervalArithmeticForwardDiffExt = "ForwardDiff"
+ IntervalArithmeticIntervalSetsExt = "IntervalSets"
+ IntervalArithmeticIrrationalConstantsExt = "IrrationalConstants"
+ IntervalArithmeticLinearAlgebraExt = "LinearAlgebra"
+ IntervalArithmeticRecipesBaseExt = "RecipesBase"
+ IntervalArithmeticSparseArraysExt = "SparseArrays"
+
+ [deps.IntervalArithmetic.weakdeps]
+ Arblib = "fb37089c-8514-4489-9461-98f9c8763369"
+ DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+ IrrationalConstants = "92d709cd-6900-40b7-9082-c6be49f344b6"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+
+[[deps.IntervalSets]]
+git-tree-sha1 = "79d6bd28c8d9bccc2229784f1bd637689b256377"
+uuid = "8197267c-284f-5f27-9208-e0e47529a953"
+version = "0.7.14"
+weakdeps = ["Random", "RecipesBase", "Statistics"]
+
+ [deps.IntervalSets.extensions]
+ IntervalSetsRandomExt = "Random"
+ IntervalSetsRecipesBaseExt = "RecipesBase"
+ IntervalSetsStatisticsExt = "Statistics"
+
+[[deps.InverseFunctions]]
+git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.17"
+weakdeps = ["Dates", "Test"]
+
+ [deps.InverseFunctions.extensions]
+ InverseFunctionsDatesExt = "Dates"
+ InverseFunctionsTestExt = "Test"
+
+[[deps.IrrationalConstants]]
+git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758"
+uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
+version = "0.2.6"
+
+[[deps.Isoband]]
+deps = ["isoband_jll"]
+git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137"
+uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4"
+version = "0.1.1"
+
+[[deps.IterTools]]
+git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023"
+uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
+version = "1.10.0"
+
+[[deps.IteratorInterfaceExtensions]]
+git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
+uuid = "82899510-4779-5014-852e-03e436cf321d"
+version = "1.0.0"
+
+[[deps.JLLWrappers]]
+deps = ["Artifacts", "Preferences"]
+git-tree-sha1 = "7204148362dafe5fe6a273f855b8ccbe4df8173e"
+uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
+version = "1.8.0"
+
+[[deps.JSON]]
+deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"]
+git-tree-sha1 = "c89d196f5ffb64bfbf80985b699ea913b0d2c211"
+uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
+version = "1.6.1"
+
+ [deps.JSON.extensions]
+ JSONArrowExt = ["ArrowTypes"]
+
+ [deps.JSON.weakdeps]
+ ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
+
+[[deps.Jieko]]
+deps = ["ExproniconLite"]
+git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c"
+uuid = "ae98c720-c025-4a4a-838c-29b094483192"
+version = "0.2.1"
+
+[[deps.JpegTurbo]]
+deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"]
+git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9"
+uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0"
+version = "0.1.6"
+
+[[deps.JpegTurbo_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1dae3057da6f2b9c857afef03177bbdc7c4afe92"
+uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
+version = "3.2.0+0"
+
+[[deps.JuMP]]
+deps = ["LinearAlgebra", "MacroTools", "MathOptInterface", "MutableArithmetics", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays"]
+git-tree-sha1 = "6941586d9cf3c0af718bc6e6250dcf24057d412e"
+uuid = "4076af6c-e467-56ae-b986-b466b2749572"
+version = "1.30.1"
+
+ [deps.JuMP.extensions]
+ JuMPDimensionalDataExt = "DimensionalData"
+
+ [deps.JuMP.weakdeps]
+ DimensionalData = "0703355e-b756-11e9-17c0-8b28908087d0"
+
+[[deps.JuliaSyntaxHighlighting]]
+deps = ["StyledStrings"]
+uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011"
+version = "1.12.0"
+
+[[deps.KernelDensity]]
+deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"]
+git-tree-sha1 = "9eda8292dd3268b3b7ec9df21bbfac24e177ec52"
+uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b"
+version = "0.6.12"
+
+[[deps.Krylov]]
+deps = ["LinearAlgebra", "Printf", "SparseArrays"]
+git-tree-sha1 = "fc2e5bc665dfa1be33fac60b5762d462bccfae7b"
+uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7"
+version = "0.10.8"
+
+[[deps.LAME_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc"
+uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
+version = "3.100.3+0"
+
+[[deps.LERC_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "17b94ecafcfa45e8360a4fc9ca6b583b049e4e37"
+uuid = "88015f11-f218-50d7-93a8-a6af411a945d"
+version = "4.1.0+0"
+
+[[deps.LLVMOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "3ac157462e1e800777cc97d0eafd1bdb5356a470"
+uuid = "1d63c593-3942-5779-bab2-d838dc0a180e"
+version = "21.1.8+0"
+
+[[deps.LRUCache]]
+git-tree-sha1 = "5519b95a490ff5fe629c4a7aa3b3dfc9160498b3"
+uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637"
+version = "1.6.2"
+weakdeps = ["Serialization"]
+
+ [deps.LRUCache.extensions]
+ SerializationExt = ["Serialization"]
+
+[[deps.LaTeXStrings]]
+git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c"
+uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
+version = "1.4.0"
+
+[[deps.LayoutPointers]]
+deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"]
+git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c"
+uuid = "10f19ff3-798f-405d-979b-55457f8fc047"
+version = "0.1.17"
+
+[[deps.LazyArtifacts]]
+deps = ["Artifacts", "Pkg"]
+uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
+version = "1.11.0"
+
+[[deps.LazyModules]]
+git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e"
+uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e"
+version = "0.3.1"
+
+[[deps.LeftChildRightSiblingTrees]]
+deps = ["AbstractTrees"]
+git-tree-sha1 = "95ba48564903b43b2462318aa243ee79d81135ff"
+uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e"
+version = "0.2.1"
+
+[[deps.LibCURL]]
+deps = ["LibCURL_jll", "MozillaCACerts_jll"]
+uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"
+version = "0.6.4"
+
+[[deps.LibCURL_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"]
+uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0"
+version = "8.15.0+0"
+
+[[deps.LibGit2]]
+deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"]
+uuid = "76f85450-5226-5b5a-8eaa-529ad045b433"
+version = "1.11.0"
+
+[[deps.LibGit2_jll]]
+deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"]
+uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5"
+version = "1.9.0+0"
+
+[[deps.LibSSH2_jll]]
+deps = ["Artifacts", "Libdl", "OpenSSL_jll"]
+uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8"
+version = "1.11.3+1"
+
+[[deps.Libdl]]
+uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
+version = "1.11.0"
+
+[[deps.Libffi_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a"
+uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
+version = "3.4.7+0"
+
+[[deps.Libglvnd_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"]
+git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0"
+uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29"
+version = "1.7.1+1"
+
+[[deps.Libiconv_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809"
+uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
+version = "1.18.0+0"
+
+[[deps.Libmount_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "cc3ad4faf30015a3e8094c9b5b7f19e85bdf2386"
+uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
+version = "2.42.0+0"
+
+[[deps.Libtiff_jll]]
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"]
+git-tree-sha1 = "aebd334d06cee9f24cea70bd19a39749daf73881"
+uuid = "89763e89-9b03-5906-acba-b20f662cd828"
+version = "4.7.3+0"
+
+[[deps.Libuuid_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "d620582b1f0cbe2c72dd1d5bd195a9ce73370ab1"
+uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
+version = "2.42.0+0"
+
+[[deps.LineSearch]]
+deps = ["ADTypes", "CommonSolve", "ConcreteStructs", "FastClosures", "LinearAlgebra", "MaybeInplace", "PrecompileTools", "SciMLBase", "SciMLJacobianOperators", "StaticArraysCore"]
+git-tree-sha1 = "a7553de02835e996f80bf895a291ab981ba1f796"
+uuid = "87fe0de2-c867-4266-b59a-2f0a94fc965b"
+version = "0.1.10"
+
+ [deps.LineSearch.extensions]
+ LineSearchLineSearchesExt = "LineSearches"
+
+ [deps.LineSearch.weakdeps]
+ LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
+
+[[deps.LinearAlgebra]]
+deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
+uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+version = "1.12.0"
+
+[[deps.LinearSolve]]
+deps = ["AMD", "ArrayInterface", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "OpenBLAS_jll", "PrecompileTools", "Preferences", "PureKLU", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLLogging", "SciMLOperators", "Setfield", "SparseArrays", "SparseColumnPivotedQR", "StaticArraysCore"]
+git-tree-sha1 = "a4d32a4ec5bc98b5bf6512cf1d7d0abe10b6c5f8"
+uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
+version = "4.2.0"
+
+ [deps.LinearSolve.extensions]
+ LinearSolveAMDGPUExt = "AMDGPU"
+ LinearSolveAlgebraicMultigridExt = "AlgebraicMultigrid"
+ LinearSolveBLISExt = ["blis_jll", "LAPACK_jll"]
+ LinearSolveBandedMatricesExt = "BandedMatrices"
+ LinearSolveBlockDiagonalsExt = "BlockDiagonals"
+ LinearSolveCUDAExt = ["cuSOLVER"]
+ LinearSolveCUDSSExt = "CUDSS"
+ LinearSolveCUSOLVERRFExt = ["CUSOLVERRF", "SparseArrays"]
+ LinearSolveChainRulesCoreExt = "ChainRulesCore"
+ LinearSolveCliqueTreesExt = ["CliqueTrees", "SparseArrays"]
+ LinearSolveElementalExt = "Elemental"
+ LinearSolveEnzymeExt = ["EnzymeCore", "SparseArrays"]
+ LinearSolveFastAlmostBandedMatricesExt = "FastAlmostBandedMatrices"
+ LinearSolveFastLapackInterfaceExt = "FastLapackInterface"
+ LinearSolveForwardDiffExt = "ForwardDiff"
+ LinearSolveGinkgoExt = ["Ginkgo", "SparseArrays"]
+ LinearSolveHSLExt = ["HSL", "SparseArrays"]
+ LinearSolveHYPREExt = "HYPRE"
+ LinearSolveIterativeSolversExt = "IterativeSolvers"
+ LinearSolveKernelAbstractionsExt = "KernelAbstractions"
+ LinearSolveKrylovKitExt = "KrylovKit"
+ LinearSolveMUMPSExt = ["MUMPS", "SparseArrays"]
+ LinearSolveMetalExt = "Metal"
+ LinearSolveMooncakeExt = "Mooncake"
+ LinearSolvePETScExt = ["PETSc", "SparseArrays", "SparseMatricesCSR"]
+ LinearSolvePETScMPIExt = ["PETSc", "PartitionedArrays", "SparseArrays", "SparseMatricesCSR"]
+ LinearSolveParUExt = ["ParU_jll", "SparseArrays"]
+ LinearSolvePardisoExt = ["Pardiso", "SparseArrays"]
+ LinearSolvePartitionedSolversExt = ["PartitionedArrays", "PartitionedSolvers"]
+ LinearSolvePureUMFPACKExt = ["PureUMFPACK", "SparseArrays"]
+ LinearSolveRecursiveFactorizationExt = "RecursiveFactorization"
+ LinearSolveSTRUMPACKExt = ["SparseArrays", "STRUMPACK_jll"]
+ LinearSolveSparseArraysExt = "SparseArrays"
+ LinearSolveSparspakExt = ["SparseArrays", "Sparspak"]
+ LinearSolveSpecializingFactorizationsExt = "SpecializingFactorizations"
+ LinearSolveSuperLUDISTExt = ["SparseArrays", "SuperLUDIST"]
+
+ [deps.LinearSolve.weakdeps]
+ AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e"
+ AlgebraicMultigrid = "2169fc97-5a83-5252-b627-83903c6c433c"
+ BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
+ BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0"
+ CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e"
+ CUSOLVERRF = "a8cc9031-bad2-4722-94f5-40deabb4245c"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8"
+ Elemental = "902c3f28-d1ec-5e7e-8399-a24c3845ee38"
+ EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869"
+ FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e"
+ FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ Ginkgo = "4c8bd3c9-ead9-4b5e-a625-08f1338ba0ec"
+ HSL = "34c5aeac-e683-54a6-a0e9-6e0fdc586c50"
+ HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771"
+ IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153"
+ KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
+ KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77"
+ LAPACK_jll = "51474c39-65e3-53ba-86ba-03b1b862ec14"
+ MUMPS = "55d2b088-9f4e-11e9-26c0-150b02ea6a46"
+ Metal = "dde4c033-4e86-420c-a63e-0dd931031962"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ PETSc = "ace2c81b-2b5f-4b1e-a30d-d662738edfe0"
+ ParU_jll = "9e0b026c-e8ce-559c-a2c4-6a3d5c955bc9"
+ Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2"
+ PartitionedArrays = "5a9dfac6-5c52-46f7-8278-5e2210713be9"
+ PartitionedSolvers = "11b65f7f-80ac-401b-9ef2-3db765482d62"
+ PureUMFPACK = "b7e1f0a2-3c4d-4e5f-9a0b-1c2d3e4f5a6b"
+ RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4"
+ STRUMPACK_jll = "86fbd0b9-476f-557c-b766-62c724b42d8c"
+ SparseMatricesCSR = "a0a7dd2c-ebf4-11e9-1f05-cf50bc540ca1"
+ Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac"
+ SpecializingFactorizations = "fa08b7a1-13d3-4faf-875d-5cbc1520e3f3"
+ SuperLUDIST = "4cd002a6-0da4-410d-a012-232df062f478"
+ blis_jll = "6136c539-28a5-5bf0-87cc-b183200dce32"
+ cuSOLVER = "887afef0-6a32-4de5-add4-7827692ba8fc"
+
+[[deps.LogExpFunctions]]
+deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
+git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f"
+uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
+version = "0.3.29"
+
+ [deps.LogExpFunctions.extensions]
+ LogExpFunctionsChainRulesCoreExt = "ChainRulesCore"
+ LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables"
+ LogExpFunctionsInverseFunctionsExt = "InverseFunctions"
+
+ [deps.LogExpFunctions.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0"
+ InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
+
+[[deps.Logging]]
+uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
+version = "1.11.0"
+
+[[deps.LoggingExtras]]
+deps = ["Dates", "Logging"]
+git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575"
+uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36"
+version = "1.2.0"
+
+[[deps.Lz4_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "191686b1ac1ea9c89fc52e996ad15d1d241d1e33"
+uuid = "5ced341a-0733-55b8-9ab6-a4889d929147"
+version = "1.10.1+0"
+
+[[deps.MKL_jll]]
+deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"]
+git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa"
+uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
+version = "2025.2.0+0"
+
+[[deps.MPIABI_jll]]
+deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "9be143b6045719e8fb019d2b3bc2aebad1184fef"
+uuid = "b5ada748-db0f-5fc0-8972-9331c762740c"
+version = "0.1.5+0"
+
+[[deps.MPICH_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "07dbec8aab01696edc0151a401a6cdfe95b9b885"
+uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4"
+version = "5.0.1+0"
+
+[[deps.MPIPreferences]]
+deps = ["Libdl", "Preferences"]
+git-tree-sha1 = "8e98d5d80b87403c311fd51e8455d4546ba7a5f8"
+uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
+version = "0.1.12"
+
+[[deps.MPItrampoline_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "675df097f8eeb28998b2cfe3b25655af73d5f7df"
+uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748"
+version = "5.5.6+0"
+
+[[deps.MacroTools]]
+git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522"
+uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
+version = "0.5.16"
+
+[[deps.Makie]]
+deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"]
+git-tree-sha1 = "f2c8715d05bf10f9d4dc354e69dee30b6be53239"
+uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
+version = "0.24.13"
+
+ [deps.Makie.extensions]
+ MakieDynamicQuantitiesExt = "DynamicQuantities"
+
+ [deps.Makie.weakdeps]
+ DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821"
+
+[[deps.ManualMemory]]
+git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd"
+uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667"
+version = "0.1.8"
+
+[[deps.MappedArrays]]
+git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40"
+uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
+version = "0.4.3"
+
+[[deps.Markdown]]
+deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"]
+uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
+version = "1.11.0"
+
+[[deps.MathOptAnalyzer]]
+deps = ["Dualization", "LinearAlgebra", "MathOptIIS", "MathOptInterface", "Printf"]
+git-tree-sha1 = "5c0427e61a7f4396f513cb1e72270866140e275e"
+uuid = "d1179b25-476b-425c-b826-c7787f0fff83"
+version = "0.1.2"
+weakdeps = ["JuMP"]
+
+ [deps.MathOptAnalyzer.extensions]
+ MathOptAnalyzerJuMPExt = "JuMP"
+
+[[deps.MathOptIIS]]
+deps = ["MathOptInterface"]
+git-tree-sha1 = "3b3d69130d8ab8c39d5fa4d30e20a8e6428c9d37"
+uuid = "8c4f8055-bd93-4160-a86b-a0c04941dbff"
+version = "0.2.0"
+
+[[deps.MathOptInterface]]
+deps = ["CodecBzip2", "CodecZlib", "ForwardDiff", "JSON", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test"]
+git-tree-sha1 = "9f23c8c1667bd0b0e611110aaf80aa91c1bdf274"
+uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
+version = "1.51.1"
+
+ [deps.MathOptInterface.extensions]
+ MathOptInterfaceBenchmarkToolsExt = "BenchmarkTools"
+ MathOptInterfaceCliqueTreesExt = "CliqueTrees"
+
+ [deps.MathOptInterface.weakdeps]
+ BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf"
+ CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8"
+
+[[deps.MathTeXEngine]]
+deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"]
+git-tree-sha1 = "aa1078778be5a8e5259ff04fbc3d258b3e78d464"
+uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
+version = "0.6.9"
+
+[[deps.MaybeInplace]]
+deps = ["ArrayInterface", "LinearAlgebra", "MacroTools"]
+git-tree-sha1 = "bf287c2abdd365d73c9ee86b262c6d8af0d6e2a1"
+uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb"
+version = "0.1.5"
+weakdeps = ["SparseArrays"]
+
+ [deps.MaybeInplace.extensions]
+ MaybeInplaceSparseArraysExt = "SparseArrays"
+
+[[deps.MetaGraphsNext]]
+deps = ["Graphs", "SimpleTraits"]
+git-tree-sha1 = "fa3dc4a0d6569797af15f858ff012990c4afbf61"
+uuid = "fa8bd995-216d-47f1-8a91-f3b68fbeb377"
+version = "0.8.0"
+
+ [deps.MetaGraphsNext.extensions]
+ MetaGraphsNextJLD2Ext = ["Graphs", "JLD2"]
+
+ [deps.MetaGraphsNext.weakdeps]
+ JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819"
+
+[[deps.MicrosoftMPI_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227"
+uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf"
+version = "10.1.4+3"
+
+[[deps.Missings]]
+deps = ["DataAPI"]
+git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d"
+uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
+version = "1.2.0"
+
+[[deps.Mmap]]
+uuid = "a63ad114-7e13-5084-954f-fe012c677804"
+version = "1.11.0"
+
+[[deps.MosaicViews]]
+deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
+git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe"
+uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389"
+version = "0.3.4"
+
+[[deps.Moshi]]
+deps = ["ExproniconLite", "Jieko"]
+git-tree-sha1 = "999dfa2b4f8334c1c23bd307c2b0cb6f97c54591"
+uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d"
+version = "0.3.8"
+
+[[deps.MozillaCACerts_jll]]
+uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
+version = "2025.11.4"
+
+[[deps.MuladdMacro]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "e8dcbeef032ba2f9051a44ac22b4e54e3a1a0099"
+uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221"
+version = "0.2.6"
+
+[[deps.MutableArithmetics]]
+deps = ["LinearAlgebra", "SparseArrays", "Test"]
+git-tree-sha1 = "dc5b2c4c111c46bc79ac4405eeb563523b39c004"
+uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0"
+version = "1.8.0"
+
+[[deps.NCDatasets]]
+deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"]
+git-tree-sha1 = "5eb7747d10437f5acb2675c1f865ffa0353f3f9c"
+uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab"
+version = "0.14.15"
+
+ [deps.NCDatasets.extensions]
+ NCDatasetsMPIExt = "MPI"
+
+ [deps.NCDatasets.weakdeps]
+ MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
+
+[[deps.NaNMath]]
+deps = ["OpenLibm_jll"]
+git-tree-sha1 = "dbd2e8cd2c1c27f0b584f6661b4309609c5a685e"
+uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
+version = "1.1.4"
+
+[[deps.NetCDF_jll]]
+deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "XML2_jll", "Zlib_jll", "Zstd_jll", "libaec_jll", "libzip_jll"]
+git-tree-sha1 = "8a36db9b934b0e72583e624abc8f3b3d60554f2c"
+uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3"
+version = "401.1000.0+0"
+
+[[deps.Netpbm]]
+deps = ["FileIO", "ImageCore", "ImageMetadata"]
+git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd"
+uuid = "f09324ee-3d7c-5217-9330-fc30815ba969"
+version = "1.1.1"
+
+[[deps.NetworkOptions]]
+uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
+version = "1.3.0"
+
+[[deps.NonlinearSolve]]
+deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "Setfield", "SimpleNonlinearSolve", "StaticArraysCore", "SymbolicIndexingInterface"]
+git-tree-sha1 = "fa84bceaa43cc91db844b4e869f50f53e2b797bc"
+uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec"
+version = "4.20.2"
+
+ [deps.NonlinearSolve.extensions]
+ NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt"
+ NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration"
+ NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim"
+ NonlinearSolveMINPACKExt = "MINPACK"
+ NonlinearSolveNLSolversExt = "NLSolvers"
+ NonlinearSolveNLsolveExt = ["NLsolve", "LineSearches"]
+ NonlinearSolvePETScExt = ["PETSc", "MPI", "SparseArrays"]
+ NonlinearSolveSIAMFANLEquationsExt = "SIAMFANLEquations"
+ NonlinearSolveSpeedMappingExt = "SpeedMapping"
+ NonlinearSolveSundialsExt = "Sundials"
+
+ [deps.NonlinearSolve.weakdeps]
+ FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce"
+ FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176"
+ LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891"
+ LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
+ MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9"
+ MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
+ NLSolvers = "337daf1e-9722-11e9-073e-8b9effe078ba"
+ NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
+ PETSc = "ace2c81b-2b5f-4b1e-a30d-d662738edfe0"
+ SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412"
+ Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4"
+
+[[deps.NonlinearSolveBase]]
+deps = ["ADTypes", "Adapt", "ArrayInterface", "CommonSolve", "Compat", "ConcreteStructs", "DifferentiationInterface", "EnzymeCore", "FastClosures", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "LogExpFunctions", "Markdown", "MaybeInplace", "PreallocationTools", "PrecompileTools", "Preferences", "Printf", "RecursiveArrayTools", "SciMLBase", "SciMLJacobianOperators", "SciMLLogging", "SciMLOperators", "SciMLStructures", "Setfield", "StaticArraysCore", "SymbolicIndexingInterface", "TimerOutputs"]
+git-tree-sha1 = "70e128636da33678ef4aa088e47e0c4ad7c86d92"
+uuid = "be0214bd-f91f-a760-ac4e-3421ce2b2da0"
+version = "2.33.0"
+
+ [deps.NonlinearSolveBase.extensions]
+ NonlinearSolveBaseBandedMatricesExt = "BandedMatrices"
+ NonlinearSolveBaseChainRulesCoreExt = "ChainRulesCore"
+ NonlinearSolveBaseEnzymeExt = ["ChainRulesCore", "Enzyme"]
+ NonlinearSolveBaseForwardDiffExt = "ForwardDiff"
+ NonlinearSolveBaseLineSearchExt = "LineSearch"
+ NonlinearSolveBaseLinearSolveExt = "LinearSolve"
+ NonlinearSolveBaseMooncakeExt = "Mooncake"
+ NonlinearSolveBaseReverseDiffExt = "ReverseDiff"
+ NonlinearSolveBaseSparseArraysExt = "SparseArrays"
+ NonlinearSolveBaseSparseMatrixColoringsExt = "SparseMatrixColorings"
+ NonlinearSolveBaseTrackerExt = "Tracker"
+
+ [deps.NonlinearSolveBase.weakdeps]
+ BandedMatrices = "aae01518-5342-5314-be14-df237901396f"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ LineSearch = "87fe0de2-c867-4266-b59a-2f0a94fc965b"
+ LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+
+[[deps.NonlinearSolveFirstOrder]]
+deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConcreteStructs", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLJacobianOperators", "SciMLLogging", "Setfield", "StaticArraysCore"]
+git-tree-sha1 = "94fc6df89c83ff62403f4e22d2db65960cd1914d"
+uuid = "5959db7a-ea39-4486-b5fe-2dd0bf03d60d"
+version = "2.1.3"
+
+[[deps.NonlinearSolveQuasiNewton]]
+deps = ["ArrayInterface", "CommonSolve", "ConcreteStructs", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLLogging", "SciMLOperators", "StaticArraysCore"]
+git-tree-sha1 = "7a6137308a5876fd0a72b2455eeb9a68bbaf09ad"
+uuid = "9a2c21bd-3a47-402d-9113-8faf9a0ee114"
+version = "1.13.3"
+weakdeps = ["ForwardDiff"]
+
+ [deps.NonlinearSolveQuasiNewton.extensions]
+ NonlinearSolveQuasiNewtonForwardDiffExt = "ForwardDiff"
+
+[[deps.NonlinearSolveSpectralMethods]]
+deps = ["CommonSolve", "ConcreteStructs", "LineSearch", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"]
+git-tree-sha1 = "ba7d164f81482d09a03ea7e8c59ef313618e661e"
+uuid = "26075421-4e9a-44e1-8bd1-420ed7ad02b2"
+version = "1.7.2"
+weakdeps = ["ForwardDiff"]
+
+ [deps.NonlinearSolveSpectralMethods.extensions]
+ NonlinearSolveSpectralMethodsForwardDiffExt = "ForwardDiff"
+
+[[deps.Observables]]
+git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225"
+uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
+version = "0.5.5"
+
+[[deps.OffsetArrays]]
+git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151"
+uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
+version = "1.17.0"
+weakdeps = ["Adapt"]
+
+ [deps.OffsetArrays.extensions]
+ OffsetArraysAdaptExt = "Adapt"
+
+[[deps.Ogg_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59"
+uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051"
+version = "1.3.6+0"
+
+[[deps.OpenBLAS32_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "libblastrampoline_jll"]
+git-tree-sha1 = "8b492aefdd20fb9dc1ebc377ff7e5fa1591c9acc"
+uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2"
+version = "0.3.33+2"
+
+[[deps.OpenBLASConsistentFPCSR_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "dafdaa3ff15f20ff703d909d3a6f574a5b0586f3"
+uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af"
+version = "0.3.33+1"
+
+[[deps.OpenBLAS_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
+uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
+version = "0.3.29+0"
+
+[[deps.OpenEXR]]
+deps = ["Colors", "FileIO", "OpenEXR_jll"]
+git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7"
+uuid = "52e1d378-f018-4a11-a4be-720524705ac7"
+version = "0.3.3"
+
+[[deps.OpenEXR_jll]]
+deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "0d621a4beb5e48d195f907c3c5b0bea285d9ff9d"
+uuid = "18a262bb-aa17-5467-a713-aee519bc75cb"
+version = "3.4.13+0"
+
+[[deps.OpenLibm_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
+version = "0.8.7+0"
+
+[[deps.OpenMPI_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"]
+git-tree-sha1 = "6d6c0ca4824268c1a7dca1f4721c535ac63d9074"
+uuid = "fe0851c0-eecd-5654-98d4-656369965a5c"
+version = "5.0.11+0"
+
+[[deps.OpenSSL_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
+version = "3.5.4+0"
+
+[[deps.OpenSpecFun_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335"
+uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
+version = "0.5.6+0"
+
+[[deps.Opus_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e2bb57a313a74b8104064b7efd01406c0a50d2ff"
+uuid = "91d4177d-7536-5919-b921-800302f37372"
+version = "1.6.1+0"
+
+[[deps.OrderedCollections]]
+git-tree-sha1 = "94ba93778373a53bfd5a0caaf7d809c445292ff4"
+uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
+version = "1.8.2"
+
+[[deps.OrdinaryDiffEqBDF]]
+deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqSDIRK", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"]
+git-tree-sha1 = "3d207d6282e905e1875d98d343bef54781129164"
+uuid = "6ad6398a-0878-4a85-9266-38940aa047c8"
+version = "2.3.0"
+
+[[deps.OrdinaryDiffEqCore]]
+deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "BinaryHeaps", "CommonSolve", "DiffEqBase", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "InteractiveUtils", "LinearAlgebra", "Logging", "MacroTools", "MuladdMacro", "PrecompileTools", "Preferences", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLLogging", "SciMLOperators", "SciMLStructures", "SymbolicIndexingInterface", "TruncatedStacktraces"]
+git-tree-sha1 = "c4035f06d7749c49347d8a200d3ba0a17085492e"
+uuid = "bbf590c4-e513-4bbe-9b18-05decba2e5d8"
+version = "4.6.0"
+
+ [deps.OrdinaryDiffEqCore.extensions]
+ OrdinaryDiffEqCoreMooncakeExt = "Mooncake"
+ OrdinaryDiffEqCorePolyesterExt = "Polyester"
+ OrdinaryDiffEqCoreSparseArraysExt = "SparseArrays"
+
+ [deps.OrdinaryDiffEqCore.weakdeps]
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+
+[[deps.OrdinaryDiffEqDifferentiation]]
+deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqCore", "SciMLBase", "SciMLOperators", "SparseMatrixColorings", "StaticArraysCore"]
+git-tree-sha1 = "d9c555750fc4cf0283515536d04e6522b2d0b76f"
+uuid = "4302a76b-040a-498a-8c04-15b101fed76b"
+version = "3.2.3"
+weakdeps = ["SparseArrays"]
+
+ [deps.OrdinaryDiffEqDifferentiation.extensions]
+ OrdinaryDiffEqDifferentiationSparseArraysExt = "SparseArrays"
+
+[[deps.OrdinaryDiffEqLowOrderRK]]
+deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase"]
+git-tree-sha1 = "ffca1eb28ddddf868033d52ae8de660716f4c35b"
+uuid = "1344f307-1e59-4825-a18e-ace9aa3fa4c6"
+version = "2.2.0"
+
+[[deps.OrdinaryDiffEqNonlinearSolve]]
+deps = ["ADTypes", "ArrayInterface", "ConstructionBase", "DiffEqBase", "FastBroadcast", "FastClosures", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "PreallocationTools", "RecursiveArrayTools", "SciMLBase", "SciMLOperators", "SimpleNonlinearSolve", "SparseArrays", "StaticArraysCore"]
+git-tree-sha1 = "d91bbb8a5baa7d4d3e8f998fcad3fe8562982255"
+uuid = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8"
+version = "2.1.0"
+
+[[deps.OrdinaryDiffEqRosenbrock]]
+deps = ["ADTypes", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqRosenbrockTableaus", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase"]
+git-tree-sha1 = "5415ad34584fa4394bc6fb27eefa53dbe65a209a"
+uuid = "43230ef6-c299-4910-a778-202eb28ce4ce"
+version = "2.4.0"
+
+[[deps.OrdinaryDiffEqRosenbrockTableaus]]
+git-tree-sha1 = "c0adc33245d5717c874963897e86606776de1b71"
+uuid = "b4bd8bb3-f80f-41d2-9b21-73a655b304b9"
+version = "2.2.0"
+
+[[deps.OrdinaryDiffEqSDIRK]]
+deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"]
+git-tree-sha1 = "9bfa939cd31975536e397675df92a0cf9290399f"
+uuid = "2d112036-d095-4a1e-ab9a-08536f3ecdbf"
+version = "2.7.1"
+
+[[deps.OrdinaryDiffEqTsit5]]
+deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"]
+git-tree-sha1 = "857ead35624a8ff60029531a31bb35e9a22bea3b"
+uuid = "b1df2697-797e-41e3-8120-5422d3b24e4a"
+version = "2.0.2"
+
+[[deps.PCRE2_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"
+version = "10.44.0+1"
+
+[[deps.PDMats]]
+deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "26766d4b5f1a410c218a19b85a672c6edb693c65"
+uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
+version = "0.11.40"
+weakdeps = ["StatsBase"]
+
+ [deps.PDMats.extensions]
+ StatsBaseExt = "StatsBase"
+
+[[deps.PNGFiles]]
+deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
+git-tree-sha1 = "32b657a0d57c310a1a172bfc8c8cf68c5e674323"
+uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
+version = "0.4.5"
+
+[[deps.Packing]]
+deps = ["GeometryBasics"]
+git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c"
+uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566"
+version = "0.5.1"
+
+[[deps.PaddedViews]]
+deps = ["OffsetArrays"]
+git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f"
+uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
+version = "0.5.12"
+
+[[deps.Pango_jll]]
+deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "58e5ed5e386e156bd93e86b305ebd21ac63d2d04"
+uuid = "36c8627f-9965-5494-a995-c6b170f724f3"
+version = "1.57.1+0"
+
+[[deps.Parameters]]
+deps = ["OrderedCollections", "UnPack"]
+git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe"
+uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a"
+version = "0.12.3"
+
+[[deps.Parsers]]
+deps = ["Dates", "PrecompileTools", "UUIDs"]
+git-tree-sha1 = "32a4e09c5f29402573d673901778a0e03b0807b9"
+uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
+version = "2.8.6"
+
+[[deps.Pixman_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"]
+git-tree-sha1 = "e4a6721aa89e62e5d4217c0b21bd714263779dda"
+uuid = "30392449-352a-5448-841d-b1acce4e97dc"
+version = "0.46.4+0"
+
+[[deps.Pkg]]
+deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"]
+uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
+version = "1.12.1"
+weakdeps = ["REPL"]
+
+ [deps.Pkg.extensions]
+ REPLExt = "REPL"
+
+[[deps.PkgVersion]]
+deps = ["Pkg"]
+git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da"
+uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688"
+version = "0.3.3"
+
+[[deps.PlotUtils]]
+deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"]
+git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a"
+uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
+version = "1.4.4"
+
+[[deps.Polyester]]
+deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"]
+git-tree-sha1 = "16bbc30b5ebea91e9ce1671adc03de2832cff552"
+uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
+version = "0.7.19"
+
+[[deps.PolyesterWeave]]
+deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"]
+git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd"
+uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad"
+version = "0.2.2"
+
+[[deps.PolygonOps]]
+git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
+uuid = "647866c9-e3ac-4575-94e7-e3d426903924"
+version = "0.1.2"
+
+[[deps.PreallocationTools]]
+deps = ["Adapt", "ArrayInterface", "PrecompileTools"]
+git-tree-sha1 = "0c319df479a33799d3b7566fbf14498e4e38a6f3"
+uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46"
+version = "1.2.1"
+
+ [deps.PreallocationTools.extensions]
+ PreallocationToolsForwardDiffExt = "ForwardDiff"
+ PreallocationToolsReverseDiffExt = "ReverseDiff"
+ PreallocationToolsSparseConnectivityTracerExt = "SparseConnectivityTracer"
+
+ [deps.PreallocationTools.weakdeps]
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
+
+[[deps.PrecompileTools]]
+deps = ["Preferences"]
+git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c"
+uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a"
+version = "1.3.4"
+
+[[deps.Preferences]]
+deps = ["TOML"]
+git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4"
+uuid = "21216c6a-2e73-6563-6e65-726566657250"
+version = "1.5.2"
+
+[[deps.PrettyTables]]
+deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"]
+git-tree-sha1 = "ebf455bb866ee6737030e3d3816bb6a0683c4325"
+uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d"
+version = "3.4.0"
+
+ [deps.PrettyTables.extensions]
+ PrettyTablesExcelExt = "XLSX"
+ PrettyTablesTypstryExt = "Typstry"
+
+ [deps.PrettyTables.weakdeps]
+ Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e"
+ XLSX = "fdbf4ff8-1666-58a4-91e7-1b58723a45e0"
+
+[[deps.Primes]]
+deps = ["IntegerMathUtils"]
+git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b"
+uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae"
+version = "0.5.7"
+
+[[deps.Printf]]
+deps = ["Unicode"]
+uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
+version = "1.11.0"
+
+[[deps.ProgressLogging]]
+deps = ["Logging", "SHA", "UUIDs"]
+git-tree-sha1 = "f0803bc1171e455a04124affa9c21bba5ac4db32"
+uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c"
+version = "0.1.6"
+
+[[deps.ProgressMeter]]
+deps = ["Distributed", "Printf"]
+git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7"
+uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
+version = "1.11.0"
+
+[[deps.PropertyDicts]]
+git-tree-sha1 = "a6b4c12d38387a4382fa53b8a6591f9c219add16"
+uuid = "f8a19df8-e894-5f55-a973-672c1158cbca"
+version = "0.2.1"
+
+[[deps.PtrArrays]]
+git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe"
+uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d"
+version = "1.4.0"
+
+[[deps.PureKLU]]
+deps = ["LinearAlgebra", "MuladdMacro", "PrecompileTools", "SparseArrays"]
+git-tree-sha1 = "7ff9a12af707ff8b8fc54e5e10b732af1019f6f4"
+uuid = "0c0d3e7f-3a8b-4f7e-b6f1-9a4d2e7c1f01"
+version = "1.1.0"
+weakdeps = ["ForwardDiff"]
+
+ [deps.PureKLU.extensions]
+ PureKLUForwardDiffExt = "ForwardDiff"
+
+[[deps.QOI]]
+deps = ["ColorTypes", "FileIO", "FixedPointNumbers"]
+git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106"
+uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65"
+version = "1.0.2"
+
+[[deps.QuadGK]]
+deps = ["DataStructures", "LinearAlgebra"]
+git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e"
+uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
+version = "2.11.3"
+
+ [deps.QuadGK.extensions]
+ QuadGKEnzymeExt = "Enzyme"
+
+ [deps.QuadGK.weakdeps]
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+
+[[deps.REPL]]
+deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"]
+uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
+version = "1.11.0"
+
+[[deps.Random]]
+deps = ["SHA"]
+uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
+version = "1.11.0"
+
+[[deps.RangeArrays]]
+git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5"
+uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d"
+version = "0.3.2"
+
+[[deps.Ratios]]
+deps = ["Requires"]
+git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b"
+uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
+version = "0.4.5"
+weakdeps = ["FixedPointNumbers"]
+
+ [deps.Ratios.extensions]
+ RatiosFixedPointNumbersExt = "FixedPointNumbers"
+
+[[deps.RecipesBase]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff"
+uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+version = "1.3.4"
+
+[[deps.RecursiveArrayTools]]
+deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "LinearAlgebra", "PrecompileTools", "RecipesBase", "StaticArraysCore", "SymbolicIndexingInterface"]
+git-tree-sha1 = "a0aa35f847b21c7884371ec60913632cc1b68495"
+uuid = "731186ca-8d62-57ce-b412-fbd966d074cd"
+version = "4.3.2"
+
+ [deps.RecursiveArrayTools.extensions]
+ RecursiveArrayToolsCUDAExt = "CUDA"
+ RecursiveArrayToolsFastBroadcastExt = "FastBroadcast"
+ RecursiveArrayToolsFastBroadcastPolyesterExt = ["FastBroadcast", "Polyester"]
+ RecursiveArrayToolsForwardDiffExt = "ForwardDiff"
+ RecursiveArrayToolsKernelAbstractionsExt = "KernelAbstractions"
+ RecursiveArrayToolsMeasurementsExt = "Measurements"
+ RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements"
+ RecursiveArrayToolsMooncakeExt = "Mooncake"
+ RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"]
+ RecursiveArrayToolsSparseArraysExt = ["SparseArrays"]
+ RecursiveArrayToolsStatisticsExt = "Statistics"
+ RecursiveArrayToolsStructArraysExt = "StructArrays"
+ RecursiveArrayToolsTablesExt = ["Tables"]
+ RecursiveArrayToolsTrackerExt = "Tracker"
+ RecursiveArrayToolsZygoteExt = "Zygote"
+
+ [deps.RecursiveArrayTools.weakdeps]
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
+ Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
+ MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+ StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+ Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+
+[[deps.Reexport]]
+git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b"
+uuid = "189a3867-3050-52da-a836-e630ba90ab69"
+version = "1.2.2"
+
+[[deps.RelocatableFolders]]
+deps = ["SHA", "Scratch"]
+git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864"
+uuid = "05181044-ff0b-4ac5-8273-598c1e38db00"
+version = "1.0.1"
+
+[[deps.Requires]]
+deps = ["UUIDs"]
+git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64"
+uuid = "ae029012-a4dd-5104-9daa-d747884805df"
+version = "1.3.1"
+
+[[deps.Ribasim]]
+deps = ["ADTypes", "Accessors", "BasicModelInterface", "Configurations", "DBInterface", "DataInterpolations", "DataStructures", "Dates", "DelimitedFiles", "DiffEqBase", "DiffEqCallbacks", "DifferentiationInterface", "EnumX", "FindFirstFunctions", "FiniteDiff", "ForwardDiff", "Graphs", "HiGHS", "IterTools", "JuMP", "LinearAlgebra", "LinearSolve", "Logging", "LoggingExtras", "MathOptAnalyzer", "MetaGraphsNext", "Moshi", "NCDatasets", "NaNMath", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqLowOrderRK", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqTsit5", "PrecompileTools", "Printf", "SQLite", "SciMLBase", "SciMLOperators", "SparseArrays", "SparseConnectivityTracer", "SparseMatrixColorings", "StructArrays", "Tables", "TerminalLoggers", "TranscodingStreams"]
+path = "C:\\src\\Ribasim\\irrigation\\example\\..\\..\\core"
+uuid = "aac5e3d9-0b8f-4d4f-8241-b1a7a9632635"
+version = "2026.1.2"
+
+[[deps.Rmath]]
+deps = ["Random", "Rmath_jll"]
+git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b"
+uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
+version = "0.9.0"
+
+[[deps.Rmath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8"
+uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
+version = "0.5.1+0"
+
+[[deps.Roots]]
+deps = ["Accessors", "CommonSolve", "Printf"]
+git-tree-sha1 = "46d2af536e1afe8f04cf31a59298adadf96e99e6"
+uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665"
+version = "3.0.2"
+
+ [deps.Roots.extensions]
+ RootsChainRulesCoreExt = "ChainRulesCore"
+ RootsForwardDiffExt = "ForwardDiff"
+ RootsIntervalRootFindingExt = "IntervalRootFinding"
+ RootsSymPyExt = "SymPy"
+ RootsSymPyPythonCallExt = "SymPyPythonCall"
+ RootsUnitfulExt = "Unitful"
+
+ [deps.Roots.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807"
+ SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6"
+ SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c"
+ Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
+
+[[deps.RoundingEmulator]]
+git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b"
+uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705"
+version = "0.2.1"
+
+[[deps.RuntimeGeneratedFunctions]]
+deps = ["ExprTools", "SHA", "Serialization"]
+git-tree-sha1 = "bd9d6c153d0c8a120b504bfb2f3be42308cc857a"
+uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47"
+version = "0.5.21"
+
+[[deps.SHA]]
+uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
+version = "0.7.0"
+
+[[deps.SIMD]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4"
+uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
+version = "3.7.2"
+
+[[deps.SIMDTypes]]
+git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c"
+uuid = "94e857df-77ce-4151-89e5-788b33177be4"
+version = "0.1.0"
+
+[[deps.SQLite]]
+deps = ["DBInterface", "Random", "SQLite_jll", "Serialization", "Tables", "WeakRefStrings"]
+git-tree-sha1 = "e06c74d1b23a4180c3f79a718235c8a15c165849"
+uuid = "0aa819cd-b072-5ff4-a722-6bc24af294d9"
+version = "1.8.1"
+
+[[deps.SQLite_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll", "dlfcn_win32_jll"]
+git-tree-sha1 = "324744e40b84e6dc2cfaa4122ce969a083c40a6f"
+uuid = "76ed43ae-9a5d-5a62-8c75-30186b810ce8"
+version = "3.53.2+0"
+
+[[deps.SciMLBase]]
+deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "PreallocationTools", "PrecompileTools", "Preferences", "Printf", "Random", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLLogging", "SciMLOperators", "SciMLPublic", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"]
+git-tree-sha1 = "efe313cd6ec7ec80301c889b21734ba6b062f9ee"
+uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
+version = "3.33.0"
+
+ [deps.SciMLBase.extensions]
+ SciMLBaseChainRulesCoreExt = "ChainRulesCore"
+ SciMLBaseDifferentiationInterfaceExt = "DifferentiationInterface"
+ SciMLBaseDistributionsExt = "Distributions"
+ SciMLBaseEnzymeExt = "Enzyme"
+ SciMLBaseForwardDiffExt = "ForwardDiff"
+ SciMLBaseFunctionPropertiesExt = "FunctionProperties"
+ SciMLBaseMakieExt = "Makie"
+ SciMLBaseMeasurementsExt = "Measurements"
+ SciMLBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements"
+ SciMLBaseMooncakeExt = "Mooncake"
+ SciMLBasePartialFunctionsExt = "PartialFunctions"
+ SciMLBasePyCallExt = "PyCall"
+ SciMLBasePythonCallExt = "PythonCall"
+ SciMLBaseRCallExt = "RCall"
+ SciMLBaseReverseDiffExt = "ReverseDiff"
+ SciMLBaseStaticArraysExt = "StaticArrays"
+ SciMLBaseTrackerExt = "Tracker"
+ SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"]
+
+ [deps.SciMLBase.weakdeps]
+ ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2"
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
+ Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
+ Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ FunctionProperties = "f62d2435-5019-4c03-9749-2d4c77af0cbc"
+ Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
+ Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
+ MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca"
+ Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6"
+ PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b"
+ PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0"
+ PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d"
+ RCall = "6f49c342-dc21-5d91-9882-a32aef131414"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+ Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"
+
+[[deps.SciMLJacobianOperators]]
+deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DifferentiationInterface", "FastClosures", "LinearAlgebra", "SciMLBase", "SciMLOperators"]
+git-tree-sha1 = "fcdbc0214fd43dcb9201bddda77bc4cb2ddf5da7"
+uuid = "19f34311-ddf3-4b8b-af20-060888a46c0e"
+version = "0.1.14"
+
+[[deps.SciMLLogging]]
+deps = ["Logging", "LoggingExtras", "Preferences"]
+git-tree-sha1 = "032fad418d14f5b9bad9db7f97db23514886dabc"
+uuid = "a6db7da4-7206-11f0-1eab-35f2a5dbe1d1"
+version = "2.0.1"
+
+ [deps.SciMLLogging.extensions]
+ SciMLLoggingTracyExt = "Tracy"
+
+ [deps.SciMLLogging.weakdeps]
+ Tracy = "e689c965-62c8-4b79-b2c5-8359227902fd"
+
+[[deps.SciMLOperators]]
+deps = ["Accessors", "Adapt", "ArrayInterface", "DocStringExtensions", "LinearAlgebra"]
+git-tree-sha1 = "54ac780e1be8c12ad39295b5d4dfd4b1af3685ba"
+uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"
+version = "1.24.0"
+
+ [deps.SciMLOperators.extensions]
+ SciMLOperatorsLoopVectorizationExt = "LoopVectorization"
+ SciMLOperatorsSparseArraysExt = "SparseArrays"
+ SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore"
+
+ [deps.SciMLOperators.weakdeps]
+ LoopVectorization = "bdcacae8-1622-11e9-2a5c-532679323890"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+
+[[deps.SciMLPublic]]
+git-tree-sha1 = "2b1b64add566435a768abdb3b053cac17d19ff3c"
+uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b"
+version = "1.2.1"
+
+[[deps.SciMLStructures]]
+deps = ["ArrayInterface", "PrecompileTools"]
+git-tree-sha1 = "1419128e9816e2876f7c4e93a519683b6d1d211e"
+uuid = "53ae85a6-f571-4167-b2af-e1d143709226"
+version = "1.10.1"
+
+[[deps.Scratch]]
+deps = ["Dates"]
+git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109"
+uuid = "6c6a2e73-6563-6170-7368-637461726353"
+version = "1.3.0"
+
+[[deps.Serialization]]
+uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
+version = "1.11.0"
+
+[[deps.Setfield]]
+deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"]
+git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68"
+uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46"
+version = "1.1.2"
+
+[[deps.ShaderAbstractions]]
+deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"]
+git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6"
+uuid = "65257c39-d410-5151-9873-9b3e5be5013e"
+version = "0.5.0"
+
+[[deps.SharedArrays]]
+deps = ["Distributed", "Mmap", "Random", "Serialization"]
+uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+version = "1.11.0"
+
+[[deps.SignedDistanceFields]]
+deps = ["Statistics"]
+git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92"
+uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96"
+version = "0.4.1"
+
+[[deps.SimpleNonlinearSolve]]
+deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "Setfield", "StaticArraysCore"]
+git-tree-sha1 = "72413286ef77ccacac383c5578641b99100eabd9"
+uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7"
+version = "2.12.1"
+
+ [deps.SimpleNonlinearSolve.extensions]
+ SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore"
+ SimpleNonlinearSolveReverseDiffExt = "ReverseDiff"
+ SimpleNonlinearSolveTrackerExt = "Tracker"
+
+ [deps.SimpleNonlinearSolve.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267"
+ Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c"
+
+[[deps.SimpleTraits]]
+deps = ["InteractiveUtils", "MacroTools"]
+git-tree-sha1 = "7ddb0b49c109481b046972c0e4ab02b2127d6a75"
+uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d"
+version = "0.9.6"
+
+[[deps.Sixel]]
+deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"]
+git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743"
+uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47"
+version = "0.1.5"
+
+[[deps.Sockets]]
+uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
+version = "1.11.0"
+
+[[deps.SortingAlgorithms]]
+deps = ["DataStructures"]
+git-tree-sha1 = "13cd91cc9be159e3f4d95b857fa2aa383b53772a"
+uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
+version = "1.2.3"
+
+[[deps.SparseArrays]]
+deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
+uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+version = "1.12.0"
+
+[[deps.SparseColumnPivotedQR]]
+deps = ["LinearAlgebra", "PrecompileTools", "SparseArrays"]
+git-tree-sha1 = "e408da3a280ab9033531cad1ebccbb54c81ea9c3"
+uuid = "a57abbd0-fea5-4d57-96be-5e525945e8e4"
+version = "2.1.2"
+weakdeps = ["AMD"]
+
+ [deps.SparseColumnPivotedQR.extensions]
+ SparseColumnPivotedQRAMDExt = "AMD"
+
+[[deps.SparseConnectivityTracer]]
+deps = ["ADTypes", "DocStringExtensions", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"]
+git-tree-sha1 = "ad4d1275eeb223cbd4d362563954a661fe12d2f7"
+uuid = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
+version = "1.2.2"
+
+ [deps.SparseConnectivityTracer.extensions]
+ SparseConnectivityTracerChainRulesCoreExt = "ChainRulesCore"
+ SparseConnectivityTracerLogExpFunctionsExt = "LogExpFunctions"
+ SparseConnectivityTracerNNlibExt = "NNlib"
+ SparseConnectivityTracerNaNMathExt = "NaNMath"
+ SparseConnectivityTracerSpecialFunctionsExt = "SpecialFunctions"
+
+ [deps.SparseConnectivityTracer.weakdeps]
+ ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+ LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
+ NNlib = "872c559c-99b0-510c-b3b7-b6c96a88d5cd"
+ NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
+ SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
+
+[[deps.SparseMatrixColorings]]
+deps = ["ADTypes", "DocStringExtensions", "LinearAlgebra", "PrecompileTools", "Random", "SparseArrays"]
+git-tree-sha1 = "f63d76c7b7c329cf11badd564fd8ba877b09c3fe"
+uuid = "0a514795-09f3-496d-8182-132a7b665d35"
+version = "0.4.27"
+
+ [deps.SparseMatrixColorings.extensions]
+ SparseMatrixColoringsCUDAExt = ["CUDA", "cuSPARSE"]
+ SparseMatrixColoringsCliqueTreesExt = "CliqueTrees"
+ SparseMatrixColoringsColorsExt = "Colors"
+ SparseMatrixColoringsGPUArraysExt = "GPUArrays"
+ SparseMatrixColoringsJuMPExt = ["JuMP", "MathOptInterface"]
+
+ [deps.SparseMatrixColorings.weakdeps]
+ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
+ CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8"
+ Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
+ GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7"
+ JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
+ MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"
+ cuSPARSE = "b26da814-b3bc-49ef-b0ee-c816305aa060"
+
+[[deps.SpecialFunctions]]
+deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
+git-tree-sha1 = "6547cbdd8ce32efba0d21c5a40fa96d1a3548f9f"
+uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
+version = "2.8.0"
+weakdeps = ["ChainRulesCore"]
+
+ [deps.SpecialFunctions.extensions]
+ SpecialFunctionsChainRulesCoreExt = "ChainRulesCore"
+
+[[deps.StableRNGs]]
+deps = ["Random"]
+git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc"
+uuid = "860ef19b-820b-49d6-a774-d7a799459cd3"
+version = "1.0.4"
+
+[[deps.StackViews]]
+deps = ["OffsetArrays"]
+git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621"
+uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
+version = "0.1.2"
+
+[[deps.Static]]
+deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"]
+git-tree-sha1 = "b151f033556272891e184d7d36c62518b56bbaac"
+uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3"
+version = "1.4.2"
+
+[[deps.StaticArrayInterface]]
+deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "SciMLPublic", "Static"]
+git-tree-sha1 = "2a635e15d5035c53b345077c947f31ff91744078"
+uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718"
+version = "1.10.0"
+weakdeps = ["OffsetArrays", "StaticArrays"]
+
+ [deps.StaticArrayInterface.extensions]
+ StaticArrayInterfaceOffsetArraysExt = "OffsetArrays"
+ StaticArrayInterfaceStaticArraysExt = "StaticArrays"
+
+[[deps.StaticArrays]]
+deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
+git-tree-sha1 = "246a8bb2e6667f832eea063c3a56aef96429a3db"
+uuid = "90137ffa-7385-5640-81b9-e52037218182"
+version = "1.9.18"
+weakdeps = ["ChainRulesCore", "Statistics"]
+
+ [deps.StaticArrays.extensions]
+ StaticArraysChainRulesCoreExt = "ChainRulesCore"
+ StaticArraysStatisticsExt = "Statistics"
+
+[[deps.StaticArraysCore]]
+git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a"
+uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+version = "1.4.4"
+
+[[deps.Statistics]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0"
+uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
+version = "1.11.1"
+weakdeps = ["SparseArrays"]
+
+ [deps.Statistics.extensions]
+ SparseArraysExt = ["SparseArrays"]
+
+[[deps.StatsAPI]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36"
+uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
+version = "1.8.0"
+
+[[deps.StatsBase]]
+deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
+git-tree-sha1 = "e4d7a1a0edc20af42689ea6f4f3587a2175d50ee"
+uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
+version = "0.34.12"
+
+[[deps.StatsFuns]]
+deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
+git-tree-sha1 = "770240df9a3b8888065046948f7a09b4e0f997d5"
+uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
+version = "2.2.0"
+weakdeps = ["ChainRulesCore", "InverseFunctions"]
+
+ [deps.StatsFuns.extensions]
+ StatsFunsChainRulesCoreExt = "ChainRulesCore"
+ StatsFunsInverseFunctionsExt = "InverseFunctions"
+
+[[deps.StrideArraysCore]]
+deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"]
+git-tree-sha1 = "5316097111523c9a970596a5b33cfea5f92e8581"
+uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da"
+version = "0.5.9"
+
+[[deps.StringManipulation]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "d05693d339e37d6ab134c5ab53c29fce5ee5d7d5"
+uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e"
+version = "0.4.4"
+
+[[deps.StructArrays]]
+deps = ["ConstructionBase", "DataAPI", "Tables"]
+git-tree-sha1 = "ad8002667372439f2e3611cfd14097e03fa4bccd"
+uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+version = "0.7.3"
+
+ [deps.StructArrays.extensions]
+ StructArraysAdaptExt = "Adapt"
+ StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"]
+ StructArraysLinearAlgebraExt = "LinearAlgebra"
+ StructArraysSparseArraysExt = "SparseArrays"
+ StructArraysStaticArraysExt = "StaticArrays"
+
+ [deps.StructArrays.weakdeps]
+ Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+ GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+ KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
+ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
+[[deps.StructUtils]]
+deps = ["Dates", "UUIDs"]
+git-tree-sha1 = "82bee338d650aa515f31866c460cb7e3bcef90b8"
+uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42"
+version = "2.8.2"
+
+ [deps.StructUtils.extensions]
+ StructUtilsMeasurementsExt = ["Measurements"]
+ StructUtilsStaticArraysCoreExt = ["StaticArraysCore"]
+ StructUtilsTablesExt = ["Tables"]
+
+ [deps.StructUtils.weakdeps]
+ Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7"
+ StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+ Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+
+[[deps.StyledStrings]]
+uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b"
+version = "1.11.0"
+
+[[deps.SuiteSparse]]
+deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
+uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
+
+[[deps.SuiteSparse_jll]]
+deps = ["Artifacts", "Libdl", "libblastrampoline_jll"]
+uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c"
+version = "7.8.3+2"
+
+[[deps.SymbolicIndexingInterface]]
+deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"]
+git-tree-sha1 = "d4751bc16b120dc617719f7901a3b4e69c85b7bf"
+uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5"
+version = "0.3.49"
+weakdeps = ["PrettyTables"]
+
+ [deps.SymbolicIndexingInterface.extensions]
+ SymbolicIndexingInterfacePrettyTablesExt = "PrettyTables"
+
+[[deps.TOML]]
+deps = ["Dates"]
+uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
+version = "1.0.3"
+
+[[deps.TableTraits]]
+deps = ["IteratorInterfaceExtensions"]
+git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39"
+uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c"
+version = "1.0.1"
+
+[[deps.Tables]]
+deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"]
+git-tree-sha1 = "0f38a06c83f0007bbab3cf911262841c9a0f07e0"
+uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
+version = "1.13.0"
+
+[[deps.Tar]]
+deps = ["ArgTools", "SHA"]
+uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e"
+version = "1.10.0"
+
+[[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"
+version = "1.11.0"
+
+[[deps.ThreadingUtilities]]
+deps = ["ManualMemory"]
+git-tree-sha1 = "7c73336785b21f723f5b143f6e99cf6c43b37dc1"
+uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5"
+version = "0.5.6"
+
+[[deps.TiffImages]]
+deps = ["CodecZstd", "ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"]
+git-tree-sha1 = "9ca5f1f2d42f80df4b8c9f6ab5a64f438bbd9976"
+uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
+version = "0.11.9"
+
+[[deps.TimerOutputs]]
+deps = ["ExprTools", "Printf"]
+git-tree-sha1 = "3748bd928e68c7c346b52125cf41fff0de6937d0"
+uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f"
+version = "0.5.29"
+
+ [deps.TimerOutputs.extensions]
+ FlameGraphsExt = "FlameGraphs"
+
+ [deps.TimerOutputs.weakdeps]
+ FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89"
+
+[[deps.TranscodingStreams]]
+git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
+uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
+version = "0.11.3"
+
+[[deps.TriplotBase]]
+git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b"
+uuid = "981d1d27-644d-49a2-9326-4793e63143c3"
+version = "0.1.0"
+
+[[deps.TruncatedStacktraces]]
+deps = ["InteractiveUtils", "MacroTools", "Preferences"]
+git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1"
+uuid = "781d530d-4396-4725-bb49-402e4bee1e77"
+version = "1.4.0"
+
+[[deps.UUIDs]]
+deps = ["Random", "SHA"]
+uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4"
+version = "1.11.0"
+
+[[deps.UnPack]]
+git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b"
+uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed"
+version = "1.0.2"
+
+[[deps.Unicode]]
+uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
+version = "1.11.0"
+
+[[deps.UnicodeFun]]
+deps = ["REPL"]
+git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf"
+uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1"
+version = "0.4.1"
+
+[[deps.Unitful]]
+deps = ["Dates", "LinearAlgebra", "Random"]
+git-tree-sha1 = "57e1b2c9de4bd6f40ecb9de4ac1797b81970d008"
+uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
+version = "1.28.0"
+
+ [deps.Unitful.extensions]
+ ConstructionBaseUnitfulExt = "ConstructionBase"
+ ForwardDiffExt = "ForwardDiff"
+ InverseFunctionsUnitfulExt = "InverseFunctions"
+ LatexifyExt = ["Latexify", "LaTeXStrings"]
+ NaNMathExt = "NaNMath"
+ PrintfExt = "Printf"
+
+ [deps.Unitful.weakdeps]
+ ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+ InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
+ LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
+ Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316"
+ NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3"
+ Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
+
+[[deps.WeakRefStrings]]
+deps = ["DataAPI", "InlineStrings", "Parsers"]
+git-tree-sha1 = "0716e01c3b40413de5dedbc9c5c69f27cddfddfc"
+uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
+version = "1.4.3"
+
+[[deps.WebP]]
+deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"]
+git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2"
+uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1"
+version = "0.1.3"
+
+[[deps.Wflow]]
+deps = ["Accessors", "BasicModelInterface", "CFTime", "CompositionsBase", "Dates", "DelimitedFiles", "EnumX", "FillArrays", "Glob", "Graphs", "LoggingExtras", "NCDatasets", "OrderedCollections", "Parameters", "Polyester", "ProgressLogging", "PropertyDicts", "StaticArrays", "Statistics", "TOML", "TerminalLoggers"]
+git-tree-sha1 = "bca8a9ffab8e2bc1dceec8d3ce6197cae2f57210"
+repo-rev = "ea8754e6382ffc8327929fc44b6954c6c0605b1d"
+repo-subdir = "Wflow"
+repo-url = "https://github.com/Deltares/Wflow.jl"
+uuid = "d48b7d99-76e7-47ae-b1d5-ff0c1cf9a818"
+version = "1.1.0-dev"
+
+[[deps.WoodburyMatrices]]
+deps = ["LinearAlgebra", "SparseArrays"]
+git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7"
+uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
+version = "1.1.0"
+
+[[deps.XML2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
+git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390"
+uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
+version = "2.13.9+0"
+
+[[deps.XZ_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "b29c22e245d092b8b4e8d3c09ad7baa586d9f573"
+uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
+version = "5.8.3+0"
+
+[[deps.Xorg_libX11_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
+git-tree-sha1 = "808090ede1d41644447dd5cbafced4731c56bd2f"
+uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
+version = "1.8.13+0"
+
+[[deps.Xorg_libXau_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b"
+uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
+version = "1.0.13+0"
+
+[[deps.Xorg_libXdmcp_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309"
+uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
+version = "1.1.6+0"
+
+[[deps.Xorg_libXext_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706"
+uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
+version = "1.3.8+0"
+
+[[deps.Xorg_libXfixes_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef"
+uuid = "d091e8ba-531a-589c-9de9-94069b037ed8"
+version = "6.0.2+0"
+
+[[deps.Xorg_libXrender_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d"
+uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
+version = "0.9.12+0"
+
+[[deps.Xorg_libpciaccess_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "58972370b81423fc546c56a60ed1a009450177c3"
+uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e"
+version = "0.19.0+0"
+
+[[deps.Xorg_libxcb_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"]
+git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422"
+uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
+version = "1.17.1+0"
+
+[[deps.Xorg_xtrans_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb"
+uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
+version = "1.6.0+0"
+
+[[deps.Zlib_jll]]
+deps = ["Libdl"]
+uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
+version = "1.3.1+2"
+
+[[deps.Zstd_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308"
+uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
+version = "1.5.7+1"
+
+[[deps.aws_c_auth_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_http_jll", "aws_c_sdkutils_jll"]
+git-tree-sha1 = "8cab83c96af80a1be968251ce1a0548a7545484d"
+uuid = "2b3700d1-4306-52e2-a478-c162f0c514be"
+version = "0.9.6+0"
+
+[[deps.aws_c_cal_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "22c0f42f4a1f0dc5dcfa8fd267c4ac407c455e7a"
+uuid = "70f11efc-bab2-57f1-b0f3-22aad4e67c4b"
+version = "0.9.13+0"
+
+[[deps.aws_c_common_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "a759cb9bf456ad792cc7898a81ae333cce9ef02a"
+uuid = "73048d1d-b8c4-5092-a58d-866c5e8d1e50"
+version = "0.12.6+0"
+
+[[deps.aws_c_compression_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "7910c72f45f44afd297c39fe43b99c56d5ed22ec"
+uuid = "73a04cd5-f3d7-5bac-9290-e8adb709f224"
+version = "0.3.2+0"
+
+[[deps.aws_c_http_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_compression_jll", "aws_c_io_jll"]
+git-tree-sha1 = "e358d5a001ef7afbd4f8c5225322512819cda2f2"
+uuid = "3254fc65-9028-534d-aa9d-d76d128babc6"
+version = "0.10.13+0"
+
+[[deps.aws_c_io_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_cal_jll", "aws_c_common_jll", "s2n_tls_jll"]
+git-tree-sha1 = "7e481d474b2087ee8bbf55b81bf9119f21e396d9"
+uuid = "13c41daa-f319-5298-b5eb-5754e0170d52"
+version = "0.26.3+0"
+
+[[deps.aws_c_s3_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_auth_jll", "aws_c_common_jll", "aws_c_http_jll", "aws_checksums_jll", "s2n_tls_jll"]
+git-tree-sha1 = "3e9917ab25114feba657e71be41cad068b9f6595"
+uuid = "bd1f34fb-993f-5903-a121-aaf302eed6d4"
+version = "0.11.5+0"
+
+[[deps.aws_c_sdkutils_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "c43dfba2c1ab9ea9f02f2c80e86fa16f6460244e"
+uuid = "1282aa60-004d-510b-9f52-12498d409daa"
+version = "0.2.4+1"
+
+[[deps.aws_checksums_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "aws_c_common_jll"]
+git-tree-sha1 = "2570c8e23f4771a087b12a47edcaaa670ac05a01"
+uuid = "b2a88e68-78e7-5e94-8c20-c02986ec140e"
+version = "0.2.10+0"
+
+[[deps.dlfcn_win32_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e141d67ffe550eadfb5af1bdbdaf138031e4805f"
+uuid = "c4b69c83-5512-53e3-94e6-de98773c479f"
+version = "1.4.2+0"
+
+[[deps.isoband_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c"
+uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4"
+version = "0.2.3+0"
+
+[[deps.libaec_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "60f4792734488db6f42e2c7699f1d4594780bd03"
+uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0"
+version = "1.1.7+0"
+
+[[deps.libaom_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "850b06095ee71f0135d644ffd8a52850699581ed"
+uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b"
+version = "3.13.3+0"
+
+[[deps.libass_jll]]
+deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6"
+uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0"
+version = "0.17.4+0"
+
+[[deps.libblastrampoline_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"
+version = "5.15.0+0"
+
+[[deps.libdrm_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libpciaccess_jll"]
+git-tree-sha1 = "63aac0bcb0b582e11bad965cef4a689905456c03"
+uuid = "8e53e030-5e6c-5a89-a30b-be5b7263a166"
+version = "2.4.125+1"
+
+[[deps.libfdk_aac_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df"
+uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280"
+version = "2.0.4+0"
+
+[[deps.libpng_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba"
+uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
+version = "1.6.58+0"
+
+[[deps.libsixel_jll]]
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"]
+git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a"
+uuid = "075b6546-f08a-558a-be8f-8157d0f608a5"
+version = "1.10.5+0"
+
+[[deps.libva_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "libdrm_jll"]
+git-tree-sha1 = "7dbf96baae3310fe2fa0df0ccbb3c6288d5816c9"
+uuid = "9a156e7d-b971-5f62-b2c9-67348b8fb97c"
+version = "2.23.0+0"
+
+[[deps.libvorbis_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"]
+git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5"
+uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
+version = "1.3.8+0"
+
+[[deps.libwebp_jll]]
+deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"]
+git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3"
+uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2"
+version = "1.6.0+0"
+
+[[deps.libzip_jll]]
+deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "OpenSSL_jll", "XZ_jll", "Zlib_jll", "Zstd_jll"]
+git-tree-sha1 = "86addc139bca85fdf9e7741e10977c45785727b7"
+uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1"
+version = "1.11.3+0"
+
+[[deps.mpif_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIABI_jll", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML"]
+git-tree-sha1 = "a8083ee0737c243c8f40a4ba86a0956997facb73"
+uuid = "9aeb927a-4695-514f-a259-621a69f20ec0"
+version = "0.1.7+0"
+
+[[deps.nghttp2_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
+version = "1.64.0+1"
+
+[[deps.oneTBB_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
+git-tree-sha1 = "da8c1f6eee04831f14edcfa5dae611d309807e57"
+uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e"
+version = "2022.3.0+0"
+
+[[deps.p7zip_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
+uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
+version = "17.7.0+0"
+
+[[deps.s2n_tls_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "64ae051c6f03044eb7d98027d1b552b4e21e650c"
+uuid = "cddc5d3d-934d-5d3a-9747-62fc12ea3f48"
+version = "1.7.3+0"
+
+[[deps.x264_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7"
+uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
+version = "10164.0.1+0"
+
+[[deps.x265_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3"
+uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
+version = "4.1.0+0"
diff --git a/irrigation/Project.toml b/irrigation/Project.toml
new file mode 100644
index 000000000..5857151c5
--- /dev/null
+++ b/irrigation/Project.toml
@@ -0,0 +1,10 @@
+[deps]
+CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0"
+FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
+NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab"
+Ribasim = "aac5e3d9-0b8f-4d4f-8241-b1a7a9632635"
+StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+Wflow = "d48b7d99-76e7-47ae-b1d5-ff0c1cf9a818"
+
+[sources]
+Wflow = {rev = "ea8754e6382ffc8327929fc44b6954c6c0605b1d", subdir = "Wflow", url = "https://github.com/Deltares/Wflow.jl"}
diff --git a/irrigation/README.md b/irrigation/README.md
new file mode 100644
index 000000000..0bf93f4d0
--- /dev/null
+++ b/irrigation/README.md
@@ -0,0 +1,144 @@
+# Irrigation
+
+A self-contained Julia module that wraps Wflow's SBM land-surface components (soil, interception, runoff, water demand) into a lightweight irrigation model. Designed as a prototype for coupling Wflow soil physics with an external water allocator such as Ribasim.
+
+## Structure
+
+```
+irrigation/
+├── Project.toml # Julia environment (pinned Wflow source)
+├── Manifest.toml # Exact dependency versions
+├── README.md
+├── src/
+│ ├── irrigation.jl # Irrigation module (wraps Wflow components)
+│ └── irrigation_utils.jl # Config structs, forcing, logger
+└── example/
+ ├── coupled_simulation.jl # Coupled Ribasim + irrigation run
+ ├── run_irrigation_standalone.jl # Standalone run with plots
+ ├── run_irrigation_coupled.py # Python driver: generate model + run
+ └── plot_results.py # Result visualisation
+```
+
+## Requirements
+
+- Julia ≥ 1.11
+- All dependencies (including Wflow) are pinned in `Project.toml` / `Manifest.toml` — no manual setup needed
+
+## Running the example
+
+### Standalone (no Ribasim)
+
+```
+julia irrigation/example/run_irrigation_standalone.jl
+```
+
+Activates the `irrigation` environment and runs three scenarios, writing PNG plots to the working directory:
+
+| Output file | Description |
+|---|---|
+| `single_column_no_allocation.png` | 30-day run, no irrigation |
+| `single_column_allocation.png` | 30-day run, 50% allocation |
+| `multi_column_allocation.png` | 4 cells with 100 / 75 / 25 / 0% allocation |
+
+### Coupled (with Ribasim)
+
+```
+pixi run python irrigation/example/run_irrigation_coupled.py
+```
+
+Generates the Ribasim GeoPackage model and runs `coupled_simulation.jl`, writing results to `irrigation/example/irrigation_model/coupled_irrigation.nc`.
+
+The first run downloads and precompiles dependencies (including Wflow from GitHub and CairoMakie) — this takes a few minutes. Subsequent runs are fast.
+
+## Wflow version
+
+Wflow is pinned to a specific commit on the Deltares GitHub (`ea8754e`) which contains the 1.1.0-dev API used by this module. When Wflow 1.1.0 is released to the Julia registry, the `[sources]` block in `Project.toml` can be removed and replaced with a `[compat]` bound.
+
+## Module API
+
+```julia
+include("irrigation/src/irrigation.jl")
+using .Irrigation
+
+# Initialise with default synthetic forcing (30 days)
+m = Irrigation.init()
+
+# Run without external allocation
+Irrigation.update_until!(m, 30 * m.dt)
+
+# Or step manually and inject allocation each day
+m = Irrigation.init(; n = 4) # 4 independent soil columns
+for step in 1:30
+ demand = Irrigation.get_demand(m) # [m/s], length n
+ Irrigation.set_allocated!(m, demand .* 0.5) # supply 50% of demand
+ Irrigation.update_until!(m, step * m.dt)
+end
+```
+
+### Key functions
+
+| Function | Description |
+|---|---|
+| `Irrigation.init(; forcing, n, soil_cfg, veg_cfg, irr_cfg)` | Create model with `n` independent soil columns |
+| `Irrigation.get_demand!(m)` | Compute irrigation demand [m/s] from soil moisture deficit |
+| `Irrigation.set_allocated!(m, alloc)` | Set external irrigation supply [m/s] for next timestep |
+| `Irrigation.update!(m)` | Advance model one `dt` step |
+| `Irrigation.update_until!(m, t_end)` | Advance model to time `t_end` [s] (standalone use) |
+| `Irrigation.finalize!(m, path; ...)` | Flush logger to NetCDF |
+
+### Configuration
+
+Pass keyword structs to `init()` to override defaults:
+
+```julia
+soil = Irrigation.SoilConfig(theta_s = 0.50, ksat_surface = 1e-6)
+veg = Irrigation.VegetationConfig(rooting_depth = 0.8)
+irr = Irrigation.IrrigationConfig(irrigation_efficiency = 0.9)
+m = Irrigation.init(; soil_cfg = soil, veg_cfg = veg, irr_cfg = irr)
+```
+
+## Coupling with Ribasim
+
+The module is designed so that `get_demand` / `set_allocated!` map directly to BMI `get_value` / `set_value` calls. In a coupled run Ribasim reads the demand, routes water through its network, and returns the achievable allocation (which may be less than demand).
+
+### Coupling concept
+
+Each timestep follows this update pattern:
+
+```mermaid
+sequenceDiagram
+ participant W as Irrigation module
+ participant A as Allocation (LP)
+ participant P as Physical layer (ODE)
+
+ loop every allocation timestep
+ Note over W: get_demand!() — soil state @ t-1
+ W->>A: demand [m/s] → user_demand.demand
+
+ Note over A: update_allocation!()
LP solve for t
+ A->>P: allocated flows [m³/s]
+
+ Note over P: SciMLBase.step!()
ODE water balance solve for t
+
+ P->>W: realized volumes [m³] → m/s
update_irrigation_supply!()
+ Note over W: update!() — advance soil to t
+ end
+```
+
+### Online coupling API
+
+```julia
+# initialise
+Irrigation.init()
+
+# Ribasim.solve!(model)
+ for each allocation timestep
+ Irrigation.get_demand!() # [m/s] — soil state @ t-1
+ → LP solve → ODE step
+ Irrigation.set_allocated!(realized)
+ Irrigation.update!() # advance soil to t
+ end
+
+# finalize to flush logger
+Irrigation.finalize!()
+```
diff --git a/irrigation/dependency_graph.md b/irrigation/dependency_graph.md
new file mode 100644
index 000000000..0dffef4e5
--- /dev/null
+++ b/irrigation/dependency_graph.md
@@ -0,0 +1,100 @@
+# Dependency Graph: Ribasim · Irrigation · Wflow
+
+## How Ribasim, Irrigation and Wflow share the SBM components
+
+```mermaid
+graph LR
+ subgraph WflowComponents["Wflow.jl — shared building blocks"]
+ Soil["SbmSoilModel\n+ SbmSoilParameters"]
+ Interception["GashInterceptionModel"]
+ Demand["DemandModel\n(NonPaddyModel, …)"]
+ Lateral["LateralSSF / LateralKinematic\n(subsurface + surface routing)"]
+ WflowAlloc["Wflow internal\nAllocationModel"]
+ end
+
+ subgraph WflowRun["Wflow full SBM run"]
+ WflowSolver["Wflow.run()"]
+ end
+
+ subgraph IrrigationPkg["Irrigation module"]
+ IrrigationModel["IrrigationModel\n(wraps Wflow components)"]
+ CustomWT["Custom water-table loop\n(replaces lateral flow)"]
+ ExtAlloc["ExternalIrrigationAllocation\n(stub — values set by Ribasim)"]
+ end
+
+ subgraph RibasimCore["Ribasim"]
+ Network["Network solver\n(ODE + allocation)"]
+ end
+
+ %% Wflow full run uses all components
+ WflowSolver --> Soil
+ WflowSolver --> Interception
+ WflowSolver --> Demand
+ WflowSolver --> Lateral
+ WflowSolver --> WflowAlloc
+
+ %% Irrigation reuses the vertical components, skips lateral
+ IrrigationModel --> Soil
+ IrrigationModel --> Interception
+ IrrigationModel --> Demand
+ IrrigationModel --> CustomWT
+ IrrigationModel --> ExtAlloc
+
+ %% Ribasim drives Irrigation
+ Network -->|"set allocated water [m/s]"| ExtAlloc
+ Network -->|"call get_demand! / update!"| IrrigationModel
+```
+
+**Key difference:** Wflow's full SBM run routes water laterally between cells via `LateralSSF`/kinematic wave.
+The `Irrigation` module uses the same vertical soil physics but replaces lateral flow with a single-column water-table update — because each irrigated cell is treated independently, with Ribasim handling the inter-cell water distribution.
+
+## Model parts vs. parameters
+
+### Model parts (state / behaviour)
+
+| Field | Type | Source |
+|---|---|---|
+| `soil` | `SbmSoilModel` | Wflow |
+| `interception` | `GashInterceptionModel` | Wflow |
+| `runoff` | `OpenWaterRunoff` | Wflow |
+| `demand` | `DemandModel` | Wflow |
+| `allocation` | `ExternalIrrigationAllocation` | local stub |
+| `snow` | `NoSnowModel` | Wflow |
+| `glacier` | `NoGlacierModel` | Wflow |
+| `atmospheric_forcing` | `AtmosphericForcing` | Wflow |
+
+Sub-models inside `DemandModel`:
+
+| Field | Type |
+|---|---|
+| `domestic` | `NoNonIrrigationDemandModel` |
+| `industry` | `NoNonIrrigationDemandModel` |
+| `livestock` | `NoNonIrrigationDemandModel` |
+| `paddy` | `NoIrrigationPaddyModel` |
+| `nonpaddy` | `NonPaddyModel` |
+
+### Parameter structs (configuration / static data)
+
+| Struct | Used by | Shared? |
+|---|---|---|
+| `VegetationParameters` | `SbmSoilParameters`, `GashParameters` | **yes** — single instance passed to both |
+| `SbmSoilParameters` | `SbmSoilModel` | — |
+| `KvExponential` | `SbmSoilParameters` (kv_profile field) | — |
+| `GashParameters` | `GashInterceptionModel` | — |
+| `NonPaddyParameters` | `NonPaddyModel` | — |
+| `DemandVariables` | `DemandModel` | — |
+
+### Local config structs (irrigation_utils.jl)
+
+| Struct | Purpose |
+|---|---|
+| `VegetationConfig` | User-facing vegetation defaults → mapped to `VegetationParameters` |
+| `SoilConfig` | User-facing soil defaults → mapped to `SbmSoilParameters` |
+| `IrrigationConfig` | Irrigation efficiency / max rate → mapped to `NonPaddyParameters` |
+
+## Key design notes
+
+- **Wflow** is a hard dependency of `Irrigation` — all soil/interception/demand types come from it.
+- **Ribasim** and **Irrigation** are **not coupled at the package level**. The coupling happens at runtime in `coupled_simulation.jl` by injecting three function pointers (`irr.model`, `irr.compute_demand!`, `irr.advance!`) into Ribasim's parameter struct.
+- `VegetationParameters` is created once and **shared** between `SbmSoilParameters` and `GashParameters`.
+- The custom water-table loop (per-cell `water_table_change` → `update_ustorelayerdepth!`) replaces the lateral groundwater component that a full Wflow SBM model would use.
diff --git a/irrigation/example/coupled_simulation.jl b/irrigation/example/coupled_simulation.jl
new file mode 100644
index 000000000..3a6ae0342
--- /dev/null
+++ b/irrigation/example/coupled_simulation.jl
@@ -0,0 +1,43 @@
+import Pkg
+Pkg.activate(joinpath(@__DIR__, ".."))
+Pkg.develop(; path = joinpath(@__DIR__, "..", "..", "core"))
+Pkg.instantiate()
+
+include(joinpath(@__DIR__, "..", "src", "irrigation.jl"))
+
+using Ribasim
+
+toml_path = joinpath(@__DIR__, "irrigation_model", "irrigation_model.toml")
+isfile(toml_path) || error("Model not found. Run generate_model.py first.")
+
+config = Ribasim.Config(toml_path)
+model = Ribasim.Model(config)
+
+irr = model.integrator.p.p_independent.irrigation
+isnothing(irr) && error("[experimental] irrigation = true not set in TOML.")
+isempty(irr.forcing_timestamps) && error("No irrigation forcing in GeoPackage. Run generate_model.py first.")
+
+n = length(irr.node_id)
+forcing = Irrigation.Forcing(irr.forcing_timestamps, irr.precipitation_mmday[1], irr.potential_evaporation_mmday[1])
+irr_model = Irrigation.init(; forcing, t_start = config.starttime, n)
+
+irr.model = irr_model
+irr.compute_demand! = Irrigation.get_demand!
+irr.advance! = Irrigation.update!
+
+initial_total_storage = [
+ irr_model.soil.variables.total_soil_water_storage[i] * 1.0e3 +
+ irr_model.interception.variables.canopy_storage[i] * 1.0e3
+ for i in 1:n
+]
+
+Ribasim.solve!(model)
+Ribasim.write_results(model)
+
+Irrigation.finalize!(
+ irr_model,
+ joinpath(@__DIR__, "irrigation_model", "coupled_irrigation.nc");
+ initial_total_storage,
+ ribasim_node_ids = Int32[id.value for id in irr.node_id],
+ irrigated_area_m2 = irr.irrigated_area_m2,
+)
diff --git a/irrigation/example/plot_results.py b/irrigation/example/plot_results.py
new file mode 100644
index 000000000..334cd3048
--- /dev/null
+++ b/irrigation/example/plot_results.py
@@ -0,0 +1,369 @@
+"""
+Python/matplotlib port of the ``plot_results`` function from ``run_irrigation.jl``.
+
+The function signature mirrors the Julia original:
+
+ plot_results(results, nsteps, initial_total_storage, file, *, icol=0)
+
+Parameters
+----------
+results : dict
+ Dict of 2-D numpy arrays (shape ``n x nsteps``) and a 1-D array for
+ ``rec_precip`` (shape ``nsteps``). Matches the fields of
+ ``IrrigationLogger`` in ``irrigation_utils.jl``:
+
+ rec_wt_depth, rec_sat_storage, rec_unsat_storage, rec_actual_et,
+ rec_interception, rec_infiltration, rec_infiltration_excess,
+ rec_saturated_excess, rec_net_runoff_soil, rec_storage, rec_leakage,
+ rec_demand, rec_irrigation, rec_canopy_storage,
+ rec_precip ← 1-D (uniform forcing, same for every cell)
+
+nsteps : int
+ Number of time steps that were simulated.
+initial_total_storage : float or array-like of float
+ Initial combined soil + canopy storage [mm] for each cell (or a single
+ float for the single-column case).
+file : str or Path
+ Output image path (e.g. ``"single_column_no_allocation.png"``).
+icol : int, optional
+ Zero-based column index to plot. Default 0 (first / only cell).
+"""
+
+from __future__ import annotations
+
+from pathlib import Path
+
+import matplotlib.pyplot as plt
+import netCDF4 as nc
+import numpy as np
+
+
+def read_logger(
+ path: str | Path,
+) -> tuple[dict, int, np.ndarray, np.ndarray | None, np.ndarray]:
+ """Read an ``IrrigationLogger`` NetCDF file written by ``Irrigation.finalize!``.
+
+ Returns
+ -------
+ results : dict
+ nsteps : int
+ initial_total_storage : np.ndarray shape ``(n,)``
+ ribasim_node_ids : np.ndarray or None
+ irrigated_area_m2 : np.ndarray shape ``(n,)``
+ """
+ with nc.Dataset(path, "r") as ds:
+ results = {
+ name: (
+ np.array(
+ ds[name][:]
+ ).T # Julia writes (cell, time) col-major → Python reads (time, cell); transpose back
+ if ds[name].ndim == 2
+ else np.array(ds[name][:])
+ )
+ for name in ds.variables
+ if name not in ("initial_total_storage", "ribasim_node_id")
+ }
+ initial_total_storage = np.array(ds["initial_total_storage"][:])
+ ribasim_node_ids = (
+ np.array(ds["ribasim_node_id"][:])
+ if "ribasim_node_id" in ds.variables
+ else None
+ )
+ irrigated_area_m2 = (
+ np.array(ds["irrigated_area_m2"][:])
+ if "irrigated_area_m2" in ds.variables
+ else np.ones(initial_total_storage.shape)
+ )
+ nsteps = results["rec_precip"].shape[0]
+ return results, nsteps, initial_total_storage, ribasim_node_ids, irrigated_area_m2
+
+
+def read_allocation(path: str | Path) -> dict:
+ """Read Ribasim's ``allocation.nc`` result file.
+
+ Returns a dict keyed by ``node_id`` (int), each value being a dict with:
+ - ``demand`` : np.ndarray shape ``(ntsteps,)`` [m³/s], summed over priorities
+ - ``allocated`` : np.ndarray shape ``(ntsteps,)`` [m³/s], summed over priorities
+ - ``supplied`` : np.ndarray shape ``(ntsteps,)`` [m³/s], summed over priorities
+ """
+ with nc.Dataset(path, "r") as ds:
+ node_ids = np.array(ds["node_id"][:]) # (nnodes,)
+ # Julia wrote (nprio, nnodes, ntsteps) col-major → Python reads (ntsteps, nnodes, nprio)
+ demand = np.array(ds["demand"][:])
+ allocated = np.array(ds["allocated"][:])
+ supplied = np.array(ds["supplied"][:])
+
+ # Sum over the last axis (demand_priority) to get (ntsteps, nnodes)
+ # Replace NaN (unused priority slots) with 0 before summing
+ def _sum_prio(arr):
+ arr = np.where(np.isnan(arr), 0.0, arr)
+ return arr.sum(axis=-1) # (ntsteps, nnodes)
+
+ demand_sum = _sum_prio(demand)
+ allocated_sum = _sum_prio(allocated)
+ supplied_sum = _sum_prio(supplied)
+
+ return {
+ int(node_ids[j]): {
+ "demand": demand_sum[:, j],
+ "allocated": allocated_sum[:, j],
+ "supplied": supplied_sum[:, j],
+ }
+ for j in range(len(node_ids))
+ }
+
+
+def plot_results(
+ results: dict,
+ nsteps: int,
+ initial_total_storage: float | list[float] | np.ndarray,
+ file: str | Path,
+ *,
+ icol: int = 0,
+ ribasim_node_id: int | None = None,
+ allocation: dict | None = None,
+ irrigated_area_m2: float = 1.0,
+) -> None:
+ # ── unpack logger arrays ──────────────────────────────────────────────────
+ rec_precip = np.asarray(results["rec_precip"]) # (nsteps,)
+ rec_actual_et = np.asarray(results["rec_actual_et"]) # (n, nsteps)
+ rec_interception = np.asarray(results["rec_interception"]) # (n, nsteps)
+ rec_net_runoff_soil = np.asarray(results["rec_net_runoff_soil"]) # (n, nsteps)
+ rec_storage = np.asarray(results["rec_storage"]) # (n, nsteps)
+ rec_leakage = np.asarray(results["rec_leakage"]) # (n, nsteps)
+ rec_demand = np.asarray(results["rec_demand"]) # (n, nsteps)
+ rec_irrigation = np.asarray(results["rec_irrigation"]) # (n, nsteps)
+ rec_canopy_storage = np.asarray(results["rec_canopy_storage"]) # (n, nsteps)
+ rec_wt_depth = np.asarray(results["rec_wt_depth"]) # (n, nsteps)
+
+ # column slice (Julia uses 1-based; Python uses 0-based icol)
+ rec_demand_plot = rec_demand[icol, :]
+ rec_irrigation_plot = rec_irrigation[icol, :]
+ rec_wt_depth_plot = rec_wt_depth[icol, :]
+ rec_actual_et_plot = rec_actual_et[icol, :]
+ rec_interception_plot = rec_interception[icol, :]
+ rec_net_runoff_plot = rec_net_runoff_soil[icol, :]
+ rec_storage_plot = rec_storage[icol, :]
+ rec_leakage_plot = rec_leakage[icol, :]
+ rec_canopy_storage_plot = rec_canopy_storage[icol, :]
+
+ days = np.arange(1, nsteps + 1)
+
+ # ── derived quantities ────────────────────────────────────────────────────
+ initial_storage_col = (
+ float(initial_total_storage)
+ if np.ndim(initial_total_storage) == 0
+ else np.asarray(initial_total_storage)[icol]
+ )
+
+ total_storage = rec_storage_plot + rec_canopy_storage_plot # mm
+ delta_storage = np.diff(np.concatenate([[initial_storage_col], total_storage]))
+
+ rec_total_et = rec_actual_et_plot + rec_interception_plot
+ rec_net_runoff = rec_net_runoff_plot
+
+ balance_error = (
+ (rec_precip + rec_irrigation_plot)
+ - rec_total_et
+ - rec_net_runoff
+ - rec_leakage_plot
+ - delta_storage
+ )
+ print(
+ f"\nBalance error (mm/day): "
+ f"min={balance_error.min():.3f} "
+ f"max={balance_error.max():.3f} "
+ f"mean={balance_error.mean():.3f}"
+ )
+
+ # ── stacked bar components ────────────────────────────────────────────────
+ stor_release = np.maximum(-delta_storage, 0.0)
+ stor_gain = np.maximum(delta_storage, 0.0)
+
+ # positive side (above zero)
+ pos1_top = stor_release
+ pos2_top = pos1_top + rec_precip
+ pos3_top = pos2_top + rec_irrigation_plot
+
+ # negative side (below zero)
+ neg1_bot = -rec_interception_plot
+ neg2_bot = neg1_bot - rec_actual_et_plot
+ neg3_bot = neg2_bot - rec_net_runoff
+ neg4_bot = neg3_bot - rec_leakage_plot
+ neg5_bot = neg4_bot - stor_gain
+
+ zeros = np.zeros(nsteps)
+
+ # ── figure layout ─────────────────────────────────────────────────────────
+ fig, axes = plt.subplots(4, 1, figsize=(10, 11), sharex=False)
+ fig.subplots_adjust(hspace=0.45)
+
+ # ── Panel 1: daily water budget stacked bars ──────────────────────────────
+ ax = axes[0]
+ ax.set_title("Daily water budget [+ in / - out] - land balance")
+ ax.set_xlabel("Day")
+ ax.set_ylabel("mm/day")
+ ax.set_xticks(range(1, nsteps + 1, 5))
+
+ def _bar(ax, bottom, top, color, label=None):
+ ax.bar(
+ days,
+ top - bottom,
+ bottom=bottom,
+ color=color,
+ label=label,
+ width=0.8,
+ align="center",
+ )
+
+ _bar(ax, zeros, pos1_top, (0.855, 0.647, 0.125, 0.85), "Storage release")
+ _bar(ax, pos1_top, pos2_top, (0.275, 0.510, 0.706, 0.85), "Precipitation")
+ _bar(ax, pos2_top, pos3_top, (0.118, 0.565, 1.000, 0.85), "Irrigation (external)")
+ _bar(ax, neg1_bot, zeros, (0.529, 0.808, 0.922, 0.85), "Interception ET")
+ _bar(ax, neg2_bot, neg1_bot, (0.180, 0.545, 0.341, 0.85), "Soil AET")
+ _bar(
+ ax,
+ neg3_bot,
+ neg2_bot,
+ (1.000, 0.647, 0.000, 0.85),
+ "Net runoff (infil + sat excess)",
+ )
+ _bar(ax, neg4_bot, neg3_bot, (0.576, 0.439, 0.859, 0.85), "Leakage")
+ _bar(
+ ax, neg5_bot, neg4_bot, (0.855, 0.647, 0.125, 0.85)
+ ) # stor gain (no legend entry)
+ ax.axhline(0, color="black", linewidth=1)
+ ax.legend(loc="upper left", fontsize=7)
+
+ # ── Panel 2: water table depth ────────────────────────────────────────────
+ ax2 = axes[1]
+ ax2.set_title("Water table depth below surface")
+ ax2.set_xlabel("Day")
+ ax2.set_ylabel("depth [m]")
+ ax2.set_xticks(range(1, nsteps + 1, 5))
+ ax2.invert_yaxis()
+ ax2.plot(days, rec_wt_depth_plot, color="steelblue", linewidth=2)
+ ax2.scatter(days, rec_wt_depth_plot, color="steelblue", s=5)
+
+ # ── Panel 3: irrigation demand vs allocation ───────────────────────────────
+ ax3 = axes[2]
+ ax3.set_title("Irrigation: demand vs allocation")
+ ax3.set_xlabel("Day")
+ ax3.set_ylabel("mm/day")
+ ax3.set_xticks(range(1, nsteps + 1, 5))
+ ax3.bar(
+ days,
+ rec_irrigation_plot,
+ color=(0.118, 0.565, 1.000, 0.85),
+ label="Allocation (external)",
+ width=0.8,
+ )
+ # stairs: extend last value one step, shift x by -0.5 to match Julia barplot alignment
+ stair_x = np.concatenate([days - 0.5, [nsteps + 0.5]])
+ stair_y = np.concatenate([rec_demand_plot, [rec_demand_plot[-1]]])
+ ax3.step(
+ stair_x,
+ stair_y,
+ where="post",
+ color="navy",
+ linewidth=2,
+ label="Demand (soil moisture deficit)",
+ )
+ ax3.legend(loc="upper right", fontsize=7)
+
+ # ── Panel 4: cumulative fluxes ────────────────────────────────────────────
+ ax4 = axes[3]
+ ax4.set_title("Cumulative fluxes")
+ ax4.set_xlabel("Day")
+ ax4.set_ylabel("mm")
+ ax4.set_xticks(range(1, nsteps + 1, 5))
+ ax4.plot(
+ days,
+ np.cumsum(rec_precip),
+ color="steelblue",
+ linewidth=2,
+ label="Precipitation",
+ )
+ ax4.plot(
+ days,
+ np.cumsum(rec_irrigation_plot),
+ color="dodgerblue",
+ linewidth=2,
+ label="Irrigation",
+ )
+ ax4.plot(
+ days, np.cumsum(rec_total_et), color="seagreen", linewidth=2, label="Total ET"
+ )
+ ax4.plot(
+ days, np.cumsum(rec_net_runoff), color="orange", linewidth=2, label="Net runoff"
+ )
+ ax4.plot(
+ days,
+ np.cumsum(rec_leakage_plot),
+ color="mediumpurple",
+ linewidth=2,
+ label="Leakage",
+ )
+ ax4.legend(loc="upper left", fontsize=7)
+
+ # ── Panel 5 (optional): Ribasim allocation results ────────────────────────
+ if (
+ allocation is not None
+ and ribasim_node_id is not None
+ and ribasim_node_id in allocation
+ ):
+ fig.set_size_inches(10, 14) # taller to fit 5th panel
+ ax5 = fig.add_subplot(5, 1, 5)
+ # reposition existing axes to fit 5 panels
+ for i, ax in enumerate(axes):
+ ax.set_position([0.125, 0.79 - i * 0.185, 0.775, 0.15])
+ ax5.set_position([0.125, 0.79 - 4 * 0.185, 0.775, 0.15])
+
+ node_data = allocation[ribasim_node_id]
+ # convert m³/s → mm/day
+ area = irrigated_area_m2 if irrigated_area_m2 > 0 else 1.0
+ to_mm_day = 1000.0 * 86400.0 / area
+ alloc_days = np.arange(1, len(node_data["demand"]) + 1)
+ ax5.set_title(f"Ribasim allocation — UserDemand node {ribasim_node_id}")
+ ax5.set_xlabel("Day")
+ ax5.set_ylabel("mm/day")
+ ax5.set_xticks(range(1, nsteps + 1, 5))
+
+ supplied_mm = node_data["supplied"] * to_mm_day
+ demand_mm = node_data["demand"] * to_mm_day
+ allocated_mm = node_data["allocated"] * to_mm_day
+
+ # bar: supplied (matches the allocation bar in panel 3)
+ ax5.bar(
+ alloc_days,
+ supplied_mm,
+ color=(0.118, 0.565, 1.000, 0.85),
+ width=0.8,
+ label="Supplied",
+ )
+
+ # stepped lines: demand and allocated
+ stair_x = np.concatenate([alloc_days - 0.5, [len(alloc_days) + 0.5]])
+ ax5.step(
+ stair_x,
+ np.concatenate([demand_mm, [demand_mm[-1]]]),
+ where="post",
+ color="navy",
+ linewidth=2,
+ label="Demand",
+ )
+ ax5.step(
+ stair_x,
+ np.concatenate([allocated_mm, [allocated_mm[-1]]]),
+ where="post",
+ color="dodgerblue",
+ linewidth=1.5,
+ linestyle="--",
+ label="Allocated",
+ )
+
+ ax5.legend(loc="upper right", fontsize=7)
+
+ fig.savefig(file, dpi=150, bbox_inches="tight")
+ plt.close(fig)
+ print(f"Plot saved to: {Path(file).resolve()}")
diff --git a/irrigation/example/run_irrigation_coupled.py b/irrigation/example/run_irrigation_coupled.py
new file mode 100644
index 000000000..970ea742b
--- /dev/null
+++ b/irrigation/example/run_irrigation_coupled.py
@@ -0,0 +1,131 @@
+"""
+Generate the Ribasim irrigation coupling example model.
+
+Starts from the standard ``allocation_example_model`` (two basins, two
+UserDemand nodes, a LinearResistance connector, and a TabulatedRatingCurve
+outlet) and enables the irrigation coupling flag so the Julia side knows to
+wire in the Wflow soil model.
+
+Topology (from the allocation docs example)::
+
+ FlowBoundary 1 ─► Basin 2 ─► UserDemand 3 (priority 1)
+ └► LinearResistance 4 ─► Basin 5 ─► UserDemand 6 (priority 3)
+ └► TabulatedRatingCurve 7 ─► Terminal 8
+
+The model runs for 30 days (2020-01-01 to 2020-01-31) to match the 30-day
+default synthetic forcing of the irrigation module.
+
+Run from the repo root::
+
+ pixi run python irrigation/example/generate_model.py
+"""
+
+import subprocess
+import sys
+from datetime import datetime, timedelta
+from pathlib import Path
+
+import pandas as pd
+from ribasim.config import Allocation, Experimental
+from ribasim_testmodels import allocation_example_model
+
+sys.path.insert(0, str(Path(__file__).parent))
+from plot_results import plot_results, read_allocation, read_logger
+
+sys.path.insert(0, str(Path(__file__).parent))
+
+OUT_DIR = Path(__file__).parent / "irrigation_model" / "irrigation_model.toml"
+
+# ───────────────────────────────────────────────────────────────────────────
+model = allocation_example_model()
+
+# Extend to 30 days so it matches the irrigation module default forcing length
+model.endtime = datetime(2020, 1, 31)
+
+# Run allocation every day to match the soil model's daily timestep
+model.allocation = Allocation(dt=86400.0)
+
+# Enable irrigation coupling (keeps allocation=True and concentration=True from the base model)
+model.experimental = Experimental(
+ allocation=True,
+ concentration=True,
+ irrigation=True,
+)
+
+# ── Irrigation soil model inputs ──────────────────────────────────────────────
+# Irrigated area per UserDemand node [m²] — 10 km² creates realistic demand vs 2 m³/s supply
+IRRIGATED_AREA_M2 = 1e7
+user_demand_node_ids = list(model.user_demand.node.df.index)
+
+model.user_demand.irrigation_static.df = pd.DataFrame(
+ {
+ "node_id": user_demand_node_ids,
+ "irrigated_area_m2": [IRRIGATED_AREA_M2] * len(user_demand_node_ids),
+ }
+)
+
+# 30-day synthetic forcing matching Irrigation.default_forcing():
+# precipitation : 1 mm/day for days 1-15, 30 mm/day for days 16-30
+# potential ET : 6 mm/day for days 1-15, 0 mm/day for days 16-30
+timestamps = [model.starttime + timedelta(days=i) for i in range(1, 31)]
+precip = [1.0] * 15 + [30.0] * 15
+pet = [6.0] * 15 + [0.0] * 15
+
+rows = []
+for node_id in user_demand_node_ids:
+ for t, p, e in zip(timestamps, precip, pet, strict=True):
+ rows.append(
+ {
+ "node_id": node_id,
+ "time": t,
+ "precipitation": p,
+ "potential_evaporation": e,
+ }
+ )
+model.user_demand.irrigation_forcing.df = pd.DataFrame(rows)
+
+# ───────────────────────────────────────────────────────────────────────────
+OUT_DIR.parent.mkdir(exist_ok=True)
+model.write(OUT_DIR)
+print(f"Model written to: {OUT_DIR.resolve()}")
+print(f"UserDemand nodes: {list(model.user_demand.node.df.index)}")
+
+# ── Run the coupled Julia simulation ──────────────────────────────────────────
+REPO_ROOT = Path(__file__).parent.parent.parent
+coupled_script = Path(__file__).parent / "coupled_irrigation.jl"
+print("\nRunning coupled_irrigation.jl …")
+result = subprocess.run(
+ ["julia", f"--project={Path(__file__).parent.parent}", str(coupled_script)],
+ cwd=REPO_ROOT,
+)
+if result.returncode != 0:
+ print("coupled_irrigation.jl failed — skipping plots.")
+ sys.exit(result.returncode)
+
+# ── Plot irrigation results ───────────────────────────────────────────────────
+NC_DIR = OUT_DIR.parent
+nc_path = NC_DIR / "coupled_irrigation.nc"
+allocation_nc = NC_DIR / "results" / "allocation.nc"
+
+if nc_path.exists():
+ results, nsteps, initial_total_storage, ribasim_node_ids, irrigated_area_m2 = (
+ read_logger(nc_path)
+ )
+ allocation = read_allocation(allocation_nc) if allocation_nc.exists() else None
+ if allocation is None:
+ print("No allocation.nc found — plotting without Ribasim network results.")
+ n_cols = results["rec_demand"].shape[0]
+ for icol in range(n_cols):
+ node_id = int(ribasim_node_ids[icol]) if ribasim_node_ids is not None else None
+ plot_results(
+ results,
+ nsteps,
+ initial_total_storage,
+ NC_DIR / f"coupled_irrigation_col{icol}.png",
+ icol=icol,
+ ribasim_node_id=node_id,
+ allocation=allocation,
+ irrigated_area_m2=float(irrigated_area_m2[icol]),
+ )
+else:
+ print(f"Skipping plot — {nc_path} not found.")
diff --git a/irrigation/example/run_irrigation_standalone.jl b/irrigation/example/run_irrigation_standalone.jl
new file mode 100644
index 000000000..ee628d337
--- /dev/null
+++ b/irrigation/example/run_irrigation_standalone.jl
@@ -0,0 +1,317 @@
+import Pkg
+Pkg.activate(joinpath(@__DIR__, ".."))
+Pkg.instantiate()
+
+include("../src/irrigation.jl")
+using CairoMakie
+
+function plot_results(
+ results,
+ nsteps::Int,
+ initial_total_storage::Union{Float64, Vector{Float64}},
+ file::String;
+ icol::Int = 1,
+ )
+ initial_storage_col =
+ isa(initial_total_storage, Float64) ? initial_total_storage :
+ initial_total_storage[icol]
+ (;
+ rec_wt_depth,
+ rec_sat_storage,
+ rec_unsat_storage,
+ rec_actual_et,
+ rec_interception,
+ rec_infiltration,
+ rec_infiltration_excess,
+ rec_saturated_excess,
+ rec_net_runoff_soil,
+ rec_storage,
+ rec_leakage,
+ rec_demand,
+ rec_irrigation,
+ rec_canopy_storage,
+ rec_precip,
+ ) = results
+
+ rec_demand_plot = rec_demand[icol, :]
+ rec_irrigation_plot = rec_irrigation[icol, :]
+ rec_wt_depth_plot = rec_wt_depth[icol, :]
+ rec_actual_et_plot = rec_actual_et[icol, :]
+ rec_interception_plot = rec_interception[icol, :]
+ rec_net_runoff_plot = rec_net_runoff_soil[icol, :]
+ rec_storage_plot = rec_storage[icol, :]
+ rec_leakage_plot = rec_leakage[icol, :]
+ rec_canopy_storage_plot = rec_canopy_storage[icol, :]
+
+ days = collect(1:nsteps)
+
+ # Storage change: soil + canopy [mm/day]
+ total_storage = rec_storage_plot .+ rec_canopy_storage_plot # mm
+ Δstorage = diff([initial_storage_col; total_storage])
+
+ # Total ET (soil AET + interception ET)
+ rec_total_et = rec_actual_et_plot .+ rec_interception_plot
+
+ rec_net_runoff = rec_net_runoff_plot
+
+ # Balance error
+ balance_error =
+ (rec_precip .+ rec_irrigation_plot) .- rec_total_et .- rec_net_runoff .-
+ rec_leakage_plot .- Δstorage
+ println(
+ "\nBalance error (mm/day): min=$(round(minimum(balance_error), digits = 3)) max=$(round(maximum(balance_error), digits = 3)) mean=$(round(sum(balance_error) / nsteps, digits = 3))",
+ )
+
+ # Decompose storage change into release (positive) and gain (negative)
+ stor_release = max.(-Δstorage, 0.0) # storage releasing water → positive contribution
+ stor_gain = max.(Δstorage, 0.0) # storage gaining water → negative contribution
+
+ # Positive side (above zero): storage release, then precipitation, then irrigation on top
+ pos1_top = stor_release
+ pos2_top = stor_release .+ rec_precip
+ pos3_top = pos2_top .+ rec_irrigation_plot
+
+ # Negative side (below zero): interception ET | soil AET | infil excess | sat excess | leakage | stor gain
+ neg1_bot = .-rec_interception_plot
+ neg2_bot = neg1_bot .- rec_actual_et_plot
+ neg3_bot = neg2_bot .- rec_net_runoff
+ neg4_bot = neg3_bot .- rec_leakage_plot
+ neg5_bot = neg4_bot .- stor_gain
+
+ fig = Figure(; size = (1000, 1100))
+ ax = Axis(
+ fig[1, 1];
+ title = "Daily water budget [+ in / − out] — land balance (mass_balance.jl)",
+ xlabel = "Day",
+ ylabel = "mm/day",
+ xticks = 1:5:nsteps,
+ )
+
+ # Positive bars (stacked upward)
+ barplot!(
+ ax,
+ days,
+ pos1_top;
+ fillto = zeros(nsteps),
+ color = (:goldenrod, 0.85),
+ label = "Storage release",
+ )
+ barplot!(
+ ax,
+ days,
+ pos2_top;
+ fillto = pos1_top,
+ color = (:steelblue, 0.85),
+ label = "Precipitation",
+ )
+ barplot!(
+ ax,
+ days,
+ pos3_top;
+ fillto = pos2_top,
+ color = (:dodgerblue, 0.85),
+ label = "Irrigation (external)",
+ )
+
+ # Negative bars (stacked downward)
+ barplot!(
+ ax,
+ days,
+ neg1_bot;
+ fillto = zeros(nsteps),
+ color = (:skyblue, 0.85),
+ label = "Interception ET",
+ )
+ barplot!(
+ ax,
+ days,
+ neg2_bot;
+ fillto = neg1_bot,
+ color = (:seagreen, 0.85),
+ label = "Soil AET",
+ )
+ barplot!(
+ ax,
+ days,
+ neg3_bot;
+ fillto = neg2_bot,
+ color = (:orange, 0.85),
+ label = "Net runoff (infil + sat excess)",
+ )
+ barplot!(
+ ax,
+ days,
+ neg4_bot;
+ fillto = neg3_bot,
+ color = (:mediumpurple, 0.85),
+ label = "Leakage",
+ )
+ barplot!(
+ ax,
+ days,
+ neg5_bot;
+ fillto = neg4_bot,
+ color = (:goldenrod, 0.85),
+ label = nothing,
+ )
+
+ hlines!(ax, [0]; color = :black, linewidth = 1)
+ axislegend(ax; position = :lt)
+
+ # ── Panel 2: water table depth ────────────────────────────────────────────────
+ ax2 = Axis(
+ fig[2, 1];
+ title = "Water table depth below surface",
+ xlabel = "Day",
+ ylabel = "depth [m]",
+ xticks = 1:5:nsteps,
+ yreversed = true,
+ )
+ lines!(ax2, days, rec_wt_depth_plot; color = :steelblue, linewidth = 2)
+ scatter!(ax2, days, rec_wt_depth_plot; color = :steelblue, markersize = 5)
+
+ # ── Panel 3: irrigation demand vs allocation ───────────────────────────────────
+ # demand = rec_demand (soil-moisture-deficit driven, from NonPaddyModel) [mm/day]
+ # allocation = rec_irrigation = fraction_realised × demand (external supply, e.g. Ribasim)
+ # In a real coupling, Ribasim reads demand via BMI get_value, routes water through its
+ # network, and returns the achievable allocation which may be < demand.
+ ax3 = Axis(
+ fig[3, 1];
+ title = "Irrigation: demand vs allocation",
+ xlabel = "Day",
+ ylabel = "mm/day",
+ xticks = 1:5:nsteps,
+ )
+ barplot!(
+ ax3,
+ days,
+ rec_irrigation_plot;
+ color = (:dodgerblue, 0.85),
+ label = "Allocation (external)",
+ )
+ stairs!(
+ ax3,
+ [days; nsteps + 1] .- 0.5,
+ [rec_demand_plot; rec_demand_plot[end]];
+ color = :navy,
+ linewidth = 2,
+ step = :post,
+ label = "Demand (soil moisture deficit)",
+ )
+ axislegend(ax3; position = :rt)
+
+ # ── Panel 4: cumulative water budget ──────────────────────────────────────────
+ ax4 = Axis(
+ fig[4, 1];
+ title = "Cumulative fluxes",
+ xlabel = "Day",
+ ylabel = "mm",
+ xticks = 1:5:nsteps,
+ )
+ lines!(
+ ax4,
+ days,
+ cumsum(rec_precip);
+ color = :steelblue,
+ linewidth = 2,
+ label = "Precipitation",
+ )
+ lines!(
+ ax4,
+ days,
+ cumsum(rec_irrigation_plot);
+ color = :dodgerblue,
+ linewidth = 2,
+ label = "Irrigation",
+ )
+ lines!(
+ ax4,
+ days,
+ cumsum(rec_total_et);
+ color = :seagreen,
+ linewidth = 2,
+ label = "Total ET",
+ )
+ lines!(
+ ax4,
+ days,
+ cumsum(rec_net_runoff);
+ color = :orange,
+ linewidth = 2,
+ label = "Net runoff",
+ )
+ lines!(
+ ax4,
+ days,
+ cumsum(rec_leakage_plot);
+ color = :mediumpurple,
+ linewidth = 2,
+ label = "Leakage",
+ )
+ axislegend(ax4; position = :lt)
+ save(file, fig)
+ return println("Plot saved to: $file")
+end
+
+# -- inputs --------------------------------------------------------------------
+forcing = Irrigation.default_forcing() # 30-day synthetic series, edit or replace
+
+# -- run simulation without allocation -----------------------------------------
+m = Irrigation.init(; forcing)
+
+# read initial storage before any update
+initial_total_storage =
+ m.soil.variables.total_soil_water_storage[1] * 1.0e3 +
+ m.interception.variables.canopy_storage[1] * 1.0e3 # mm
+
+# runs full simulation at ones for reference, without any allocation
+nsteps = length(forcing.timestamps)
+Irrigation.update_until!(m, nsteps * m.dt)
+plot_results(m.logger, nsteps, initial_total_storage, joinpath(@__DIR__, "single_column_no_allocation.png"))
+Irrigation.finalize!(m, joinpath(@__DIR__, "single_column_no_allocation.nc"); initial_total_storage)
+
+# -- run simulation with allocation --------------------------------------------
+m = Irrigation.init(; forcing)
+
+# read initial storage before any update
+initial_total_storage =
+ m.soil.variables.total_soil_water_storage[1] * 1.0e3 +
+ m.interception.variables.canopy_storage[1] * 1.0e3 # mm
+
+nsteps = length(forcing.timestamps)
+for step in 1:nsteps
+ demand = Irrigation.get_demand!(m)
+ Irrigation.set_allocated!(m, demand .* 0.5) # 50% reduction
+ print(step, step * m.dt)
+ Irrigation.update_until!(m, step * m.dt)
+end
+plot_results(m.logger, nsteps, initial_total_storage, joinpath(@__DIR__, "single_column_allocation.png"))
+Irrigation.finalize!(m, joinpath(@__DIR__, "single_column_allocation.nc"); initial_total_storage)
+
+# -- run multi column simulation with allocation --------------------------------
+m = Irrigation.init(; forcing, n = 4)
+
+# read initial storage before any update — one value per cell (all identical at init)
+initial_total_storage_multicol = [
+ m.soil.variables.total_soil_water_storage[icol] * 1.0e3 +
+ m.interception.variables.canopy_storage[icol] * 1.0e3 for icol in 1:4
+]
+
+nsteps = length(forcing.timestamps)
+fraction_realised = [1.0, 0.75, 0.25, 0.0]
+for step in 1:nsteps
+ demand = Irrigation.get_demand!(m)
+ Irrigation.set_allocated!(m, demand .* fraction_realised)
+ print(step, step * m.dt)
+ Irrigation.update_until!(m, step * m.dt)
+end
+for icol in 1:4
+ plot_results(
+ m.logger,
+ nsteps,
+ initial_total_storage_multicol,
+ joinpath(@__DIR__, "multi_column_col$(icol).png");
+ icol,
+ )
+end
+Irrigation.finalize!(m, joinpath(@__DIR__, "multi_column.nc"); initial_total_storage = initial_total_storage_multicol)
diff --git a/irrigation/src/irrigation.jl b/irrigation/src/irrigation.jl
new file mode 100644
index 000000000..4840133f7
--- /dev/null
+++ b/irrigation/src/irrigation.jl
@@ -0,0 +1,378 @@
+module Irrigation
+
+using Dates
+using NCDatasets
+using Wflow
+using StaticArrays: SVector
+using FillArrays
+
+include("irrigation_utils.jl")
+
+# ── Allocation stub ────────────────────────────────────────────────────────────
+struct ExternalIrrigationAllocation <: Wflow.AbstractAllocationModel
+ n::Int
+ irrigation_allocation::Vector{Float64} # [m/s], set externally each step
+end
+ExternalIrrigationAllocation(n::Int) = ExternalIrrigationAllocation(n, zeros(n))
+Wflow.get_irrigation_allocated(a::ExternalIrrigationAllocation) = a.irrigation_allocation
+Wflow.get_groundwater_abstraction_flux(a::ExternalIrrigationAllocation) =
+ FillArrays.Zeros(a.n)
+
+# ── State struct ───────────────────────────────────────────────────────────────
+mutable struct IrrigationModel
+ n::Int
+ # Wflow components (unpacked for direct access)
+ soil::Wflow.SbmSoilModel
+ interception::Wflow.GashInterceptionModel
+ runoff::Wflow.OpenWaterRunoff
+ demand::Wflow.DemandModel
+ allocation::ExternalIrrigationAllocation
+ atmospheric_forcing::Wflow.AtmosphericForcing
+ snow::Wflow.NoSnowModel
+ glacier::Wflow.NoGlacierModel
+ config::Wflow.Config
+ exfiltwater_average::Vector{Float64}
+ # Forcing
+ forcing::Forcing
+ t_start::DateTime
+ irr_config::IrrigationConfig
+ dt::Float64
+ # Clock
+ tcurrent::Float64 # seconds elapsed since t_start
+ # Logger
+ logger::IrrigationLogger
+end
+
+# ── init ───────────────────────────────────────────────────────────────────────
+function init(;
+ forcing::Forcing = default_forcing(),
+ t_start::DateTime = forcing.timestamps[1] - Day(1),
+ dt::Float64 = 86400.0,
+ n::Int = 1,
+ soil_cfg::SoilConfig = SoilConfig(),
+ veg_cfg::VegetationConfig = VegetationConfig(),
+ irr_cfg::IrrigationConfig = IrrigationConfig(),
+ )
+ sc = soil_cfg
+ vc = veg_cfg
+ ic = irr_cfg
+
+ N = length(sc.layer_thickness)
+ cumulative_depth = SVector(0.0, cumsum(sc.layer_thickness)...)
+ soil_thickness = sum(sc.layer_thickness)
+ brooks_corey_exp = SVector(ntuple(_ -> sc.brooks_corey_exponent, N)...)
+ kv_factor_vec = SVector(ntuple(_ -> sc.kv_factor, N)...)
+
+ atmospheric_forcing = Wflow.AtmosphericForcing(; n)
+
+ vegetation_parameters = Wflow.VegetationParameters(;
+ leaf_area_index = nothing,
+ canopy_gap_fraction = fill(vc.canopy_gap_fraction, n),
+ maximum_canopy_storage = fill(vc.maximum_canopy_storage, n),
+ rooting_depth = fill(vc.rooting_depth, n),
+ crop_coefficient = fill(vc.crop_coefficient, n),
+ )
+
+ interception = Wflow.GashInterceptionModel(;
+ n,
+ parameters = Wflow.GashParameters(;
+ evaporation_to_precipitation_ratio = fill(
+ vc.evaporation_to_precipitation_ratio,
+ n,
+ ),
+ vegetation_parameter_set = vegetation_parameters,
+ ),
+ )
+
+ snow = Wflow.NoSnowModel(n)
+ glacier = Wflow.NoGlacierModel(n)
+ runoff = Wflow.OpenWaterRunoff(; n)
+
+ soil_parameters = Wflow.SbmSoilParameters(;
+ maximum_number_of_layers = N,
+ number_of_layers = fill(N, n),
+ vegetation_parameter_set = vegetation_parameters,
+ kv_profile = Wflow.KvExponential(fill(sc.ksat_surface, n), fill(sc.ksat_decay, n)),
+ theta_s = fill(sc.theta_s, n),
+ theta_r = fill(sc.theta_r, n),
+ theta_fc = fill(sc.theta_fc, n),
+ soil_water_capacity = fill((sc.theta_s - sc.theta_r) * soil_thickness, n),
+ soil_thickness = fill(soil_thickness, n),
+ actual_layer_thickness = fill(sc.layer_thickness, n),
+ cumulative_layer_depth = fill(cumulative_depth, n),
+ air_entry_pressure = fill(sc.air_entry_pressure, n),
+ brooks_corey_exponent = fill(brooks_corey_exp, n),
+ vertical_hydraulic_conductivity_factor = fill(kv_factor_vec, n),
+ rootfraction = fill(sc.rootfraction, n),
+ infiltration_capacity_compacted_soil = fill(sc.infiltration_capacity_compacted, n),
+ infiltration_capacity_soil = fill(sc.infiltration_capacity_soil, n),
+ maximum_leakage = fill(sc.maximum_leakage, n),
+ cap_hmax = fill(sc.cap_hmax, n),
+ cap_n = fill(sc.cap_n, n),
+ w_soil = fill(sc.w_soil, n),
+ cf_soil = fill(sc.cf_soil, n),
+ compacted_soil_area_fraction = fill(sc.compacted_area_fraction, n),
+ wet_root_distribution_parameter = fill(sc.wet_root_distribution_parameter, n),
+ h1 = fill(sc.h1, n),
+ h2 = fill(sc.h2, n),
+ h3_high = fill(sc.h3_high, n),
+ h3_low = fill(sc.h3_low, n),
+ h4 = fill(sc.h4, n),
+ alpha_h1 = fill(sc.alpha_h1, n),
+ soil_fraction = fill(sc.soil_fraction, n),
+ )
+
+ soil = Wflow.SbmSoilModel(;
+ n,
+ parameters = soil_parameters,
+ variables = Wflow.SbmSoilVariables(n, soil_parameters),
+ )
+
+ demand = Wflow.DemandModel(;
+ domestic = Wflow.NoNonIrrigationDemandModel(n),
+ industry = Wflow.NoNonIrrigationDemandModel(n),
+ livestock = Wflow.NoNonIrrigationDemandModel(n),
+ paddy = Wflow.NoIrrigationPaddyModel(n),
+ nonpaddy = Wflow.NonPaddyModel(;
+ n,
+ parameters = Wflow.NonPaddyParameters(;
+ irrigation_efficiency = fill(ic.irrigation_efficiency, n),
+ maximum_irrigation_rate = fill(ic.maximum_irrigation_rate, n),
+ irrigation_areas = fill(true, n),
+ irrigation_trigger = fill(true, n),
+ ),
+ ),
+ variables = Wflow.DemandVariables(; n),
+ )
+
+ allocation = ExternalIrrigationAllocation(n)
+
+ fill!(runoff.variables.runoff_river, 0.0)
+ fill!(runoff.variables.runoff_land, 0.0)
+ fill!(runoff.variables.actual_open_water_evaporation_land, 0.0)
+ fill!(runoff.variables.actual_open_water_evaporation_river, 0.0)
+ fill!(runoff.variables.net_runoff_river, 0.0)
+
+ config = Wflow.Config(
+ Dict{String, Any}(
+ "path" => "",
+ "model" => Dict{String, Any}(
+ "type" => "sbm",
+ "snow__flag" => false,
+ "soil_infiltration_reduction__flag" => false,
+ ),
+ "input" => Dict{String, Any}(
+ "path_forcing" => "",
+ "path_static" => "",
+ "basin__local_drain_direction" => "",
+ "river_location__mask" => "",
+ "subbasin_location__count" => "",
+ "forcing" => Dict{String, Any}(),
+ "static" => Dict{String, Any}(),
+ ),
+ );
+ path = "",
+ )
+
+ nsteps = length(forcing.timestamps)
+ println("Irrigation model initialised.")
+
+ return IrrigationModel(
+ n,
+ soil,
+ interception,
+ runoff,
+ demand,
+ allocation,
+ atmospheric_forcing,
+ snow,
+ glacier,
+ config,
+ zeros(n), # exfiltwater_average
+ forcing,
+ t_start,
+ irr_cfg,
+ dt,
+ 0.0, # tcurrent [s]
+ IrrigationLogger(n, nsteps),
+ )
+end
+
+# ── update! ────────────────────────────────────────────────────────────────────
+function update!(m::IrrigationModel)
+ (;
+ soil,
+ interception,
+ runoff,
+ demand,
+ allocation,
+ atmospheric_forcing,
+ snow,
+ glacier,
+ config,
+ exfiltwater_average,
+ forcing,
+ t_start,
+ dt,
+ ) = m
+
+ # derive current DateTime (right-labelled: end of the interval being computed)
+ t_now = t_start + Second(round(Int, m.tcurrent + dt))
+ step = searchsortedfirst(forcing.timestamps, t_now) # logger index
+ precip_mmday, pet_mmday = get_forcing(forcing, t_now)
+
+ dummy_subsurface = (; variables = (; exfiltwater_average))
+
+ fill!(atmospheric_forcing.precipitation, precip_mmday * 1.0e-3 / dt)
+ fill!(atmospheric_forcing.potential_evaporation, pet_mmday * 1.0e-3 / dt)
+ fill!(atmospheric_forcing.temperature, 283.15)
+
+ Wflow.update_interception_model!(interception, atmospheric_forcing, dt)
+
+ Wflow.get_water_flux_surface!(
+ runoff.boundary_conditions.water_flux_surface,
+ snow,
+ glacier,
+ interception,
+ )
+
+ Wflow.update_bc_soil_model!(
+ soil,
+ atmospheric_forcing,
+ (; interception, runoff, demand, allocation),
+ dt,
+ )
+
+ Wflow.update_soil_water_flow!(
+ soil,
+ atmospheric_forcing,
+ (; snow, runoff, demand),
+ config,
+ dt,
+ )
+
+ for cell_idx in 1:m.n
+ zi_prev = soil.variables.water_table_depth[cell_idx]
+ net_flux = soil.variables.recharge[cell_idx]
+ specific_yield = Wflow.lower_bound_drainable_porosity(
+ soil.parameters.theta_s[cell_idx],
+ soil.parameters.theta_fc[cell_idx],
+ )
+ dh, exfilt = Wflow.water_table_change(soil, net_flux, specific_yield, cell_idx, dt)
+ new_wt_depth = clamp(zi_prev - dh, 0.0, soil.parameters.soil_thickness[cell_idx])
+ Wflow.update_ustorelayerdepth!(soil, zi_prev, new_wt_depth, cell_idx)
+ exfiltwater_average[cell_idx] = exfilt
+ end
+
+ Wflow.update_soil_water_storage!(
+ soil,
+ (; runoff, demand, subsurface_flow = dummy_subsurface),
+ dt,
+ )
+
+ log!(m.logger, step, soil, interception, demand, allocation, precip_mmday, dt)
+
+ @. soil.variables.actual_evapotranspiration += interception.variables.interception_rate
+
+ return m.tcurrent += dt
+end
+
+# ── update_until! ──────────────────────────────────────────────────────────────
+function update_until!(m::IrrigationModel, t_end::Float64)
+ while m.tcurrent < t_end - 0.5 * m.dt
+ update!(m)
+ end
+ return
+end
+
+# ── public API ─────────────────────────────────────────────────────────────────
+function get_demand!(m::IrrigationModel)
+ Wflow.update_water_demand_model!(m.demand, m.soil, m.dt)
+ return m.demand.nonpaddy.variables.demand_gross
+end
+
+function set_allocated!(m::IrrigationModel, allocation::AbstractVector{Float64})
+ return m.allocation.irrigation_allocation .= allocation
+end
+
+# ── finalize! ──────────────────────────────────────────────────────────────────
+"""
+ finalize!(m, path; initial_total_storage)
+
+Write `m.logger` to a NetCDF file at `path` so Python (or any other tool) can
+read and plot the results without a live Julia session.
+
+Dimensions
+- `cell` : cell index (0-based integer, length `n`)
+- `time` : time-step index (1-based integer, length `nsteps`)
+
+Variables
+- `rec_precip` : `(time,)` — uniform precipitation forcing [mm/day]
+- all other `rec_*` fields : `(cell, time)` — per-cell per-step values [mm/day or m]
+- `initial_total_storage` : `(cell,)` — soil+canopy storage at t=0 [mm]
+"""
+function finalize!(
+ m::IrrigationModel,
+ path::AbstractString;
+ initial_total_storage::Union{Float64, Vector{Float64}} = zeros(m.n),
+ ribasim_node_ids::Vector{Int32} = Int32[],
+ irrigated_area_m2::Vector{Float64} = ones(m.n),
+ )
+ logger = m.logger
+ n = m.n
+ nsteps = length(logger.rec_precip)
+
+ NCDataset(path, "c") do ds
+ defDim(ds, "cell", n)
+ defDim(ds, "time", nsteps)
+
+ # 1-D forcing (same for all cells)
+ v = defVar(ds, "rec_precip", Float64, ("time",); attrib = ["units" => "mm/day"])
+ v[:] = logger.rec_precip
+
+ # initial storage per cell
+ v = defVar(ds, "initial_total_storage", Float64, ("cell",); attrib = ["units" => "mm"])
+ v[:] = isa(initial_total_storage, Float64) ? fill(initial_total_storage, n) : initial_total_storage
+
+ # 2-D per-cell variables (cell × time)
+ matrix_vars = [
+ ("rec_wt_depth", logger.rec_wt_depth, "m"),
+ ("rec_sat_storage", logger.rec_sat_storage, "mm"),
+ ("rec_unsat_storage", logger.rec_unsat_storage, "mm"),
+ ("rec_actual_et", logger.rec_actual_et, "mm/day"),
+ ("rec_interception", logger.rec_interception, "mm/day"),
+ ("rec_infiltration", logger.rec_infiltration, "mm/day"),
+ ("rec_infiltration_excess", logger.rec_infiltration_excess, "mm/day"),
+ ("rec_saturated_excess", logger.rec_saturated_excess, "mm/day"),
+ ("rec_net_runoff_soil", logger.rec_net_runoff_soil, "mm/day"),
+ ("rec_storage", logger.rec_storage, "mm"),
+ ("rec_leakage", logger.rec_leakage, "mm/day"),
+ ("rec_demand", logger.rec_demand, "mm/day"),
+ ("rec_irrigation", logger.rec_irrigation, "mm/day"),
+ ("rec_canopy_storage", logger.rec_canopy_storage, "mm"),
+ ]
+ for (name, data, units) in matrix_vars
+ v = defVar(ds, name, Float64, ("cell", "time"); attrib = ["units" => units])
+ v[:, :] = data
+ end
+
+ # Ribasim node IDs (one per soil column) — empty when run standalone
+ if !isempty(ribasim_node_ids)
+ v = defVar(
+ ds, "ribasim_node_id", Int32, ("cell",);
+ attrib = ["long_name" => "Ribasim UserDemand node_id for each soil column"]
+ )
+ v[:] = ribasim_node_ids
+ end
+
+ # Irrigated area per soil column [m²]
+ v = defVar(
+ ds, "irrigated_area_m2", Float64, ("cell",);
+ attrib = ["units" => "m2", "long_name" => "irrigated area per soil column"]
+ )
+ v[:] = irrigated_area_m2
+ end
+ return println("Logger written to: $path")
+end
+
+end # module Irrigation
diff --git a/irrigation/src/irrigation_utils.jl b/irrigation/src/irrigation_utils.jl
new file mode 100644
index 000000000..314e74c07
--- /dev/null
+++ b/irrigation/src/irrigation_utils.jl
@@ -0,0 +1,193 @@
+# Included inside module Irrigation (irrigation.jl).
+# Requires: Dates, Wflow, FillArrays already imported by the parent file.
+
+# ── Forcing ───────────────────────────────────────────────────────────────────
+struct Forcing
+ timestamps::Vector{DateTime} # right-labelled: timestamp = end of interval
+ precipitation::Vector{Float64} # mm/day
+ potential_evaporation::Vector{Float64} # mm/day
+end
+
+function default_forcing(t_start::DateTime = DateTime(2000, 1, 1))
+ timestamps = [t_start + Day(i) for i in 1:30]
+ return Forcing(
+ timestamps,
+ [repeat([1.0], 15); repeat([30.0], 15)],
+ [repeat([6.0], 15); repeat([0.0], 15)],
+ )
+end
+
+function get_forcing(forcing::Forcing, t::DateTime)
+ idx = searchsortedfirst(forcing.timestamps, t)
+ return forcing.precipitation[idx], forcing.potential_evaporation[idx]
+end
+
+# ── Config structs ──────────────────────────────────────────────────────────────
+@kwdef struct VegetationConfig
+ canopy_gap_fraction::Float64 = 0.35
+ maximum_canopy_storage::Float64 = 5.0e-4 # m (~0.5 mm)
+ rooting_depth::Float64 = 0.5 # m
+ crop_coefficient::Float64 = 1.0
+ evaporation_to_precipitation_ratio::Float64 = 0.25
+end
+
+struct SoilConfig{N}
+ layer_thickness::SVector{N, Float64}
+ rootfraction::SVector{N, Float64}
+ theta_s::Float64
+ theta_r::Float64
+ theta_fc::Float64
+ ksat_surface::Float64
+ ksat_decay::Float64
+ brooks_corey_exponent::Float64
+ kv_factor::Float64
+ air_entry_pressure::Float64
+ wet_root_distribution_parameter::Float64
+ h1::Float64
+ h2::Float64
+ h3_high::Float64
+ h3_low::Float64
+ h4::Float64
+ alpha_h1::Float64
+ infiltration_capacity_soil::Float64
+ infiltration_capacity_compacted::Float64
+ compacted_area_fraction::Float64
+ maximum_leakage::Float64
+ cap_hmax::Float64
+ cap_n::Float64
+ w_soil::Float64
+ cf_soil::Float64
+ soil_fraction::Float64
+end
+
+function SoilConfig(;
+ layer_thickness = SVector(0.05, 0.1, 0.2, 0.8), # m
+ rootfraction = SVector(0.4, 0.3, 0.2, 0.1),
+ theta_s = 0.45,
+ theta_r = 0.05,
+ theta_fc = 0.29,
+ ksat_surface = 5.0e-7, # m/s
+ ksat_decay = 4.0, # m⁻¹
+ brooks_corey_exponent = 9.0, # uniform across layers
+ kv_factor = 1.0, # uniform across layers
+ air_entry_pressure = -0.1,
+ wet_root_distribution_parameter = -500.0,
+ h1 = 0.0,
+ h2 = -0.1,
+ h3_high = -4.0,
+ h3_low = -10.0,
+ h4 = -40.0,
+ alpha_h1 = 1.0,
+ infiltration_capacity_soil = 5.0e-6, # m/s
+ infiltration_capacity_compacted = 0.0,
+ compacted_area_fraction = 0.0,
+ maximum_leakage = 1.0e-3, # m/s
+ cap_hmax = 2.0,
+ cap_n = 2.0,
+ w_soil = 0.1125,
+ cf_soil = 0.038,
+ soil_fraction = 1.0,
+ )
+ N = length(layer_thickness)
+ return SoilConfig{N}(
+ SVector{N, Float64}(layer_thickness),
+ SVector{N, Float64}(rootfraction),
+ theta_s,
+ theta_r,
+ theta_fc,
+ ksat_surface,
+ ksat_decay,
+ brooks_corey_exponent,
+ kv_factor,
+ air_entry_pressure,
+ wet_root_distribution_parameter,
+ h1,
+ h2,
+ h3_high,
+ h3_low,
+ h4,
+ alpha_h1,
+ infiltration_capacity_soil,
+ infiltration_capacity_compacted,
+ compacted_area_fraction,
+ maximum_leakage,
+ cap_hmax,
+ cap_n,
+ w_soil,
+ cf_soil,
+ soil_fraction,
+ )
+end
+
+@kwdef struct IrrigationConfig
+ irrigation_efficiency::Float64 = 0.8
+ maximum_irrigation_rate::Float64 = 5.0e-6 # m/s (~432 mm/day)
+end
+
+# ── Logger ────────────────────────────────────────────────────────────────────
+mutable struct IrrigationLogger
+ rec_wt_depth::Matrix{Float64} # n × nsteps
+ rec_sat_storage::Matrix{Float64}
+ rec_unsat_storage::Matrix{Float64}
+ rec_actual_et::Matrix{Float64}
+ rec_interception::Matrix{Float64}
+ rec_infiltration::Matrix{Float64}
+ rec_infiltration_excess::Matrix{Float64}
+ rec_saturated_excess::Matrix{Float64}
+ rec_net_runoff_soil::Matrix{Float64}
+ rec_storage::Matrix{Float64}
+ rec_leakage::Matrix{Float64}
+ rec_demand::Matrix{Float64}
+ rec_irrigation::Matrix{Float64}
+ rec_canopy_storage::Matrix{Float64}
+ rec_precip::Vector{Float64} # uniform forcing — same for all cells
+end
+
+IrrigationLogger(n::Int, nsteps::Int) = IrrigationLogger(
+ zeros(n, nsteps), # rec_wt_depth
+ zeros(n, nsteps), # rec_sat_storage
+ zeros(n, nsteps), # rec_unsat_storage
+ zeros(n, nsteps), # rec_actual_et
+ zeros(n, nsteps), # rec_interception
+ zeros(n, nsteps), # rec_infiltration
+ zeros(n, nsteps), # rec_infiltration_excess
+ zeros(n, nsteps), # rec_saturated_excess
+ zeros(n, nsteps), # rec_net_runoff_soil
+ zeros(n, nsteps), # rec_storage
+ zeros(n, nsteps), # rec_leakage
+ zeros(n, nsteps), # rec_demand
+ zeros(n, nsteps), # rec_irrigation
+ zeros(n, nsteps), # rec_canopy_storage
+ zeros(nsteps), # rec_precip
+)
+
+function log!(
+ logger::IrrigationLogger,
+ step::Int,
+ soil::Wflow.SbmSoilModel,
+ interception::Wflow.GashInterceptionModel,
+ demand::Wflow.DemandModel,
+ allocation::Wflow.AbstractAllocationModel,
+ precip_mmday::Float64,
+ dt::Float64,
+ )
+ logger.rec_wt_depth[:, step] .= soil.variables.water_table_depth
+ logger.rec_sat_storage[:, step] .= soil.variables.saturated_water_depth
+ logger.rec_unsat_storage[:, step] .= soil.variables.unsaturated_store_depth
+ logger.rec_actual_et[:, step] .= soil.variables.actual_evapotranspiration .* (dt * 1.0e3)
+ logger.rec_interception[:, step] .=
+ interception.variables.interception_rate .* (dt * 1.0e3)
+ logger.rec_infiltration[:, step] .= soil.variables.actual_infiltration .* (dt * 1.0e3)
+ logger.rec_infiltration_excess[:, step] .=
+ soil.variables.infiltration_excess .* (dt * 1.0e3)
+ logger.rec_saturated_excess[:, step] .=
+ soil.variables.saturation_excess_water .* (dt * 1.0e3)
+ logger.rec_net_runoff_soil[:, step] .= soil.variables.net_runoff .* (dt * 1.0e3)
+ logger.rec_storage[:, step] .= soil.variables.total_soil_water_storage .* 1.0e3
+ logger.rec_leakage[:, step] .= soil.variables.actual_leakage .* (dt * 1.0e3)
+ logger.rec_demand[:, step] .= demand.nonpaddy.variables.demand_gross .* (dt * 1.0e3)
+ logger.rec_irrigation[:, step] .=
+ Wflow.get_irrigation_allocated(allocation) .* (dt * 1.0e3)
+ logger.rec_canopy_storage[:, step] .= interception.variables.canopy_storage .* 1.0e3
+ return logger.rec_precip[step] = precip_mmday
+end
diff --git a/python/ribasim/ribasim/config.py b/python/ribasim/ribasim/config.py
index 597476995..4fdb9e551 100644
--- a/python/ribasim/ribasim/config.py
+++ b/python/ribasim/ribasim/config.py
@@ -49,6 +49,8 @@
TabulatedRatingCurveStaticSchema,
TabulatedRatingCurveTimeSchema,
UserDemandConcentrationSchema,
+ UserDemandIrrigationForcingSchema,
+ UserDemandIrrigationStaticSchema,
UserDemandStaticSchema,
UserDemandTimeSchema,
)
@@ -201,10 +203,13 @@ class Experimental(ChildModel):
Whether to enable tracer support (default is False)
allocation : bool
Whether to activate the activation layer. Replaced by 'first come first serve' when deactivated (default is False)
+ irrigation : bool
+ Whether to enable two-way coupling with the Wflow-based irrigation soil model (default is False)
"""
concentration: bool = False
allocation: bool = False
+ irrigation: bool = False
class Terminal(NodeModel): ...
@@ -281,6 +286,14 @@ class UserDemand(NodeModel):
default_factory=TableModel[UserDemandConcentrationSchema],
json_schema_extra={"sort_keys": ["node_id", "substance", "time"]},
)
+ irrigation_static: TableModel[UserDemandIrrigationStaticSchema] = Field(
+ default_factory=TableModel[UserDemandIrrigationStaticSchema],
+ json_schema_extra={"sort_keys": ["node_id"]},
+ )
+ irrigation_forcing: TableModel[UserDemandIrrigationForcingSchema] = Field(
+ default_factory=TableModel[UserDemandIrrigationForcingSchema],
+ json_schema_extra={"sort_keys": ["node_id", "time"]},
+ )
class LevelDemand(NodeModel):
diff --git a/python/ribasim/ribasim/schemas.py b/python/ribasim/ribasim/schemas.py
index 0106695de..a6c9640d3 100644
--- a/python/ribasim/ribasim/schemas.py
+++ b/python/ribasim/ribasim/schemas.py
@@ -396,6 +396,22 @@ class UserDemandConcentrationSchema(_BaseSchema):
concentration: float = pa.Field(nullable=False)
+class UserDemandIrrigationForcingSchema(_BaseSchema):
+ _node_id_relation: str = "equal"
+ fid: Index[Int32] = pa.Field(default=1, check_name=True, coerce=True)
+ node_id: np.int32 = pa.Field(nullable=False, default=0)
+ time: pd.Timestamp = pa.Field(nullable=False)
+ precipitation: float = pa.Field(nullable=False)
+ potential_evaporation: float = pa.Field(nullable=False)
+
+
+class UserDemandIrrigationStaticSchema(_BaseSchema):
+ _node_id_relation: str = "equal"
+ fid: Index[Int32] = pa.Field(default=1, check_name=True, coerce=True)
+ node_id: np.int32 = pa.Field(nullable=False, default=0)
+ irrigated_area_m2: float = pa.Field(nullable=False)
+
+
class UserDemandStaticSchema(_BaseSchema):
_node_id_relation: str = "partition"
fid: Index[Int32] = pa.Field(default=1, check_name=True, coerce=True)