From c3fdf24e9f6339625c186e8d35cd6a84070071e6 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Mon, 28 Oct 2024 15:45:54 +0100 Subject: [PATCH] Merge branch 'docs_nitpicks' into v1_quarto_docs --- .gitignore | 1 + Manifest.toml | 220 +++++--- Project.toml | 24 +- build/create_binaries/Manifest.toml | 264 +++++---- build/create_binaries/add_metadata.jl | 21 +- build/create_binaries/download_test_data.jl | 5 +- build/wflow_cli/Manifest.toml | 236 +++++--- .../Setup/Installer/Application.Setup.wixproj | 2 +- docs/getting_started/install.qmd | 66 +-- docs/home/case_studies.qmd | 56 +- docs/home/publications.qmd | 45 +- docs/model_docs/lateral/gwf.qmd | 88 +-- docs/model_docs/lateral/kinwave.qmd | 90 +-- docs/model_docs/lateral/local-inertial.qmd | 60 +- docs/model_docs/lateral/sediment_flux.qmd | 275 +++++---- docs/model_docs/lateral/waterbodies.qmd | 56 +- docs/model_docs/vertical/sbm.qmd | 338 ++++++----- docs/model_docs/vertical/sediment.qmd | 73 ++- docs/model_docs/vertical/shared_processes.qmd | 64 +-- docs/user_guide/toml_file.qmd | 152 +++-- pixi.lock | 529 +++++++++--------- pixi.toml | 6 +- server/Manifest.toml | 244 ++++---- src/Wflow.jl | 40 +- src/bmi.jl | 33 +- src/flextopo_model.jl | 4 +- src/flow.jl | 41 +- src/hbv_model.jl | 8 +- src/horizontal_process.jl | 4 +- src/io.jl | 28 +- src/sbm.jl | 41 +- src/sbm_gwf_model.jl | 2 +- src/sbm_model.jl | 10 +- src/sediment.jl | 2 +- src/sediment_model.jl | 4 +- src/utils.jl | 2 +- src/water_demand.jl | 2 +- test/io.jl | 11 +- test/run_flextopo.jl | 4 +- test/run_hbv.jl | 2 +- test/run_sbm.jl | 10 +- test/run_sbm_gwf.jl | 4 +- test/run_sediment.jl | 2 +- test/runtests.jl | 3 +- test/subdomains.jl | 2 +- 45 files changed, 1690 insertions(+), 1484 deletions(-) diff --git a/.gitignore b/.gitignore index 604242d59..9d64d76fc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ # Document generation /docs/build/ /docs/site/ +/docs/Manifest.toml # Temporary files /dev/ diff --git a/Manifest.toml b/Manifest.toml index e66d73e35..7b5174c1c 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.0" +julia_version = "1.10.5" manifest_format = "2.0" -project_hash = "d07ae13655ba6d661946c37e1c2a11d4acab567d" +project_hash = "986b47155507036c06218d23750fe8de28eb001a" [[deps.AbstractTrees]] git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" @@ -11,9 +11,9 @@ version = "0.4.5" [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" +git-tree-sha1 = "d80af0733c99ea80575f612813fa6aa71022d33a" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.4" +version = "4.1.0" weakdeps = ["StaticArrays"] [deps.Adapt.extensions] @@ -30,18 +30,20 @@ uuid = "ec485272-7323-5ecc-a04f-4719b315124d" version = "0.4.0" [[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "44691067188f6bd1b2289552a23e4b7572f4528d" +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "3640d077b6dafd64ceb8fd5c1ec76f7ca53bcf76" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.9.0" +version = "7.16.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" ArrayInterfaceChainRulesExt = "ChainRules" ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" ArrayInterfaceTrackerExt = "Tracker" @@ -49,9 +51,11 @@ version = "7.9.0" 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" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" @@ -68,15 +72,21 @@ version = "0.1.0" [[deps.BitTwiddlingConvenienceFunctions]] deps = ["Static"] -git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" -version = "0.1.5" +version = "0.1.6" + +[[deps.Blosc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "ef12cdd1c7fb7e1dfd6fa8fd60d4db6bc61d2f23" +uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9" +version = "1.21.6+0" [[deps.Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" +git-tree-sha1 = "8873e196c2eb87962a2048b3b8e08946535864a1" uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+1" +version = "1.0.8+2" [[deps.CFTime]] deps = ["Dates", "Printf"] @@ -86,27 +96,32 @@ version = "0.1.3" [[deps.CPUSummary]] deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] -git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.2.4" +version = "0.2.6" [[deps.CloseOpenIntervals]] deps = ["Static", "StaticArrayInterface"] -git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.12" +version = "0.1.13" [[deps.CommonDataModel]] -deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf"] -git-tree-sha1 = "7f5717cbb2c1ce650cfd454451f282df33103596" +deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] +git-tree-sha1 = "d6fb5bf939a2753c74984b11434ea25d6c397a58" uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" -version = "0.2.5" +version = "0.3.6" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.14.0" +version = "4.16.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -115,7 +130,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+1" +version = "1.1.1+0" [[deps.CpuId]] deps = ["Markdown"] @@ -125,9 +140,9 @@ version = "0.3.1" [[deps.DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "97d79461925cdb635ee32116978fc735b9463a39" +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.19" +version = "0.18.20" [[deps.Dates]] deps = ["Printf"] @@ -168,16 +183,27 @@ version = "0.3.1" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +[[deps.GMP_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" +version = "6.2.1+6" + [[deps.Glob]] git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" version = "1.3.1" +[[deps.GnuTLS_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Nettle_jll", "P11Kit_jll", "Zlib_jll"] +git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3" +uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d" +version = "3.8.4+0" + [[deps.Graphs]] deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "3863330da5466410782f2bffc64f3d505a6a8334" +git-tree-sha1 = "1dc470db8b1131cfc7fb4c115de89fe391b9e780" uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.10.0" +version = "1.12.0" [[deps.HDF5_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] @@ -187,15 +213,15 @@ version = "1.14.3+3" [[deps.HostCPUFeatures]] deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.16" +version = "0.1.17" [[deps.Hwloc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114" +git-tree-sha1 = "dd3b49277ec2bb2c6b94eb1604d4d0616016f7a6" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.10.0+0" +version = "2.11.2+0" [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" @@ -203,9 +229,9 @@ uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" [[deps.Inflate]] -git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.4" +version = "0.1.5" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -213,9 +239,9 @@ uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +git-tree-sha1 = "be3dc50a92e5a386872a493a10050136d4703f9b" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" +version = "1.6.1" [[deps.LRUCache]] git-tree-sha1 = "b3cc6698599b10e652832c2f23db3cab99d51b59" @@ -228,9 +254,9 @@ weakdeps = ["Serialization"] [[deps.LayoutPointers]] deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.15" +version = "0.1.17" [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] @@ -290,9 +316,9 @@ version = "1.0.3" [[deps.LoopVectorization]] deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] -git-tree-sha1 = "a13f3be5d84b9c95465d743c82af0b094ef9c2e2" +git-tree-sha1 = "8084c25a250e00ae427a379a5b607e7aed96a2dd" uuid = "bdcacae8-1622-11e9-2a5c-532679323890" -version = "0.12.169" +version = "0.12.171" [deps.LoopVectorization.extensions] ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] @@ -303,23 +329,29 @@ version = "0.12.169" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" +[[deps.Lz4_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "abf88ff67f4fd89839efcae2f4c39cbc4ecd0846" +uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" +version = "1.10.0+1" + [[deps.MPICH_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "656036b9ed6f942d35e536e249600bc31d0f9df8" +git-tree-sha1 = "7715e65c47ba3941c502bffb7f266a41a7f54423" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.0+0" +version = "4.2.3+0" [[deps.MPIPreferences]] deps = ["Libdl", "Preferences"] -git-tree-sha1 = "8f6af051b9e8ec597fa09d8885ed79fd582f33c9" +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.10" +version = "0.1.11" [[deps.MPItrampoline_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "77c3bd69fdb024d75af38713e883d0f249ce19c2" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "70e830dab5d0775183c99fc75e4c24c614ed7142" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.3.2+0" +version = "5.5.1+0" [[deps.MacroTools]] deps = ["Markdown", "Random"] @@ -356,24 +388,30 @@ version = "2023.1.10" [[deps.NCDatasets]] deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] -git-tree-sha1 = "173a378f357e9bb24b22019efb5e4778223ce8cf" +git-tree-sha1 = "77df6d3708ec0eb3441551e1f20f7503b37c2393" uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -version = "0.13.2" +version = "0.14.5" [[deps.NetCDF_jll]] -deps = ["Artifacts", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "XML2_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "10c612c81eaffdd6b7c28a45a554cdd9d2f40ff1" +deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "XML2_jll", "Zlib_jll", "Zstd_jll", "libzip_jll"] +git-tree-sha1 = "4686378c4ae1d1948cfbe46c002a11a4265dcb07" uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" -version = "400.902.208+0" +version = "400.902.211+1" + +[[deps.Nettle_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "eca63e3847dad608cfa6a3329b95ef674c7160b4" +uuid = "4c82536e-c426-54e4-b420-14f461c4ed8b" +version = "3.7.2+0" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" [[deps.OffsetArrays]] -git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" +git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.14.0" +version = "1.14.1" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] @@ -382,7 +420,7 @@ weakdeps = ["Adapt"] [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+2" +version = "0.3.23+4" [[deps.OpenMPI_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] @@ -392,15 +430,21 @@ version = "4.1.6+0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.13+1" +version = "3.0.15+1" [[deps.OrderedCollections]] git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.6.3" +[[deps.P11Kit_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "2cd396108e178f3ae8dedbd8e938a18726ab2fbf" +uuid = "c2071276-7c44-58a7-b746-946036e04d0a" +version = "0.24.1+0" + [[deps.Parameters]] deps = ["OrderedCollections", "UnPack"] git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" @@ -413,16 +457,16 @@ uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" version = "1.10.0" [[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "09f59c6dda37c7f73efddc5bdf6f92bc940eb484" +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.12" +version = "0.7.16" [[deps.PolyesterWeave]] deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.2.1" +version = "0.2.2" [[deps.PrecompileTools]] deps = ["Preferences"] @@ -471,9 +515,9 @@ version = "0.1.0" [[deps.SLEEFPirates]] deps = ["IfElse", "Static", "VectorizationBase"] -git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" -version = "0.6.42" +version = "0.6.43" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" @@ -497,16 +541,16 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" version = "1.10.0" [[deps.Static]] -deps = ["IfElse"] -git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "87d51a3ee9a4b0d2fe054bdd3fc2436258db2603" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.8.10" +version = "1.1.1" [[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] -git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.5.0" +version = "1.8.0" weakdeps = ["OffsetArrays", "StaticArrays"] [deps.StaticArrayInterface.extensions] @@ -515,9 +559,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +git-tree-sha1 = "777657803913ffc7e8cc20f0fd04b634f871af8f" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.3" +version = "1.9.8" [deps.StaticArrays.extensions] StaticArraysChainRulesCoreExt = "ChainRulesCore" @@ -528,9 +572,9 @@ version = "1.9.3" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" [[deps.StaticArraysCore]] -git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.2" +version = "1.4.3" [[deps.Statistics]] deps = ["LinearAlgebra", "SparseArrays"] @@ -539,13 +583,9 @@ version = "1.10.0" [[deps.StrideArraysCore]] deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] -git-tree-sha1 = "b518da45c50dfab8384125ba829f1739bda41034" +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.5.5" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" +version = "0.5.7" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] @@ -588,15 +628,21 @@ uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [[deps.VectorizationBase]] deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "ac377f0a248753a1b1d58bbc92a64f5a726dfb71" +git-tree-sha1 = "e7f5b81c65eb858bed630fe006837b935518aca5" uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" -version = "0.21.66" +version = "0.21.70" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" +git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.6+0" +version = "2.13.3+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" [[deps.Zlib_jll]] deps = ["Libdl"] @@ -605,9 +651,9 @@ version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.6+0" +version = "1.5.6+1" [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -618,7 +664,13 @@ version = "1.1.2+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" +version = "5.11.0+0" + +[[deps.libzip_jll]] +deps = ["Artifacts", "Bzip2_jll", "GnuTLS_jll", "JLLWrappers", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "668ac0297e6bd8f4d53dfdcd3ace71f2e00f4a35" +uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" +version = "1.11.1+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] diff --git a/Project.toml b/Project.toml index 54d2ea8b6..4bd017e4e 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Wflow" uuid = "d48b7d99-76e7-47ae-b1d5-ff0c1cf9a818" authors = ["Deltares and contributors"] -version = "0.7.3" +version = "0.8.1" [deps] BasicModelInterface = "59605e27-edc0-445a-b93d-c09a3a50b330" @@ -18,20 +18,18 @@ NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" Polyester = "f517fe37-dbe3-4b94-8317-1923a5111588" ProgressLogging = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" TerminalLoggers = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" [compat] Aqua = "0.8" BasicModelInterface = "0.1" CFTime = "0.1" -Dates = "<0.0.1,1" -DelimitedFiles = "<0.0.1,1" -Downloads = "<0.0.1,1" +Dates = "1" +DelimitedFiles = "1" +Downloads = "1" FieldMetadata = "0.3" Glob = "1.3" Graphs = "1.4" @@ -40,17 +38,16 @@ LoggingExtras = "0.4.6,0.5,1" LoopVectorization = "0.12" NCDatasets = "0.13.2, 0.14" Parameters = "0.12" -Polyester = ">=0.7.10" +Polyester = "0.7.10" Polynomials = "3,4" ProgressLogging = "0.1" QuadGK = "2" -Random = "<0.0.1,1" +Random = "1" StaticArrays = "0.12,1.0" -Statistics = "<0.0.1,1" -TOML = "<0.0.1,1" +Statistics = "1" +TOML = "1" TerminalLoggers = "0.1.5" -Test = "<0.0.1,1" -UnPack = "1" +Test = "1" julia = "1.6" [extras] @@ -58,7 +55,8 @@ Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6" Polynomials = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Aqua", "Downloads", "Polynomials", "QuadGK", "Test"] +test = ["Aqua", "Downloads", "Polynomials", "QuadGK", "Test", "Random"] diff --git a/build/create_binaries/Manifest.toml b/build/create_binaries/Manifest.toml index 0d2640764..9bc158936 100644 --- a/build/create_binaries/Manifest.toml +++ b/build/create_binaries/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.0" +julia_version = "1.10.5" manifest_format = "2.0" project_hash = "09d43e232d75c1e607afc4fcd6ce747acf2d3551" @@ -11,9 +11,9 @@ version = "0.4.5" [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "0fb305e0253fd4e833d486914367a2ee2c2e78d0" +git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.1" +version = "4.0.4" weakdeps = ["StaticArrays"] [deps.Adapt.extensions] @@ -25,22 +25,25 @@ version = "1.1.1" [[deps.ArnoldiMethod]] deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.2.0" +version = "0.4.0" [[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "881e43f1aa014a6f75c8fc0847860e00a1500846" +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "3640d077b6dafd64ceb8fd5c1ec76f7ca53bcf76" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.8.0" +version = "7.16.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesExt = "ChainRules" ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" ArrayInterfaceTrackerExt = "Tracker" @@ -48,8 +51,11 @@ version = "7.8.0" 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" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" @@ -66,9 +72,15 @@ version = "0.1.0" [[deps.BitTwiddlingConvenienceFunctions]] deps = ["Static"] -git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" -version = "0.1.5" +version = "0.1.6" + +[[deps.Blosc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "19b98ee7e3db3b4eff74c5c9c72bf32144e24f10" +uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9" +version = "1.21.5+0" [[deps.Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -84,27 +96,32 @@ version = "0.1.3" [[deps.CPUSummary]] deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] -git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.2.4" +version = "0.2.6" [[deps.CloseOpenIntervals]] deps = ["Static", "StaticArrayInterface"] -git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.12" +version = "0.1.13" [[deps.CommonDataModel]] -deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf"] -git-tree-sha1 = "7f5717cbb2c1ce650cfd454451f282df33103596" +deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] +git-tree-sha1 = "d6fb5bf939a2753c74984b11434ea25d6c397a58" uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" -version = "0.2.5" +version = "0.3.6" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.14.0" +version = "4.16.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -113,7 +130,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+1" +version = "1.1.1+0" [[deps.CpuId]] deps = ["Markdown"] @@ -123,9 +140,9 @@ version = "0.3.1" [[deps.DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "1fb174f0d48fe7d142e1109a10636bc1d14f5ac2" +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.17" +version = "0.18.20" [[deps.Dates]] deps = ["Printf"] @@ -166,34 +183,45 @@ version = "0.3.1" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +[[deps.GMP_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" +version = "6.2.1+6" + [[deps.Glob]] git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" version = "1.3.1" +[[deps.GnuTLS_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Nettle_jll", "P11Kit_jll", "Zlib_jll"] +git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3" +uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d" +version = "3.8.4+0" + [[deps.Graphs]] deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "899050ace26649433ef1af25bc17a815b3db52b7" +git-tree-sha1 = "1dc470db8b1131cfc7fb4c115de89fe391b9e780" uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.9.0" +version = "1.12.0" [[deps.HDF5_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "38c8874692d48d5440d5752d6c74b0c6b0b60739" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] +git-tree-sha1 = "82a471768b513dc39e471540fdadc84ff80ff997" uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.2+1" +version = "1.14.3+3" [[deps.HostCPUFeatures]] deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.16" +version = "0.1.17" [[deps.Hwloc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114" +git-tree-sha1 = "dd3b49277ec2bb2c6b94eb1604d4d0616016f7a6" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.10.0+0" +version = "2.11.2+0" [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" @@ -201,9 +229,9 @@ uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" [[deps.Inflate]] -git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.4" +version = "0.1.5" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -211,15 +239,9 @@ uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +git-tree-sha1 = "f389674c99bfcde17dc57454011aa44d5a260a40" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" - -[[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" -uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "15.0.7+0" +version = "1.6.0" [[deps.LRUCache]] git-tree-sha1 = "b3cc6698599b10e652832c2f23db3cab99d51b59" @@ -232,9 +254,9 @@ weakdeps = ["Serialization"] [[deps.LayoutPointers]] deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.15" +version = "0.1.17" [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] @@ -294,9 +316,9 @@ version = "1.0.3" [[deps.LoopVectorization]] deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] -git-tree-sha1 = "0f5648fbae0d015e3abe5867bca2b362f67a5894" +git-tree-sha1 = "8084c25a250e00ae427a379a5b607e7aed96a2dd" uuid = "bdcacae8-1622-11e9-2a5c-532679323890" -version = "0.12.166" +version = "0.12.171" [deps.LoopVectorization.extensions] ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] @@ -307,23 +329,29 @@ version = "0.12.166" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" +[[deps.Lz4_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "abf88ff67f4fd89839efcae2f4c39cbc4ecd0846" +uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" +version = "1.10.0+1" + [[deps.MPICH_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "656036b9ed6f942d35e536e249600bc31d0f9df8" +git-tree-sha1 = "19d4bd098928a3263693991500d05d74dbdc2004" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.0+0" +version = "4.2.2+0" [[deps.MPIPreferences]] deps = ["Libdl", "Preferences"] -git-tree-sha1 = "8f6af051b9e8ec597fa09d8885ed79fd582f33c9" +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.10" +version = "0.1.11" [[deps.MPItrampoline_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "77c3bd69fdb024d75af38713e883d0f249ce19c2" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "fde81c9f9c94fe5fbeaed7b3f1330305cf9a327c" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.3.2+0" +version = "5.5.0+0" [[deps.MacroTools]] deps = ["Markdown", "Random"] @@ -360,24 +388,30 @@ version = "2023.1.10" [[deps.NCDatasets]] deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] -git-tree-sha1 = "173a378f357e9bb24b22019efb5e4778223ce8cf" +git-tree-sha1 = "77df6d3708ec0eb3441551e1f20f7503b37c2393" uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -version = "0.13.2" +version = "0.14.5" [[deps.NetCDF_jll]] -deps = ["Artifacts", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "XML2_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "10c612c81eaffdd6b7c28a45a554cdd9d2f40ff1" +deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "XML2_jll", "Zlib_jll", "Zstd_jll", "libzip_jll"] +git-tree-sha1 = "4686378c4ae1d1948cfbe46c002a11a4265dcb07" uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" -version = "400.902.208+0" +version = "400.902.211+1" + +[[deps.Nettle_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "eca63e3847dad608cfa6a3329b95ef674c7160b4" +uuid = "4c82536e-c426-54e4-b420-14f461c4ed8b" +version = "3.7.2+0" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" [[deps.OffsetArrays]] -git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.13.0" +version = "1.14.1" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] @@ -386,30 +420,30 @@ weakdeps = ["Adapt"] [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+2" +version = "0.3.23+4" [[deps.OpenMPI_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "PMIx_jll", "TOML", "Zlib_jll", "libevent_jll", "prrte_jll"] -git-tree-sha1 = "f46caf663e069027a06942d00dced37f1eb3d8ad" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "e25c1778a98e34219a00455d6e4384e017ea9762" uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "5.0.2+0" +version = "4.1.6+0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c" +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.13+0" +version = "3.0.15+1" [[deps.OrderedCollections]] git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.6.3" -[[deps.PMIx_jll]] -deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "Libdl", "Zlib_jll", "libevent_jll"] -git-tree-sha1 = "8b3b19351fa24791f94d7ae85faf845ca1362541" -uuid = "32165bc3-0280-59bc-8c0b-c33b6203efab" -version = "4.2.7+0" +[[deps.P11Kit_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "2cd396108e178f3ae8dedbd8e938a18726ab2fbf" +uuid = "c2071276-7c44-58a7-b746-946036e04d0a" +version = "0.24.1+0" [[deps.PackageCompiler]] deps = ["Artifacts", "Glob", "LazyArtifacts", "Libdl", "Pkg", "Printf", "RelocatableFolders", "TOML", "UUIDs", "p7zip_jll"] @@ -429,22 +463,22 @@ uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" version = "1.10.0" [[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "fca25670784a1ae44546bcb17288218310af2778" +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.9" +version = "0.7.16" [[deps.PolyesterWeave]] deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.2.1" +version = "0.2.2" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.0" +version = "1.2.1" [[deps.Preferences]] deps = ["TOML"] @@ -493,9 +527,9 @@ version = "0.1.0" [[deps.SLEEFPirates]] deps = ["IfElse", "Static", "VectorizationBase"] -git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" -version = "0.6.42" +version = "0.6.43" [[deps.Scratch]] deps = ["Dates"] @@ -525,16 +559,16 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" version = "1.10.0" [[deps.Static]] -deps = ["IfElse"] -git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "87d51a3ee9a4b0d2fe054bdd3fc2436258db2603" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.8.10" +version = "1.1.1" [[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] -git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.5.0" +version = "1.8.0" weakdeps = ["OffsetArrays", "StaticArrays"] [deps.StaticArrayInterface.extensions] @@ -543,9 +577,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.3" +version = "1.9.7" [deps.StaticArrays.extensions] StaticArraysChainRulesCoreExt = "ChainRulesCore" @@ -556,9 +590,9 @@ version = "1.9.3" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" [[deps.StaticArraysCore]] -git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.2" +version = "1.4.3" [[deps.Statistics]] deps = ["LinearAlgebra", "SparseArrays"] @@ -566,14 +600,10 @@ uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" version = "1.10.0" [[deps.StrideArraysCore]] -deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] -git-tree-sha1 = "d6415f66f3d89c615929af907fdc6a3e17af0d8c" +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.5.2" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" +version = "0.5.7" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] @@ -616,23 +646,27 @@ uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [[deps.VectorizationBase]] deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "7209df901e6ed7489fe9b7aa3e46fb788e15db85" +git-tree-sha1 = "e7f5b81c65eb858bed630fe006837b935518aca5" uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" -version = "0.21.65" +version = "0.21.70" [[deps.Wflow]] deps = ["BasicModelInterface", "CFTime", "Dates", "DelimitedFiles", "FieldMetadata", "Glob", "Graphs", "IfElse", "LoggingExtras", "LoopVectorization", "NCDatasets", "Parameters", "Polyester", "ProgressLogging", "Random", "StaticArrays", "Statistics", "TOML", "TerminalLoggers", "UnPack"] -git-tree-sha1 = "29fdf975f5a32b15890182f114b72ea6ba7b21cc" -repo-rev = "master" -repo-url = "../.." +path = "../.." uuid = "d48b7d99-76e7-47ae-b1d5-ff0c1cf9a818" -version = "0.7.3" +version = "0.8.1" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "07e470dabc5a6a4254ffebc29a1b3fc01464e105" +git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.5+0" +version = "2.13.3+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" [[deps.Zlib_jll]] deps = ["Libdl"] @@ -641,9 +675,9 @@ version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.5+0" +version = "1.5.6+1" [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -654,13 +688,13 @@ version = "1.1.2+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" +version = "5.11.0+0" -[[deps.libevent_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll"] -git-tree-sha1 = "f04ec6d9a186115fb38f858f05c0c4e1b7fc9dcb" -uuid = "1080aeaf-3a6a-583e-a51c-c537b09f60ec" -version = "2.1.13+1" +[[deps.libzip_jll]] +deps = ["Artifacts", "Bzip2_jll", "GnuTLS_jll", "JLLWrappers", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3282b7d16ae7ac3e57ec2f3fa8fafb564d8f9f7f" +uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" +version = "1.10.1+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] @@ -671,9 +705,3 @@ version = "1.52.0+1" deps = ["Artifacts", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" version = "17.4.0+2" - -[[deps.prrte_jll]] -deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "Libdl", "PMIx_jll", "libevent_jll"] -git-tree-sha1 = "5adb2d7a18a30280feb66cad6f1a1dfdca2dc7b0" -uuid = "eb928a42-fffd-568d-ab9c-3f5d54fc65b9" -version = "3.0.2+0" diff --git a/build/create_binaries/add_metadata.jl b/build/create_binaries/add_metadata.jl index 64e8fd441..489379e1c 100644 --- a/build/create_binaries/add_metadata.jl +++ b/build/create_binaries/add_metadata.jl @@ -40,14 +40,22 @@ function add_metadata(project_dir, license_file, output_dir, git_repo) error("Manifest.toml is in the old format, run Pkg.upgrade_manifest()") end julia_version = manifest["julia_version"] - wflow_entry = only(manifest["deps"]["Wflow"]) - tree = wflow_entry["git-tree-sha1"] - version = wflow_entry["version"] + version = TOML.parsefile(normpath(git_repo, "Project.toml"))["version"] repo = GitRepo(git_repo) branch = LibGit2.head(repo) - # commit = LibGit2.peel(LibGit2.GitCommit, branch) + commit = LibGit2.peel(LibGit2.GitCommit, branch) short_name = LibGit2.shortname(branch) - # short_commit = string(LibGit2.GitShortHash(LibGit2.GitHash(commit), 10)) + short_commit = string(LibGit2.GitShortHash(LibGit2.GitHash(commit), 10)) + + # get the release from the current tag, like `git describe --tags` + # if it is a commit after a tag, it will be -g + options = LibGit2.DescribeOptions(; describe_strategy = LibGit2.Consts.DESCRIBE_TAGS) + result = LibGit2.GitDescribeResult(repo; options) + suffix = "-dirty" + foptions = + LibGit2.DescribeFormatOptions(; dirty_suffix = Base.unsafe_convert(Cstring, suffix)) + GC.@preserve suffix tag = LibGit2.format(result; options = foptions)[2:end] # skip v prefix + url = "https://github.com/Deltares/Wflow.jl/tree" version_info = """ @@ -56,8 +64,9 @@ function add_metadata(project_dir, license_file, output_dir, git_repo) This build uses the Wflow.jl version mentioned below. ```toml + release = "$tag" version = "$version" - git-tree-sha1 = "$tree" + commit = "$url/$short_commit" branch = "$url/$short_name" julia_version = "$julia_version" ```""" diff --git a/build/create_binaries/download_test_data.jl b/build/create_binaries/download_test_data.jl index 0ed330ed6..3ff5f5437 100644 --- a/build/create_binaries/download_test_data.jl +++ b/build/create_binaries/download_test_data.jl @@ -1,7 +1,6 @@ -using Wflow using Downloads -testdir = abspath(dirname(pathof(Wflow)), "..", "test") +testdir = normpath(@__DIR__, "../../test") # ensure test data is present # this code is copied from runtests.jl, and is a temporary solution to get the data in place @@ -56,4 +55,4 @@ forcing_calendar_noleap_path = forcing_piave_path = testdata(v"0.2.9", "inmaps-era5-2010-piave.nc", "forcing-piave.nc") staticmaps_piave_path = testdata(v"0.2.9", "staticmaps-piave.nc", "staticmaps-piave.nc") instates_piave_path = testdata(v"0.2.9", "instates-piave.nc", "instates-piave.nc") -instates_piave_gwf_path = testdata(v"0.2.9", "instates-piave-gwf.nc", "instates-piave-gwf.nc") \ No newline at end of file +instates_piave_gwf_path = testdata(v"0.2.9", "instates-piave-gwf.nc", "instates-piave-gwf.nc") diff --git a/build/wflow_cli/Manifest.toml b/build/wflow_cli/Manifest.toml index 55b9ab3f1..11e38b836 100644 --- a/build/wflow_cli/Manifest.toml +++ b/build/wflow_cli/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.0" +julia_version = "1.10.5" manifest_format = "2.0" project_hash = "ea4cd58591c4d2b83f5376bb1cc8297e50705069" @@ -11,9 +11,9 @@ version = "0.4.5" [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "0fb305e0253fd4e833d486914367a2ee2c2e78d0" +git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.1" +version = "4.0.4" weakdeps = ["StaticArrays"] [deps.Adapt.extensions] @@ -25,22 +25,25 @@ version = "1.1.1" [[deps.ArnoldiMethod]] deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.2.0" +version = "0.4.0" [[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "881e43f1aa014a6f75c8fc0847860e00a1500846" +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "3640d077b6dafd64ceb8fd5c1ec76f7ca53bcf76" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.8.0" +version = "7.16.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesExt = "ChainRules" ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" ArrayInterfaceTrackerExt = "Tracker" @@ -48,8 +51,11 @@ version = "7.8.0" 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" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" @@ -66,9 +72,15 @@ version = "0.1.0" [[deps.BitTwiddlingConvenienceFunctions]] deps = ["Static"] -git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" -version = "0.1.5" +version = "0.1.6" + +[[deps.Blosc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "19b98ee7e3db3b4eff74c5c9c72bf32144e24f10" +uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9" +version = "1.21.5+0" [[deps.Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -84,27 +96,32 @@ version = "0.1.3" [[deps.CPUSummary]] deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] -git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.2.4" +version = "0.2.6" [[deps.CloseOpenIntervals]] deps = ["Static", "StaticArrayInterface"] -git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.12" +version = "0.1.13" [[deps.CommonDataModel]] -deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf"] -git-tree-sha1 = "7f5717cbb2c1ce650cfd454451f282df33103596" +deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] +git-tree-sha1 = "d6fb5bf939a2753c74984b11434ea25d6c397a58" uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" -version = "0.2.5" +version = "0.3.6" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.14.0" +version = "4.16.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -113,7 +130,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.0.5+1" +version = "1.1.1+0" [[deps.CpuId]] deps = ["Markdown"] @@ -123,9 +140,9 @@ version = "0.3.1" [[deps.DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "1fb174f0d48fe7d142e1109a10636bc1d14f5ac2" +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.17" +version = "0.18.20" [[deps.Dates]] deps = ["Printf"] @@ -166,34 +183,45 @@ version = "0.3.1" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +[[deps.GMP_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" +version = "6.2.1+6" + [[deps.Glob]] git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" version = "1.3.1" +[[deps.GnuTLS_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Nettle_jll", "P11Kit_jll", "Zlib_jll"] +git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3" +uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d" +version = "3.8.4+0" + [[deps.Graphs]] deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "899050ace26649433ef1af25bc17a815b3db52b7" +git-tree-sha1 = "1dc470db8b1131cfc7fb4c115de89fe391b9e780" uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.9.0" +version = "1.12.0" [[deps.HDF5_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "e4591176488495bf44d7456bd73179d87d5e6eab" +git-tree-sha1 = "82a471768b513dc39e471540fdadc84ff80ff997" uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.3+1" +version = "1.14.3+3" [[deps.HostCPUFeatures]] deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.16" +version = "0.1.17" [[deps.Hwloc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114" +git-tree-sha1 = "dd3b49277ec2bb2c6b94eb1604d4d0616016f7a6" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.10.0+0" +version = "2.11.2+0" [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" @@ -201,9 +229,9 @@ uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" [[deps.Inflate]] -git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.4" +version = "0.1.5" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -211,9 +239,9 @@ uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +git-tree-sha1 = "f389674c99bfcde17dc57454011aa44d5a260a40" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" +version = "1.6.0" [[deps.LRUCache]] git-tree-sha1 = "b3cc6698599b10e652832c2f23db3cab99d51b59" @@ -226,9 +254,9 @@ weakdeps = ["Serialization"] [[deps.LayoutPointers]] deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.15" +version = "0.1.17" [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] @@ -288,9 +316,9 @@ version = "1.0.3" [[deps.LoopVectorization]] deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] -git-tree-sha1 = "0f5648fbae0d015e3abe5867bca2b362f67a5894" +git-tree-sha1 = "8084c25a250e00ae427a379a5b607e7aed96a2dd" uuid = "bdcacae8-1622-11e9-2a5c-532679323890" -version = "0.12.166" +version = "0.12.171" [deps.LoopVectorization.extensions] ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] @@ -301,23 +329,29 @@ version = "0.12.166" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" +[[deps.Lz4_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "abf88ff67f4fd89839efcae2f4c39cbc4ecd0846" +uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" +version = "1.10.0+1" + [[deps.MPICH_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "656036b9ed6f942d35e536e249600bc31d0f9df8" +git-tree-sha1 = "19d4bd098928a3263693991500d05d74dbdc2004" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.0+0" +version = "4.2.2+0" [[deps.MPIPreferences]] deps = ["Libdl", "Preferences"] -git-tree-sha1 = "8f6af051b9e8ec597fa09d8885ed79fd582f33c9" +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.10" +version = "0.1.11" [[deps.MPItrampoline_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "77c3bd69fdb024d75af38713e883d0f249ce19c2" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "fde81c9f9c94fe5fbeaed7b3f1330305cf9a327c" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.3.2+0" +version = "5.5.0+0" [[deps.MacroTools]] deps = ["Markdown", "Random"] @@ -354,24 +388,30 @@ version = "2023.1.10" [[deps.NCDatasets]] deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] -git-tree-sha1 = "173a378f357e9bb24b22019efb5e4778223ce8cf" +git-tree-sha1 = "77df6d3708ec0eb3441551e1f20f7503b37c2393" uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -version = "0.13.2" +version = "0.14.5" [[deps.NetCDF_jll]] -deps = ["Artifacts", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "XML2_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "10c612c81eaffdd6b7c28a45a554cdd9d2f40ff1" +deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "XML2_jll", "Zlib_jll", "Zstd_jll", "libzip_jll"] +git-tree-sha1 = "4686378c4ae1d1948cfbe46c002a11a4265dcb07" uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" -version = "400.902.208+0" +version = "400.902.211+1" + +[[deps.Nettle_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "eca63e3847dad608cfa6a3329b95ef674c7160b4" +uuid = "4c82536e-c426-54e4-b420-14f461c4ed8b" +version = "3.7.2+0" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" [[deps.OffsetArrays]] -git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.13.0" +version = "1.14.1" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] @@ -380,7 +420,7 @@ weakdeps = ["Adapt"] [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+2" +version = "0.3.23+4" [[deps.OpenMPI_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] @@ -390,15 +430,21 @@ version = "4.1.6+0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c" +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.13+0" +version = "3.0.15+1" [[deps.OrderedCollections]] git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.6.3" +[[deps.P11Kit_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "2cd396108e178f3ae8dedbd8e938a18726ab2fbf" +uuid = "c2071276-7c44-58a7-b746-946036e04d0a" +version = "0.24.1+0" + [[deps.Parameters]] deps = ["OrderedCollections", "UnPack"] git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" @@ -411,22 +457,22 @@ uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" version = "1.10.0" [[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "fca25670784a1ae44546bcb17288218310af2778" +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.9" +version = "0.7.16" [[deps.PolyesterWeave]] deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.2.1" +version = "0.2.2" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.0" +version = "1.2.1" [[deps.Preferences]] deps = ["TOML"] @@ -469,9 +515,9 @@ version = "0.1.0" [[deps.SLEEFPirates]] deps = ["IfElse", "Static", "VectorizationBase"] -git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" -version = "0.6.42" +version = "0.6.43" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" @@ -495,16 +541,16 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" version = "1.10.0" [[deps.Static]] -deps = ["IfElse"] -git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "87d51a3ee9a4b0d2fe054bdd3fc2436258db2603" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.8.10" +version = "1.1.1" [[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] -git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.5.0" +version = "1.8.0" weakdeps = ["OffsetArrays", "StaticArrays"] [deps.StaticArrayInterface.extensions] @@ -513,9 +559,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.3" +version = "1.9.7" [deps.StaticArrays.extensions] StaticArraysChainRulesCoreExt = "ChainRulesCore" @@ -526,9 +572,9 @@ version = "1.9.3" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" [[deps.StaticArraysCore]] -git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.2" +version = "1.4.3" [[deps.Statistics]] deps = ["LinearAlgebra", "SparseArrays"] @@ -536,14 +582,10 @@ uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" version = "1.10.0" [[deps.StrideArraysCore]] -deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] -git-tree-sha1 = "d6415f66f3d89c615929af907fdc6a3e17af0d8c" +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.5.2" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" +version = "0.5.7" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] @@ -590,23 +632,27 @@ uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [[deps.VectorizationBase]] deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "7209df901e6ed7489fe9b7aa3e46fb788e15db85" +git-tree-sha1 = "e7f5b81c65eb858bed630fe006837b935518aca5" uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" -version = "0.21.65" +version = "0.21.70" [[deps.Wflow]] deps = ["BasicModelInterface", "CFTime", "Dates", "DelimitedFiles", "FieldMetadata", "Glob", "Graphs", "IfElse", "LoggingExtras", "LoopVectorization", "NCDatasets", "Parameters", "Polyester", "ProgressLogging", "Random", "StaticArrays", "Statistics", "TOML", "TerminalLoggers", "UnPack"] -git-tree-sha1 = "29fdf975f5a32b15890182f114b72ea6ba7b21cc" -repo-rev = "master" -repo-url = "../.." +path = "../.." uuid = "d48b7d99-76e7-47ae-b1d5-ff0c1cf9a818" -version = "0.7.3" +version = "0.8.1" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "07e470dabc5a6a4254ffebc29a1b3fc01464e105" +git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.5+0" +version = "2.13.3+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" [[deps.Zlib_jll]] deps = ["Libdl"] @@ -615,9 +661,9 @@ version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.5+0" +version = "1.5.6+1" [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -628,7 +674,13 @@ version = "1.1.2+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" +version = "5.11.0+0" + +[[deps.libzip_jll]] +deps = ["Artifacts", "Bzip2_jll", "GnuTLS_jll", "JLLWrappers", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3282b7d16ae7ac3e57ec2f3fa8fafb564d8f9f7f" +uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" +version = "1.10.1+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] diff --git a/build/wflow_cli/Setup/Installer/Application.Setup.wixproj b/build/wflow_cli/Setup/Installer/Application.Setup.wixproj index b8f77e563..d7c6c0b29 100644 --- a/build/wflow_cli/Setup/Installer/Application.Setup.wixproj +++ b/build/wflow_cli/Setup/Installer/Application.Setup.wixproj @@ -6,7 +6,7 @@ 3.10 {39da8083-e405-42e6-850c-d25685e91f81} 2.0 - 0.7.3 + 0.8.1 Package false diff --git a/docs/getting_started/install.qmd b/docs/getting_started/install.qmd index 54d2ff8c9..dd5e1a80a 100644 --- a/docs/getting_started/install.qmd +++ b/docs/getting_started/install.qmd @@ -6,9 +6,9 @@ Julia](https://julialang.org/downloads/#current_stable_release). Please see [pla specific instructions](https://julialang.org/downloads/platform/) for further installation instructions and if you have trouble installing Julia. -If you are new to Julia, it may be a good idea to check out the [Getting Started section of -the Julia Manual](https://docs.julialang.org/en/v1/manual/getting-started/). Links to other -learning resources can be found at +If you are new to Julia, it might be a good idea to check out the [Getting Started section +of the Julia Manual](https://docs.julialang.org/en/v1/manual/getting-started/). You can also +find additional learning resources at [julialang.org/learning](https://julialang.org/learning/). @@ -17,17 +17,17 @@ Wflow can be used in two different ways, depending on the required use of the co - If you want to stay up-to-date with the latest version, explore and modify the model code, and write your own Julia scripts around the wflow package, we recommend installing wflow as a [Julia](https://julialang.org/) package. -- If you don't need extra features, but just want to run simulations, a complied executable - version is available. This consists of a single executable, `wflow_cli`, allowing you to - run the model via the command line. +- If you don't need extra features, but just want to run simulations, a compiled executable + version is available. This version includes a single executable, `wflow_cli`, which allows + you to run the model via the command line. Below we describe how to install both versions of wflow. ## Installing as Julia package -Wflow is a [Julia](https://julialang.org/) package, that can be installed through several -different ways. Below we show how to install wflow from Julia's package repository, and -how to install the latest version from GitHub. +Wflow is a [Julia](https://julialang.org/) package that can be installed in several ways. +Below, we show how to install wflow from Julia's package repository and how to install the +latest version from GitHub. ### Install from Julia's package repository @@ -42,38 +42,38 @@ pkg> up ``` ::: -Access Julia's package manager and install wflow using: +To access Julia's package manager and install wflow, use: ```julia-repl pkg> add Wflow ``` -This can take a while, especially the first time, since compatible dependencies are also -automatically looked up and installed from the Pkg General registry. +This process can take a while, especially on the first run, as compatible dependencies are +automatically resolved and installed from the Pkg General registry. ### Install from GitHub -It is also possible to install wflow from the `master` branch as follows: +You can also install wflow from the `master` branch on the repository as follows: ```julia-repl pkg> add Wflow#master ``` -This command will track the `master` branch, and will update to the latest commit on that -branch when you run `update`, or simply `up`, in the Pkg REPL. The use of `add` will install -wflow in you home directory under `.julia/packages/Wflow`. Note that packages installed -under `packages` by `add` are supposed to never be altered in that location, for Pkg and -it's automatic dependency handling to work well. +This command tracks the `master` branch and updates to the latest commit on that branch when +you run `update`, or simply `up`, in the Pkg REPL. The `add` installs wflow in your home +directory under `.julia/packages/Wflow`. Note that packages installed under `packages` by +`add` should not be changed in the directory, as the change could disrupt Pkg's automatic +dependency handling. -If you want to make any changes to any of the files in the repository, you need to do -a development install. This can be done using: +If you want to modify any files in the repository, you need to do a development install. +This can be done using: ```julia-repl pkg> dev Wflow ``` -This will clone the git repository, put it under your home directory in `.julia/dev/Wflow`, -and add the wflow package to your project environment. Note that to receive updates, you -have to pull in the latest changes yourself using `git pull`. +This will clone the git repository, place it under your home directory in +`.julia/dev/Wflow`, and add the wflow package to your project environment. To receive +updates, you'll need to pull the latest changes manually using `git pull`. ### Check installation of wflow @@ -83,12 +83,12 @@ Finally, go back to the Julia REPL and try to load wflow: julia> using Wflow ``` -The first time this will take longer as any package that is new or changed needs to be -pre-compiled first, to allow faster loading on subsequent uses. No error messages should -appear, indicating that you have now successfully installed wflow. +The first time you do this, it may take longer as any new or changed packages need to be +precompiled to enable faster loading on subsequent uses. No error messages should appear, +which indicates that you have successfully installed wflow. -Before ending this section, we want to recommend a few tools that can make using and -developing Julia code easier. +Before concluding this section, we recommend a few tools that can make using and developing +Julia code easier. ::: {.callout-tip} There is a section on editors and IDEs for Julia on , scroll @@ -110,17 +110,17 @@ time you start a Julia session. Binaries of `wflow_cli` can be downloaded from our website [download.deltares.nl](https://download.deltares.nl/en/download/wflow/), and are currently -available for Windows. Download and install the `.msi` file. After installing you can see -two folders in the installation directory. It is only the `bin/wflow_cli` that is used. The -artifacts folder contains binary dependencies such as netCDF. +available for Windows. Download and install the `.msi` file. After installation, you will +see two folders in the installation directory. Only the `bin/wflow_cli` is used. The +`artifacts` folder contains binary dependencies such as netCDF. ``` artifacts\ bin\wflow_cli ``` -Check whether the installation was performed successfully by running `wflow_cli` with no -arguments in the command line. This will give the following message: +To verify whether the installation was completed successfully, run `wflow_cli` with no +arguments in the command line. This will display the following message: ``` Usage: wflow_cli 'path/to/config.toml' diff --git a/docs/home/case_studies.qmd b/docs/home/case_studies.qmd index 733ace255..be5a3debe 100644 --- a/docs/home/case_studies.qmd +++ b/docs/home/case_studies.qmd @@ -4,16 +4,16 @@ title: "Case studies" ## Wflow models for the Meuse and Rhine -Reliable hydrological models for the Rhine and the Meuse river basin are necessary for +Reliable hydrological models for the Rhine and the Meuse river basins are necessary for short-term forecasting of river flows and long-term predictions for strategic water -management planning. In collaboration with Rijkswaterstaat, Deltares is setting up a new +management planning. In collaboration with Rijkswaterstaat, Deltares is developing a new line of models for the Rhine and the Meuse basins. The models will be used for forecasting and to estimate the impact of climate change on water resources and extreme streamflow. In -the model development, we seek to improve hydrological predictions by including relevant +the model development, we aim to improve hydrological predictions by including relevant processes in the model schematization. The modularity of the wflow framework is ideal for this as we can easily evaluate the combination of different vertical and lateral model components. For example, the local inertial routing for river and overland flow enables us -to consider retention of water in the floodplains, which will likely improve extreme +to consider retention of water in the floodplains, which is likely to improve extreme streamflow predictions. ![](../images/case_rhine_meuse.png) @@ -22,26 +22,26 @@ streamflow predictions. In Australia, there was a need for high-resolution, fast and accurate rainfall-runoff models to provide boundary conditions for a fast and detailed flood inundation model (SFINCS). The -domain of the flood model covers the complete North and East Coast of Australia. Although +domain of the flood model covers the entire North and East Coast of Australia. Although many gauging stations are available to provide real-time information, many rivers are not covered. For these locations, wflow\_sbm models are used to provide this real-time information. Additionally, these models are used to provide projections for potential future scenarios. Using the HydroMT library, all wflow\_sbm models were automatically built. The -high level of flexibility in spatial and temporal resolution, and the physics-based nature -of the concept makes wflow\_sbm a very suitable model for ungauged basins. Furthermore, the -model is sufficiently detailed and computationally efficient for a coupling with the fast +high level of flexibility in spatial and temporal resolution, combined with the physics-based nature +of the concept, makes Wflow\_sbm particularly suitable for ungauged basins. Furthermore, the +model is detailed and computationally efficient enough for coupling with the fast flood inundation model SFINCS. ![](../images/case_flifs_1.png) -The results of this Proof of Concept are very promising. Technically, we were able to very -quickly setup the wflow\_sbm models, couple them to the flood inundation models (SFINCS) and -run the models operationally under the Delft-FEWS platform. Model validation was carried out -for two basins by comparing the results of wflow\_sbm against the observations and the -results of calibrated URBS models. This validation showed that the uncalibrated wflow\_sbm -model results were already quite satisfying, especially given the complex nature of these -basins, including several small and big reservoirs. We could also demonstrate the potential -for further calibration by changing the KsatHorFrac parameter. +The results of this proof of concept are very promising. Technically, we were able to +quickly set up the wflow\_sbm models, couple them to the flood inundation models (SFINCS), and +run the models operationally under the Delft-FEWS platform. Model validation was conducted +for two basins by comparing the results of Wflow\_sbm against observations and the +results of calibrated URBS models. This validation demonstrated that the uncalibrated Wflow\_sbm +model results were already quite satisfactory, especially given the complex nature of these +basins, which include several small and large reservoirs. We could also show the potential +for further calibration by adjusting the KsatHorFrac parameter. Reference: De Kleermaeker, S., Leijnse, T., Morales, Y., Druery, C., Maguire, S., 1. Developing a real-time data and modelling framework for operational flood inundation @@ -53,30 +53,30 @@ Reference: De Kleermaeker, S., Leijnse, T., Morales, Y., Druery, C., Maguire, S. ## Simulating plastic transport in Thailand -For the Polution Control Board of the Government of Thailand and the World Bank, we -supported the material flow analysis of plastics in Thailand using wflow. Plastic polution -is a growing global problem. Plastic waste enters the rivers and is transported to the ocean -where it remains and threatens the health of the ocean, seas and coasts. The initial +For the Pollution Control Board of the Government of Thailand and the World Bank, we +supported a material flow analysis of plastics in Thailand using wflow. Plastic pollution +is a growing global issue. Plastic waste enters rivers and is transported to the ocean +where it persists and threatens the health of the ocean, seas and coasts. The initial movement of plastic waste is in many cases triggered by runoff from (heavy) rainfall and -transported by the flow of water towards small streams and rivers. Therefore there is strong +transported by water flow towards small streams and rivers. Therefore there is strong relation to rainfall-runoff processes, which can be modeled using high-resolution rainfall-runoff models. In this study we applied the wflow\_sbm model in combination with a fate-and-transport and -water quality model (DelWaq) to simulate the movement of plastics through 5 large river -basins and on 3 island and coastal zones (Krabi, Phuket and Ko Samui, see screenshot of the +water quality model (DelWaq) to simulate the movement of plastics through five large river +basins and on three island and coastal zones (Krabi, Phuket, and Ko Samui; see screenshot of the model below) in Thailand. Together with our partners Panya Consultants and HII, we were able -to show hotspots of plastic polution, how much plastic waste would end up in the Gulf of -Thailand and what would be priority areas for reducing plastic waste reaching the sea. +to identify hotspots of plastic pollution, estimate how much plastic waste would end up in the Gulf of +Thailand and recommend priority areas for reducing plastic waste reaching the sea. ![](../images/case_mfa_1.png) -The wflow\_sbm models for the 5 large basins were calibrated. The presence of large dams and -reservoirs complicated the calibration, but with the input for the operation of the dams, +The wflow\_sbm models for the five large basins were calibrated. The presence of large dams and +reservoirs complicated calibration, but with the input for the dam operation, the model performance for these basins could be largely improved. The figure below shows the calibrated model results for the Chao Phraya, just upstream of Bangkok. The input from the hydrological wflow\_sbm model was used as input for the fate and transport model to assess -how much plastic would be transported to the ocean. +the amount of plastic transported to the ocean. ![](../images/case_mfa_3.png) diff --git a/docs/home/publications.qmd b/docs/home/publications.qmd index fee5e6800..1e1cf6a26 100644 --- a/docs/home/publications.qmd +++ b/docs/home/publications.qmd @@ -55,6 +55,11 @@ to improve hydrological assessment and snow water equivalent estimation in a sub watershed. Hydrol. Earth Syst. Sci., 22, 4685–4697. . +Droppers, B., Rakovec, O., Avila, L., Azimi, S., Cortés-Torres N., De León Pérez, D., +Imhoff, R., Francés, F., Kollet, S., Rigon, R., Weerts, A. & Samaniego, L, 2024. Multi-model +hydrological reference dataset over continental Europe and an African basin. Sci Data, 11, +1009\. . + Emerton, R.E., Stephens, E.M., Pappenberger, F., Pagano, T.C., Weerts, A.H., Wood, A.W., Salamon, P., Brown, J.D., Hjerdt, N., Donnelly, C., Baugh, C.A., Cloke, H.L., 2016. Continental and global scale flood forecasting systems. WIREs Water 3, 391–418. @@ -83,10 +88,15 @@ response to land use and land cover changes using satellite data and hydrologica case study of Dinder and Rahad tributaries of the Blue Nile (Ethiopia–Sudan), Hydrol. Earth Syst. Sci., 21, 5217–5242. . +Imhoff, R.O., Buitink, J., van Verseveld, W.J., Weerts, A.H., 2024. A fast high resolution +distributed hydrological model for forecasting, climate scenarios and digital twin +applications using wflow_sbm. Environmental Modelling & Software, 179, 106099. + + Imhoff, R.O, van Verseveld, W.J., van Osnabrugge, B., Weerts, A.H., 2020. Scaling Point-Scale (Pedo)transfer Functions to Seamless Large-Domain Parameter Estimates for High-Resolution Distributed Hydrologic Modeling: An Example for the Rhine River. Water -Resources Research,56,e2019WR026807. . +Resources Research, 56, e2019WR026807. . Imhoff, R.O., van Verseveld, W., van Osnabrugge, B., Weerts, A.H., 2020. Ruimtelijk schaalbare hydrologische modelparameters uit open-source omgevingsdata: een voorbeeld voor @@ -103,13 +113,11 @@ M.F.P., 2016. Improved large-scale hydrological modelling through the assimilati streamflow and downscaled satellite soil moisture observations. Hydrol. Earth Syst. Sci., 20, 3059–3076. . -van Osnabrugge, B., Weerts, A.H., Uijlenhoet, R., 2017. genRE: A method to extend gridded -precipitation climatology data sets in near real-time for hydrological forecasting purposes. -Water Resources Research, 53. . - -van Osnabrugge, B., Uijlenhoet, R., Weerts, A., 2019. Contribution of potential evaporation -forecasts to 10-day streamflow forecast skill for the Rhine River, Hydrol. Earth Syst. Sci., -23, 1453–1467, . +Pranoto, B., Soekarno, H., Hartulistiyoso, E., Nur Aidi, M., Sutrisno, D., Pohan, D., +Radhika, Sutejo, B., Heru Kuncoro, A., Nahib, I., 2024. Integrating Flood Early Warning +System (FEWS) for Optimizing Small Hydropower Sites: A West Java Case Study. EVERGREEN Joint +Journal of Novel Carbon Resource Sciences & Green Asia Strategy, 11, 3, 2691-2699. + Rakovec, O., Weerts, A.H., Sumihar, J., Uijlenhoet, R., 2015. Operational aspects of asynchronous filtering for flood forecasting. Hydrol. Earth Syst. Sci., 19, 2911–2924, @@ -141,6 +149,11 @@ T., van den Oord, G., Weerts, A., Whan, K., 2020. The role of spatial and tempor resolution in a flood event storyline approach in western Norway. Weather and Climate Extremes, doi: . +Seizarwati, W. and M. Syahidah, 2021. Rainfall-Runoff Simulation for Water Availability +Estimation in Small Island Using Distributed Hydrological Model wflow. IOP Conf. Ser.: +Earth Environ. Sci., 930,012050, doi:10.1088/1755-1315/930/1/012050. + + Sperna Weiland, F.C., R.D. Visser, P. Greve, B. Bisselink, L. Brunner and A.H. Weerts, 2021\. Estimating Regionalized Hydrological Impacts of Climate Change Over Europe by Performance-Based Weighting of CORDEX Projections, Frontiers of Water, @@ -155,6 +168,14 @@ van der Laan, E., P. Hazenberg, A.H. Weerts, 2024. Simulation of long-term stora of headwater reservoirs across the globe using public cloud computing infrastructure. Science of The Total Environment, 172678, . +van Osnabrugge, B., Weerts, A.H., Uijlenhoet, R., 2017. genRE: A method to extend gridded +precipitation climatology data sets in near real-time for hydrological forecasting purposes. +Water Resources Research, 53. . + +van Osnabrugge, B., Uijlenhoet, R., Weerts, A., 2019. Contribution of potential evaporation +forecasts to 10-day streamflow forecast skill for the Rhine River, Hydrol. Earth Syst. Sci., +23, 1453–1467, . + van der Vat, M., Boderie, P., Bons, K.A., Hegnauer, M., Hendriksen, G., van Oorschot, M., Ottow, B., Roelofsen, F., Sankhua, R.N., Sinha, S.K., Warren, A., Young, W., 2019. Participatory Modelling of Surface and Groundwater to Support Strategic Planning in the @@ -240,6 +261,11 @@ Tretjakova, D., 2015. Investigating the effect of using fully-distributed model assimilation on the performance of hydrological forecasting in the Karasu catchment, Turkey, MSc thesis, Wageningen University. +van der Gaast, R.H., 2024. Evaluating the transferability of data-driven pedo-transfer +functions for the wflow\_sbm parameter KsatHorFrac in central and Western Europe. +Universiteit Twente, Enschede, The Netherlands, +. + Verbrugge, M., 2019. Reservoir Operation Optimization, a case study in the Chao Phraya Basin, BSc thesis, Hydrology and Quantitative Water Management Group, Wageningen University. @@ -265,3 +291,6 @@ Plastics Series;. World Bank, Washington, DC. © World Bank, World Meteorological Organization (WMO), 2023. State of Global Water Resources report 2022, WMO-No. 1333, . + +World Meteorological Organization (WMO), 2024. State of Global Water Resources report 2023, +WMO-No. 1362, . diff --git a/docs/model_docs/lateral/gwf.qmd b/docs/model_docs/lateral/gwf.qmd index 847cb767f..33f4a8b6a 100644 --- a/docs/model_docs/lateral/gwf.qmd +++ b/docs/model_docs/lateral/gwf.qmd @@ -13,40 +13,39 @@ Single layer groundwater flow requires the four following components, and each i Groundwater flow can occur either in a confined or unconfined aquifer. Confined aquifers are overlain by a poorly permeable confining layer (e.g. clay). No air can get in to fill the pore space so that the aquifer always remains fully saturated. For a confined aquifer, water -will always flow along the complete height $H$ [m] over the aquifer and transmissivity -$kH$ [m$^2$ d$^{-1}$] is a constant ($k$ [m d$^{-1}$] is the horizontal hydraulic +will always flow along the complete height $\SIb{H}{m}$ over the aquifer and transmissivity +$\SIb{kH}{m^2 d^{-1}}$ is a constant ($\SIb{k}{m d^{-1}}$ is the horizontal hydraulic conductivity). Specific storage is the amount of water an aquifer releases per unit change in hydraulic head, per unit volume of aquifer, as the aquifer and the groundwater itself is -compressed. Its value is much smaller than specific yield, between 1e-5 (stiff) and 0.01 +compressed. Its value is much smaller than specific yield, between $10^{-5}$ (stiff) and $10^{-2}$ (weak). The upper boundary of an unconfined aquifer is the water table (the phreatic surface). Specific yield (or drainable porosity) represents the volumetric fraction the aquifer will yield when all water drains and the pore volume is filled by air instead. -Specific yield will vary roughly between 0.05 (clay) and 0.45 (peat) (Johnson, 1967). +Specific yield will vary roughly between $0.05$ (clay) and $0.45$ (peat) (Johnson, 1967). Groundwater flow is solved forward in time and central in space. The vertically averaged governing equation for an inhomogeneous and isotropic aquifer in one dimension can be written as: $$ -S \frac{\phi}{\delta t} = \frac{\delta}{\delta x} (kH \frac{\phi}{\delta x}) + Q + S \frac{\partial \phi}{\partial t} = \frac{\partial}{\partial x} \left(kH \frac{\phi}{\delta x}\right) + Q $$ -where $S$ [m m$^{-1}$] is storativity (or specific yield), $\phi$ [m] is hydraulic -head, $t$ is time, $k$ [m t$^{-1}$] is horizontal hydraulic conductivity, $H$ [m] is -the (saturated) aquifer height: groundwater level - aquifer bottom elevation and $Q$ [m -t$^{-1}$] represents fluxes from boundary conditions (e.g. recharge or abstraction), see +where $\SIb{S}{m m^{-1}}$ is storativity (or specific yield), $\SIb{\phi}{m}$ is hydraulic +head, $t$ is time, $\SIb{k}{m t^{-1}}$ is horizontal hydraulic conductivity, $\SIb{H}{m}$ is +the (saturated) aquifer height: groundwater level - aquifer bottom elevation and $\SIb{Q}{m t^{-1}}$ represents fluxes from boundary conditions (e.g. recharge or abstraction), see also [Aquifer boundary conditions](@ref). The simplest finite difference formulation is forward in time, central in space, and can be written as: $$ -S_i \frac{(\phi_{i}^{t+1} - \phi_i^{t})}{\Delta t} = -C_{i-1} (\phi_{i-1} - \phi_i) - C_i (\phi_{i+1} - \phi_i) + Q_ᵢ + S_i \frac{\phi_{i}^{t+1} - \phi_i^{t}}{\Delta t} = -C_{i-1} (\phi_{i-1} - \phi_i) - C_i (\phi_{i+1} - \phi_i) + Q_i $$ -where $_i$ is the cell index, $^t$ is time, $\Delta t$ is the step size, $C_{i-1}$ +where $i$ is the cell index, $t$ is time, $\Delta t$ is the step size, $C_{i-1}$ is the the intercell conductance between cell $i-1$ and $i$ and $C_i$ is the intercell conductance between cell $i$ and $i+1$. The connection data between cells is stored as part of the `Connectivity` struct, see also [Connectivity](@ref) for more information. @@ -57,17 +56,17 @@ $$ C = \frac{kH w}{l} $$ -where $w$ [m] is the width of the cell to cell connection, and $l$ [m] is the length of +where $\SIb{w}{m}$ is the width of the cell to cell connection, and $\SIb{l}{m}$ is the length of the cell to cell connection. $k$ and $H$ may both vary in space; intercell conductance is therefore an average using the properties of two cells. For the calculation of the intercell conductance $C$ the harmonic mean is used (see also Goode and Appel, 1992), here between cell index $i$ and cell index $i+1$, in the $x$ direction: $$ -C_i = w \frac{(k_iH_i\cdot k_{i+1}H_{i+1})}{(k_iH_i \cdot l_{i+1} + k_{i+1}H_{i+1} \cdot l_i)} + C_i = w \frac{k_iH_i\cdot k_{i+1}H_{i+1}}{k_iH_i \cdot l_{i+1} + k_{i+1}H_{i+1} \cdot l_i} $$ -where $H$ [m] is the aquifer top - aquifer bottom, and $k$, $l_i$ is the length in +where $\SIb{H}{m}$ is the aquifer top - aquifer bottom, and $k$, $l_i$ is the length in cell $i$ ($0.5 \Delta x_i$), $l_{i+1}$ is the length in cell $i+1$ ($0.5 \Delta x_{i+1}$) and $w$ as previously defined. For an unconfined aquifer the intercell conductance is scaled by using the "upstream saturated fraction" as the MODFLOW @@ -91,13 +90,13 @@ Finally, a stable time step size can be computed given the forward-in-time, cent scheme, based on the following criterion from Chu and Willis (1984): $$ -\frac{\Delta t k H}{(\Delta x \Delta y S)} \le \frac{1}{4} + \frac{\Delta t k H}{\Delta x \Delta y S} \le \frac{1}{4} $$ -where $\Delta t$ [d] is the stable time step size, $\Delta x$ [m] is the cell length in -the $x$ direction and $\Delta y$ [m] is the cell length in the $y$ direction, $k$ is -the horizontal hydraulic conductivity [m$^2$ d$^{-1}$] and $H$ [m] is the saturated -thickness of the aquifer. For each cell $\frac{(\Delta x \Delta y S)}{k H}$ is +where $\SIb{\Delta t}{d}$ is the stable time step size, $\SIb{\Delta x}{m}$ is the cell length in +the $x$ direction and $\SIb{\Delta y}{m}$ is the cell length in the $y$ direction, $\SIb{k}{m^2 d^{-1}}$ is +the horizontal hydraulic conductivity and $\SIb{H}{m}$ is the saturated +thickness of the aquifer. For each cell $\frac{\Delta x \Delta y S}{k H}$ is calculated, the minimum of these values is determined, and multiplied by $\frac{1}{4}$, to get the stable time step size. @@ -149,39 +148,44 @@ The flux between river and aquifer is calculated using Darcy's law following the MODFLOW: $$ -Q_{riv} = \Bigg\lbrace{C_{i} \,\text{min}(h_{riv} - B_{riv}, h_{riv} - \phi), \,h_{riv} > \phi \atop C_{e} (h_{riv} - \phi) , \,h_{riv} \leq \phi} + \subtext{Q}{riv} = + \begin{align*} + \begin{cases} + C_i \min \left\{\subtext{h}{riv} - \subtext{B}{riv}, \subtext{h}{riv} - \phi\right\} &\text{ if }\quad \subtext{h}{riv} > \phi \\ + C_e (\subtext{h}{riv} - \phi) &\text{ if }\quad \subtext{h}{riv} \le \phi + \end{cases} + \end{align*} $$ -where $Q_{riv}$ is the exchange flux from river to aquifer [L$^3$ T$^{-1}$], $C_i$ -[L$^2$ T$^{-1}$] is the river bed infiltration conductance, $C_e$ [L$^2$ T$^{-1}$] -is the river bed exfiltration conductance, $B_{riv}$ the bottom of the river bed [L], -$h_{riv}$ is the river stage [L] and $\phi$ is the hydraulic head in the river cell [L]. +where $\SIb{\subtext{Q}{riv}}{L^3 T^{-1}}$ is the exchange flux from river to aquifer, $\SIb{C_i}{L^2 T^{-1}}$ is the river bed infiltration conductance, $\SIb{C_e}{L^2 T^{-1}}$ +is the river bed exfiltration conductance, $\SIb{\subtext{B}{riv}}{L}$ the bottom of the river bed, +$\SIb{\subtext{h}{riv}}{L}$ is the river stage and $\SIb{\phi}{L}$ is the hydraulic head in the river cell. The Table in the Groundwater flow [river boundary condition](@ref gwf_river_params) section of the Model parameters provides the parameters of the struct `River`. Parameters that can be set directly from the static input data (netCDF) are marked in this Table. -The exchange flux (river to aquifer) $Q_{riv}$ is an output variable (field `flux` of the +The exchange flux (river to aquifer) $\subtext{Q}{riv}$ is an output variable (field `flux` of the `River` struct), and is used to update the total flux in a river cell. For the model `SBM + -Groundwater flow`, the water level `h` [m] of the river kinematic wave in combination with +Groundwater flow`, the water level $\SIb{h}{m}$ of the river kinematic wave in combination with the river `bottom` is used to update the `stage` field of the `River` struct each time step. ### Drainage The flux from drains to the aquifer is calculated as follows: $$ -Q_{drain} = C_{drain} \text{min}(0, h_{drain} - \phi) +\subtext{Q}{drain} = \subtext{C}{drain} \min(0, \subtext{h}{drain} - \phi) $$ -where $Q_{drain}$ is the exchange flux from drains to aquifer [L$^3$ T$^{-1}$], -$C_{drain}$ [L$^2$ T$^{-1}$] is the drain conductance, $h_{drain}$ is the drain -elevation [L] and $\phi$ is the hydraulic head in the cell with drainage [L]. +where $\SIb{\subtext{Q}{drain}}{L^3 T^{-1}}$ is the exchange flux from drains to aquifer, +$\SIb{\subtext{C}{drain}}{L^2 T^{-1}}$ is the drain conductance, $\SIb{\subtext{h}{drain}}{L}$ is the drain +elevation and $\SIb{\phi}{L}$ is the hydraulic head in the cell with drainage. -The Table in the Groundwater flow [drainage boundary condition](@ref gwf_drainage_params) +The table in the Groundwater flow [drainage boundary condition](@ref gwf_drainage_params) section of the Model parameters provides the parameters of the struct `Drainage`. Parameters that can be set directly from the static input data (netCDF) are marked in this Table. -The exchange flux (drains to aquifer) $Q_{drain}$ is an output variable (field `flux` of +The exchange flux (drains to aquifer) $\subtext{Q}{drain}$ is an output variable (field `flux` of struct `Drainage`), and is used to update the total flux in a cell with drains. For the model `SBM + Groundwater flow` this boundary condition is optional, and if used should be specified in the TOML file as follows (see also @@ -193,16 +197,16 @@ drains = true ``` ### Recharge -The recharge flux $Q_{r}$ to the aquifer is calculated as follows: +The recharge flux $Q_r$ to the aquifer is calculated as follows: $$ -Q_{r} = R \, A +Q_r = R \, A $$ -with $R$ the recharge rate [L T$^{-1}$] and $A$ the area [L$^2$ ] of the aquifer +with $\SIb{}{L T^{-1}}$ the recharge rate and $\SIb{A}{L^2}$ the area of the aquifer cell. -The Table in the Groundwater flow [recharge boundary condition](@ref gwf_recharge_params) +The table in the Groundwater flow [recharge boundary condition](@ref gwf_recharge_params) section of the Model parameters section provides the parameters of the struct `Recharge`. Parameters that can be set directly from the static input data (netCDF) are marked in this Table. @@ -217,16 +221,16 @@ multiplied by the `area` field of the aquifer. This boundary is a fixed head with time (not affected by the model stresses over time)) outside of the model domain, and is generally used to avoid an unnecessary extension of the model domain to the location of the fixed boundary (for example a large lake). The flux from -the boundary $Q_{hb}$ [L$^3$ T$^{-1}$] is calculated as follows: +the boundary $\SIb{Q_{hb}}{L^3 T^{-1}}$ is calculated as follows: $$ Q_{hb} = C_{hb} (\phi_{hb} - \phi) $$ -with $C_{hb}$ the conductance of the head boundary [L$^2$ T$^{-1}$], $\phi_{hb}$ the -head [L] of the head boundary and $\phi$ the head of the aquifer cell. +with $\SIb{C_{hb}}{L^2 T^{-1}}$ the conductance of the head boundary, $\SIb{\phi_{hb}}{L}$ the +head of the head boundary and $\phi$ the head of the aquifer cell. -The Table in the Groundwater flow [head boundary condition](@ref gwf_headboundary_params) +The table in the Groundwater flow [head boundary condition](@ref gwf_headboundary_params) section of the Model parameters provides the parameters of the struct `HeadBoundary`. The head boundary flux $Q_{hb}$ is an output variable (field `flux` of struct @@ -239,12 +243,12 @@ This boundary is not (yet) part of the model `SBM + Groundwater flow`. ::: ### Well boundary -A volumetric well rate [L$^3$ T$^{-1}$] can be specified as a boundary condition. +A volumetric well rate $\SIb{}{L^3 T^{-1}}$ can be specified as a boundary condition. The Table in the [well boundary condition](@ref well_boundary_params) section of the Model parameters provides the parameters of the struct `Well`. -The volumetric well rate $Q_{well}$ can be can be specified as a fixed or time dependent +The volumetric well rate $\subtext{Q}{well}$ can be can be specified as a fixed or time dependent value. If a cell is dry, the actual well flux `flux` is set to zero (see also the last note on this page). diff --git a/docs/model_docs/lateral/kinwave.qmd b/docs/model_docs/lateral/kinwave.qmd index 947c90279..119b56148 100644 --- a/docs/model_docs/lateral/kinwave.qmd +++ b/docs/model_docs/lateral/kinwave.qmd @@ -3,27 +3,27 @@ title: Kinematic wave --- ## Surface routing -The main flow routing scheme available in Wflow.jl is the kinematic wave approach for -channel and overland flow, assuming that the topography controls water flow mostly. The +The main flow routing scheme available in `Wflow.jl` is the kinematic wave approach for +channel and overland flow, assuming that water flow is mostly controlled by topography. The kinematic wave equations are (Chow, 1988): + $$ -\begin{split} -\dfrac{dQ}{dx} + \dfrac{dA}{dt} &= q \\ -A &= \alpha Q^{\beta} -\end{split} + \dfrac{\partial Q}{\partial x} + \dfrac{\partial A}{\partial t} = q, \\~\\ + A = \alpha Q^{\beta}. $$ These equations can then be combined as a function of streamflow only: + $$ -\dfrac{dQ}{dx} + \alpha \beta Q^{\beta - 1} \dfrac{dQ}{dt} = q + \dfrac{\partial Q}{\partial x} + \alpha \beta Q^{\beta - 1} \dfrac{\partial Q}{\partial t} = q. $$ -where $Q$ is the surface runoff in the kinematic wave [m$^3$/s], $x$ is the length of -the runoff pathway [m], $A$ is the cross-section area of the runoff pathway [m$^{2}$], -$t$ is the integration timestep [s] and $\alpha$ and $\beta$ are coefficients. +Here $\SIb{Q}{m^3 s^{-1}}$ is the surface runoff in the kinematic wave, $\SIb{x}{m}$ is the length of +the runoff pathway, $\SIb{A}{m}$ is the cross-section area of the runoff pathway, +$\SIb{t}{s}$ is the integration timestep and $\alpha$ and $\beta$ are unitless coefficients. These equations are solved with a nonlinear scheme using Newton's method and can also be -iterated depending on the model space and time resolution. By default, the iterations are +iterated depending on the model space and time resolution. By default, the iterations are performed until a stable solution is reached ($\epsilon < 10^{-12}$). For larger models, the number of iterations can also be fixed for to a specific sub-timestep (in seconds) for both overland and channel flows to improve simulation time. To enable (fixed or not) @@ -42,7 +42,7 @@ kw_land_tstep = 3600 The $\alpha$ parameter of the kinematic wave is fixed. To estimate the wetted perimeter for the calculation of the $\alpha$ parameter a bankfull river depth map (default value -is 1.0 m) for the river can be provided as follows: +is $\SI{1.0}{m}$) for the river can be provided as follows: ```toml [input.lateral.river] @@ -56,12 +56,12 @@ Simplified [reservoir and lake](@ref reservoir_lake) models can be included as p river kinematic wave network. ## Inflow -External water (supply/abstraction) `inflow` [m$^3$ s$^{-1}$] can be added to the +External water (supply/abstraction) `inflow` $\SIb{}{m^3 s^{-1}}$ can be added to the kinematic wave for surface water routing, as a cyclic parameter or as part of forcing (see also [Input section](@ref)). ## Abstractions -Abstractions from the river through the variable `abstraction` [m$^3$ s${-1}$] are +Abstractions from the river through the variable `abstraction` $\SIb{}{m^3 s^{-1}}$ are possible when water demand and allocation is computed. The variable `abstraction` is set from the water demand and allocation module each time step. The `abstraction` is divided by the length of the runoff pathway and subtracted from the lateral inflow of the kinematic @@ -76,58 +76,62 @@ detailed description) are available: - `exponential` (default) - `exponential_constant` - `layered` -- `layered_exponential` -For the profiles `exponential` and `exponential_constant`, the saturated store $S$ is -drained laterally by saturated downslope subsurface flow for a slope with width $w$ [m] +- `layered_exponential` + +For the profiles `exponential` and `exponential_constant`, the saturated store ``S`` is +drained laterally by saturated downslope subsurface flow for a slope with width ``\SIb{w}{m}`` according to: + $$ -Q = \begin{cases} -\frac{K_0\tan(\beta)}{f}\left(e^{(-fz_{i})}-e^{(-fz_\mathrm{exp})}\right) w + -K_0e^{(-fz_\mathrm{exp})}(z_t-z_\mathrm{exp})\tan(\beta) w & \text{if $z_i < z_\mathrm{exp}$}\\ -\\ -K_0e^{(-fz_\mathrm{exp})}(z_t - z_i)\tan(\beta) w & \text{if $z_i \ge z_\mathrm{exp}$}, -\end{cases} + Q = K_0\tan(\beta)w\begin{cases} + \frac{1}{f}\left(e^{-fz_i}-e^{-f\subtext{z}{exp}}\right) + + e^{-f\subtext{z}{exp}}(z_t-\subtext{z}{exp}) & \text{if $z_i < \subtext{z}{exp}$}\\ + \\ + e^{-f\subtext{z}{exp}}(z_t - z_i) & \text{if $z_i \ge \subtext{z}{exp}$}, + \end{cases} $$ -where $\beta$ is element slope angle, $Q$ is subsurface flow [m$^{3}$ d$^{-1}$], -$K_0$ is the saturated hydraulic conductivity at the soil surface [m d$^{-1}$], $z_i$ -is the water table depth [m], $z_{t}$ is the total soil depth [m], $f$ is a scaling -parameter [m$^{-1}$] that controls the decrease of $K_0$ with depth and -$z_\mathrm{exp}$ [m] is the depth from soil surface for which the exponential decline of -$K_0$ is valid. For the `exponential` profile, $z_\mathrm{exp}$ is equal to $z_t$. +where $\beta$ is element slope angle, $\SIb{Q}{m^3 d^{-1}}$ is subsurface flow, +$\SIb{K_0}{m d^{-1}}$ is the saturated hydraulic conductivity at the soil surface, $\SIb{z_i}{m}$ +is the water table depth, $\SIb{z_{t}}{m}$ is the total soil depth, $\SIb{f}{m^{-1}}$ is a scaling +parameter that controls the decrease of $K_0$ with depth and +$\SIb{\subtext{z}{exp}}{m}$ is the depth from soil surface for which the exponential decline of +$K_0$ is valid. For the `exponential` profile, $\subtext{z}{exp}$ is equal to $z_t$. Combining with the following continuity equation: $$ -(\theta_s-\theta_r)w\frac{\partial h}{\partial t} = -\frac{\partial Q}{\partial x} + wr + (\theta_s-\theta_r)w\frac{\partial h}{\partial t} = -\frac{\partial Q}{\partial x} + wr $$ -where $h$ is the water table height [m], $x$ is the distance downslope [m], and $r$ is -the net input rate [m d$^{-1}$] to the saturated store. Substituting for $h +where $\SIb{h}{m}$ is the water table height, $\SIb{x}{m}$ is the distance downslope, and $\SIb{r}{m d^{-1}}$ is +the net input rate to the saturated store. Substituting for $h (\frac{\partial Q}{\partial h})$, gives: + $$ -\frac{\partial Q}{\partial t} = -c\frac{\partial Q}{\partial x} + cwr + \frac{\partial Q}{\partial t} = -c\frac{\partial Q}{\partial x} + cwr $$ where celerity $c$ is calculated as follows: $$ -c = \begin{cases} -\frac{K_0e^{(-fz_{i})}\tan(\beta)}{(\theta_s-\theta_r)} -+ \frac{K_0e^{(-fz_\mathrm{exp})}\tan(\beta)}{(\theta_s-\theta_r)} & \text{if $z_i < z_\mathrm{exp}$}\\ -\\ -\frac{K_0e^{(-fz_\mathrm{exp})}\tan(\beta)}{(\theta_s-\theta_r)} & \text{if $z_i \ge z_\mathrm{exp}$}. -\end{cases} + c = \frac{K_0 \tan(\beta)}{\theta_s-\theta_r}\begin{cases} + e^{-fz_i} + + e^{-f\subtext{z}{exp}} & \text{if $z_i < \subtext{z}{exp}$}\\ + \\ + e^{-f\subtext{z}{exp}} & \text{if $z_i \ge \subtext{z}{exp}$}. + \end{cases} $$ For the `layered` and `layered_exponential` profiles the equivalent horizontal hydraulic -conductivity $K_h$ [m d$^{-1}$] is calculated for water table height $h = z_t-z_i$ -[m], and lateral subsurface flow is calculated as follows: +conductivity $\SIb{K_h}{m d^{-1}}$ is calculated for water table height $\SIb{h = z_t-z_i}{m}$ and lateral subsurface flow is calculated as follows: + $$ -Q = K_h h \tan(\beta) w, + Q = K_h h \tan(\beta) w, $$ and celerity $c$ is given by: + $$ -c = \frac{K_h \tan(\beta)}{(\theta_s-\theta_r)}. + c = \frac{K_h \tan(\beta)}{\theta_s-\theta_r}. $$ The kinematic wave equation for lateral subsurface flow is solved iteratively using Newton's diff --git a/docs/model_docs/lateral/local-inertial.qmd b/docs/model_docs/lateral/local-inertial.qmd index 0bcdb408b..da9fa0c82 100644 --- a/docs/model_docs/lateral/local-inertial.qmd +++ b/docs/model_docs/lateral/local-inertial.qmd @@ -11,34 +11,34 @@ $$ Q_{t+\Delta t} = \frac{Q_t - g A_t \Delta t S_t}{(1+g\Delta t n^2 |Q_t| / (R_t^{4/3} A_t))} $$ -where $Q_{t+\Delta t}$ is the river flow [m$^3$/s] at time step $t+\Delta t$, $g$ is -acceleration due to gravity [m/s$^2$], $A_t$ is the cross sectional flow area at the -previous time step, $R_t$ is the hydraulic radius at the previous time step, $Q_t$ is -the river flow [m$^3$/s] at the previous time step, $S_t$ is the water surface slope at -the previous time step and $n$ is the Manning's roughness coefficient [m$^{-1/3}$ s]. +where $\SIb{Q_{t+\Delta t}}{m^3 s^{-1}}$ is the river flow at time step $t+\Delta t$, $\SIb{g}{m s^{-2}}$ is +acceleration due to gravity, $\SIb{A_t}{m^2}$ is the cross sectional flow area at the +previous time step, $\SIb{R_t}{m}$ is the hydraulic radius at the previous time step, $\SIb{Q_t}{m^3 s^{-1}}$ is +the river flow at the previous time step, $S_t$ is the water surface slope at +the previous time step and $\SIb{n}{m^{-\frac{1}{3}} s}$ is the Manning's roughness coefficient. The momentum equation is applied to each link between two river grid cells, while the continuity equation over $\Delta t$ is applied to each river cell: $$ -h^{t+\Delta t} = h^t + \Delta t \frac{Q^{t+\Delta t}_{src} - Q^{t+\Delta t}_{dst}}{A} +h^{t+\Delta t} = h^t + \Delta t \frac{\subtext{Q^{t+\Delta t}}{src} - \subtext{Q^{t+\Delta t}}{dst}}{A} $$ -where $h^{t+\Delta t}$ is the water depth [m] at time step $t+\Delta t$, $h^t$ is the -water depth [m] at the previous time step, $A$ is the river area [m$^2$] and $Q_{src}$ -and $Q_{dst}$ represent river flow [m$^3$/s] at the upstream and downstream link of the +where $\SIb{h^{t+\Delta t}}{m}$ is the water depthat time step $t+\Delta t$, $\SIb{h^t}{m}$ is the +water depth at the previous time step, $\SIb{A}{m^2}$ is the river area and $\SIb{\subtext{Q}{src}}{m^3 s^{-1}}$ +and $\SIb{\subtext{Q}{dst}}{m^3 s^{-1}}$ represent river flow at the upstream and downstream link of the river cell, respectively. The model time step $\Delta t$ for the local inertial model is estimated based on the Courant-Friedrichs-Lewy condition (Bates et al., 2010): $$ -\Delta t = min(\alpha \frac{\Delta x_i}{\sqrt{(gh_i)}}) +\Delta t = \alpha \min_i\left(\frac{\Delta x_i}{\sqrt{gh_i}}\right) $$ -where $\sqrt{(gh_i)}$ is the wave celerity for river cell $i$ , $\Delta x_i$ is the -river length [m] for river cell $i$ and $\alpha$ is a coefficient (typically between 0.2 -and 0.7) to enhance the stability of the simulation. +where $\sqrt{gh_i}$ is the wave celerity for river cell $i$ , $\SIb{\Delta x_i}{m}$ is the +river length for river cell $i$ and $\alpha$ is a coefficient (typically between $0.2$ +and $0.7$) to enhance the stability of the simulation. In the TOML file the following properties related to the local inertial model can be provided for the `sbm` and `sbm_gwf` model types: @@ -73,24 +73,24 @@ The momentum equation is most stable for low slope environments, and to keep the stable for (partly) steep environments the `froude_limit` option is set to true by default. This setting limits flow conditions to subcritical-critical conditions based on the Froude number ($\le 1$), similar to Coulthard et al. (2013) in the CAESAR-LISFLOOD model and Adams -et al. (2017) in the Landlab v1.0 OverlandFlow component. The froude number $Fr$ on a link +et al. (2017) in the Landlab v1.0 OverlandFlow component. The froude number $\mathrm{Fr}$ on a link is calculated as follows: $$ -Fr = \frac{u}{\sqrt{(gh_f)}} + \mathrm{Fr} = \frac{u}{\sqrt{gh_f}} $$ -where $\sqrt{(gh_f)}$ is the wave celerity on a link and $u$ is the water velocity on a +where $\sqrt{gh_f}$ is the wave celerity on a link and $u$ is the water velocity on a link. If the water velocity from the local inertial model is causing the Froude number to be -greater than 1.0, the water velocity (and flow) is reduced in order to maintain a Froude -number of 1.0. +greater than $1.0$ , the water velocity (and flow) is reduced in order to maintain a Froude +number of $1.0$. The downstream boundary condition basically simulates a zero water depth boundary condition at a set distance, as follows. For the downstream boundary condition (ghost point) the river width, river bed elevation and Manning's roughness coefficient are copied from the upstream -river cell. The river length [m] of the boundary cell can be set through the TOML file with -`riverlength_bc`, and has a default value of 10 km. The water depth at the boundary cell is -fixed at 0.0 m. +river cell. The river length $\SIb{}{m}$ of the boundary cell can be set through the TOML file with +`riverlength_bc`, and has a default value of $\SI{10}{km}$. The water depth at the boundary cell is +fixed at $\SI{0.0}{m}$. Simplified [reservoir and lake](@ref reservoir_lake) models can be included as part of the local inertial model for river flow (1D) and river and overland flow combined (see next @@ -114,13 +114,13 @@ Q_{(i+1/2)}^{n})\right]- g h_f \frac{\Delta t}{\Delta x} (\eta^n_i - \eta^n_{i-1 $$ where subscripts $i$ and $n$ refer to space and time indices, respectively. Subscript -$i-1/2$ is to the link between node $i$ and $i-1$, subscript $i+1/2$ is the link -between node $i$ and node $i+1$, and subscript $i-3/2$ is the link between node $i-1$ -and node $i-2$. $Q$ is the water discharge [m$^3$ s$^{-1}$], $\eta$ is the water -surface elevation [m], $h_f$ [m] is the water depth between cells, $n$ is the Manning's -roughness coefficient [m$^{-1/3}$ s], $g$ is acceleration due to gravity [m/s$^2$], -$\Delta t$ [s] is the adaptive model time step, $\Delta x$ [m] is the distance between -two cells and $\Delta y$ [m] is the flow width. Below the staggered grid and variables of +$i-\frac{1}{2}$ is to the link between node $i$ and $i-1$, subscript $i+\frac{1}{2}$ is the link +between node $i$ and node $i+1$, and subscript $i-\frac{3}{2}$ is the link between node $i-1$ +and node $i-2$. $\SIb{Q}{m^3 s^{-1}}$ is the water discharge, $\SIb{\eta}{m}$ is the water +surface elevation, $\SIb{h_f}{m}$ is the water depth between cells, $\SIb{n}{m^{-\frac{1}{3}} s}$ is the Manning's +roughness coefficient, $\SIb{g}{m s^{-2}}$ is acceleration due to gravity, +$\SIb{\Delta t}{s}$ is the adaptive model time step, $\SIb{\Delta x}{m}$ is the distance between +two cells and $\SIb{\Delta y}{m}$ is the flow width. Below the staggered grid and variables of the numerical solution in the x-direction, based on Almeida et al. (2012): ![](../../images/numerical_scheme_almeida.png) @@ -149,12 +149,12 @@ routing as well as 2D overland flow. The properties `inertial_flow_alpha` and in the [River and floodplain routing](@ref) section of the local inertial model. ## Inflow -External water (supply/abstraction) `inflow` [m$^3$ s$^{-1}$] can be added to the local +External water (supply/abstraction) `inflow` $\SIb{}{m^3 s^{-1}}$ can be added to the local inertial model for river flow (1D) and river and overland flow combined (1D-2D), as a cyclic parameter or as part of forcing (see also [Input section](@ref)). ## Abstractions -Abstractions from the river through the variable `abstraction` [m$^3$ s${-1}$] are +Abstractions from the river through the variable `abstraction` $\SIb{}{m^3 s^{-1}}$ are possible when water demand and allocation is computed. The variable `abstraction` is set from the water demand and allocation module each time step. Abstractions are subtracted as part of the continuity equation of the local inertial model. diff --git a/docs/model_docs/lateral/sediment_flux.qmd b/docs/model_docs/lateral/sediment_flux.qmd index 97cd82e27..754f2cbfe 100644 --- a/docs/model_docs/lateral/sediment_flux.qmd +++ b/docs/model_docs/lateral/sediment_flux.qmd @@ -21,40 +21,44 @@ issues, the Yalin transport equation was chosen as it can handle particle differ with no particle differentiation). For land cells, wflow\_sediment assumes that erosion can mobilize 5 classes of sediment: -- Clay (mean diameter of 2 $\mu$m) -- Silt (mean diameter of 10 $\mu$m) -- Sand (mean diameter of 200 $\mu$m) -- Small aggregates (mean diameter of 30 $\mu$m) -- Large aggregates (mean diameter of 500 $\mu$m). - -$$ -\begin{split} -PSA &= SAN (1-CLA)^{2.4} \\ -PSI &= 0.13SIL\\ -PCL &= 0.20CLA \\ -SAG &= 2.0CLA \, ; \, CLA < 0.25 \\ -SAG &= 0.28(CLA-0.25)+0.5 \, ; \, 0.25 \leq CLA \leq 0.5 \\ -SAG &= 0.57 \, ; \, CLA > 0.5 \\ -LAG &= 1 - PSA - PSI - PCL - SAG -\end{split} -$$ - -where $CLA$, $SIL$ and $SAN$ are the primary clay, silt, sand fractions of the topsoil -and $PCL$, $PSI$, $PSA$, $SAG$ and $LAG$ are the clay, silt, sand, small and large +- Clay (mean diameter of $\SI{2}{\mu m}$) +- Silt (mean diameter of $\SI{10}{\mu m}$) +- Sand (mean diameter of $\SI{200}{\mu m}$) +- Small aggregates (mean diameter of $\SI{30}{\mu m}$) +- Large aggregates (mean diameter of $\SI{50}{\mu m}$). + +$$ + \mathrm{PSA} = \mathrm{SAN} (1-\mathrm{CLA})^{2.4} \\ + \mathrm{PSI} = 0.13\mathrm{SIL}\\ + \mathrm{PCL} = 0.20\mathrm{CLA} \\ + + \mathrm{SAG} = + \begin{align*} + \begin{cases} + 2.0\mathrm{CLA} &\text{ if }\quad \mathrm{CLA} < 0.25 \\ + 0.28(\mathrm{CLA}-0.25)+0.5 &\text{ if }\quad 0.25 \leq \mathrm{CLA} \leq 0.5 \\ + 0.57 &\text{ if }\quad \mathrm{CLA} > 0.5 + \end{cases} + \end{align*} \\ + + \mathrm{LAG} = 1 - \mathrm{PSA} - \mathrm{PSI} - \mathrm{PCL} - \mathrm{SAG} +``` + +where ``\mathrm{CLA}``, ``\mathrm{SIL}`` and ``\mathrm{SAN}`` are the primary clay, silt, sand fractions of the topsoil +and ``\mathrm{PCL}``, ``\mathrm{PSI}``, ``\mathrm{PSA}``, ``\mathrm{SAG}`` and ``\mathrm{LAG}`` are the clay, silt, sand, small and large aggregates fractions of the detached sediment respectively. The transport capacity of the flow using Yalin's equation with particle differentiation, developed by Foster (1982), is: $$ -TC_{i} = (P_{e})_{i} (S_{g})_{i} \, \rho_{w} \, g \, d_{i} V_{*} -$$ - -where $TC_{i}$ is the transport capacity of the flow for the particle class i, -$(P_{e})_{i}$ is the effective number of particles of class i, $(S_{g})_{i}$ is the -specific gravity for the particle class i (kg m$^{-3}$), $\rho_{w}$ is the mass density -of the fluid (kg m$^{-3}$), $g$ is the acceleration due to gravity (m s$^{-2}$), -$d_{i}$ is the diameter of the particle of class i (m) and $V_{*}=(g R S)^{0.5}$ is the -shear velocity of the flow (m s$^{-1}$) with $S$ the slope gradient and $R$ the -hydraulic radius of the flow (m). The detached sediment are then routed downslope until the -river network using the accucapacityflux, accupacitystate functions depending on the + \mathbf{TC}_i = (P_e)_i (S_g)_i \, \rho_w \, g \, d_i V_* +``` +where ``\mathbf{TC}_i`` is the transport capacity of the flow for the particle class ``i``, +``(P_e)_i`` is the effective number of particles of class ``i``, ``\SIb{(S_g)_i}{kg m^{-3}}`` is the +specific gravity for the particle class ``i``, ``\SIb{\rho_w}{kg m^{-3}}`` is the mass density +of the fluid, ``\SIb{g}{m s^{-2}}`` is the acceleration due to gravity, +``\SIb{d_i}{m}`` is the diameter of the particle of class ``i`` and ``V_* = \SIb{(g R S)^{0.5}}{m s^{-1}}`` is the +shear velocity of the flow with ``S`` the slope gradient and ``\SIb{R}{m}`` the +hydraulic radius of the flow. The detached sediment are then routed down slope until the +river network using the `accucapacityflux`, `accupacitystate` functions depending on the transport capacity from Yalin. The choice of transport capacity method for the overland flow is set up in the model section @@ -103,9 +107,9 @@ The first part of the river model assesses how much detached sediment are in the at the beginning of the timestep $t$. Sources of detached sediment are sediments coming from land erosion, estimated with the soil loss part of wflow_sediment model, the sediment coming from upstream river cells and the detached sediment that were left in the cell at the -end of the previous timestep $(t-1)$: +end of the previous timestep ``(t-1)``: $$ -(sed_{in})_{t} = (sed_{land})_{t} + upstream\left[(sed_{out})_{t-1}\right] + (sed_{riv})_{t-1} + (\subtext{\mathrm{sed}}{in})_t = (\subtext{\mathrm{sed}}{land})_t + \mathrm{upstream}\left[(\subtext{\text{sed}}{out})_{t-1}\right] + (\subtext{\text{sed}}{riv})_{t-1} $$ ### River transport and erosion @@ -129,22 +133,22 @@ Originally more valid for intermediate to large rivers, this simplified version Bagnold equation relates sediment transport to flow velocity with two simple calibration parameters (Neitsch et al, 2011): $$ -C_{max} = c_{sp} \left( \dfrac{prf Q}{h W} \right) ^{sp_{exp}} +C_{\max} = \subtext{c}{sp} \left( \dfrac{\mathrm{prf} Q}{h W} \right)^{\subtext{\mathrm{sp}}{exp}} $$ -where $C_{max}$ is the sediment concentration (ton m$^{-3}$ or kg/L), $Q$ is the -surface runoff in the river cell (m$^{3}$s$^{-1}$), $h$ is the river water level (m), -$W$ is the river width (m) and $c_{sp}$, $prf$ and $sp_{exp}$ are calibration -parameters. The $prf$ coefficient is usually used to deduce the peak velocity of the flow, -but for simplification in wflow\_sediment, the equation was simplified to only get two -parameters to calibrate: $sp_{exp}$ and $c_{Bagnold} = c_{sp} \, prf^{sp_{exp}}$. The -coefficient $sp_{exp}$ usually varies between 1 and 2 while $prf$ and $c_{sp}$ have a +where $\SIb{C_{\max}}{kg L^{-1}}$ (or $\SIb{}{ton m^{-1}}$) is the sediment concentration, $\SIb{Q}{m^3 s^{-1}}$ is the +surface runoff in the river cell, $\SIb{h}{m}$ is the river water level, +$\SIb{W}{m}$ is the river width and $\subtext{c}{sp}$, $\mathrm{prf}$ and $\subtext{\mathrm{sp}}{exp}$ are calibration +parameters. The $\mathrm{prf}$ coefficient is usually used to deduce the peak velocity of the flow, +but for simplification in `wflow_sediment`, the equation was simplified to only get two +parameters to calibrate: $\subtext{\mathrm{sp}}{exp}$ and $\subtext{c}{Bagnold} = \subtext{c}{sp} \, \mathrm{prf}^{\subtext{\mathrm{sp}}{exp}}$. The +coefficient $\subtext{\mathrm{sp}}{exp}$ usually varies between $1$ and $2$ while $\mathrm{prf}$ and $\subtext{c}{sp}$ have a wider range of variation. The table below summarizes ranges and values of the three Bagnold coefficients used by other studies: Table: Range of the simplified Bagnold coefficients (and calibrated value) -| Study | River | $prf$ range | $c_{sp}$ range | $sp_{exp}$ range | +| Study | River | $\mathrm{prf}$ range | $\subtext{c}{sp}$ range | $\subtext{\mathrm{sp}}{exp}$ range | |:----- | ----- | ------------- | ---------------- | ------------------ | | Vigiak 2015 | Danube | 0.5-2 (/) | 0.0001-0.01 (0.003-0.006) | 1-2 (1.4) | | Vigiak 2017 | Danube | / | 0.0001-0.01 (0.0015) | 1-2 (1.4) | @@ -155,112 +159,98 @@ Table: Range of the simplified Bagnold coefficients (and calibrated value) models such as Delft3D-WAQ, Engelund and Hansen calculates the total sediment load as (Engelund and Hansen, 1967): $$ -C_{w} = 0.05 \left( \dfrac{\rho_{s}}{\rho_{s} - \rho} \right) \left( \dfrac{u S}{\sqrt{\left( \dfrac{\rho_{s}}{\rho_{s} - \rho} \right) g D_{50}}} \right) \theta^{1/2} + C_w = 0.05 \left( \dfrac{\rho_{s}}{\rho_{s} - \rho} \right) \left( \dfrac{u S}{\sqrt{\left( \dfrac{\rho_{s}}{\rho_{s} - \rho} \right) g D_{50}}} \right) \theta^{1/2} $$ - -where $C_{w}$ is the sediment concentration by weight, $\rho$ and $\rho_{s}$ are the -fluid and sediment density (here equal to 1000 and 2650 g m$^{-3}$), $u$ is the water -mean velocity (m s$^{-1}$), $S$ is the river slope, $g$ is the acceleration due to gravity, -$D_{50}$ is the river mean diameter (m) and $\theta$ is the Shields parameter. +where $C_w$ is the sediment concentration by weight, $\SIb{\rho}{g m^{-3}}$ and $\SIb{\rho_{s}}{g m^{-3}}$ are the +fluid and sediment density (here respectively equal to $\SI{1000}{g m^{-3}}$ and $\SI{2650}{g m^{-3}}$), $\SIb{u}{m s^{-1}}$ is the water +mean velocity, $S$ is the river slope, $g$ is the acceleration due to gravity, +$\SIb{D_{50}}{m}$ is the river mean diameter and $\theta$ is the Shields parameter. **Kodatie** Kodatie (1999) developed the power relationships from Posada (1995) using field data and linear optimization so that they would be applicable for a wider range of riverbed sediment size. The resulting equation, for a rectangular channel, is (Neitsch et al, 2011): $$ -C_{max} = \left( \dfrac{a u^{b} h^{c} S^{d}}{V_{in}} \right) W + C_{\max} = \left( \dfrac{a u^{b} h^{c} S^{d}}{\subtext{V}{in}} \right) W $$ - -where $V_{in}$ in the volume of water entering the river cell -during the timestep (m$^{3}$) and $a$, $b$, $c$ and $d$ are coefficients depending +where $\SIb{\subtext{V}{in}}{m^3}$ in the volume of water entering the river cell +during the timestep and $a$, $b$, $c$ and $d$ are coefficients depending on the riverbed sediment size. Values of these coefficients are summarized in the table below. Table: Range of the simplified Bagnold coefficients (and calibrated value) | River sediment diameter | a | b | c | d | -|:----|---|---|---|---| -| $D_{50} \leq$ 0.05mm | 281.4 | 2.622 | 0.182 | 0 | -| 0.05 $< D_{50} \leq$ 0.25mm | 2 829.6 | 3.646 | 0.406 | 0.412 | -| 0.25 $< D_{50} \leq$ 2mm | 2 123.4 | 3.300 | 0.468 | 0.613 | -| $D_{50} >$ 2mm | 431 884.8 | 1.000 | 1.000 | 2.000 | +|:------------------------|---|---|---|---| +| $D_{50} \leq \SI{0.05}{mm}$ | 281.4 | 2.622 | 0.182 | 0 | +| $\SI{0.05}{mm} < D_{50} \leq \SI{0.25}{mm}$ | 2 829.6 | 3.646 | 0.406 | 0.412 | +| $\SI{0.25}{mm} < D_{50} \leq \SI{2.0}{mm}$ | 2 123.4 | 3.300 | 0.468 | 0.613 | +| $D_{50} > \SI{2.0}{mm}$ | 431 884.8 | 1.000 | 1.000 | 2.000 | **Yang** Yang (1996) developed a set of two equations giving transport of sediments for -sand-bed or gravel-bed rivers. The sand equation ($D_{50} < 2mm$) is: +sand-bed or gravel-bed rivers. The sand equation ($D_{50} < \SI{2.0}{mm}$) is: $$ -\begin{split} -log\left(C_{ppm}\right) &= 5.435 - 0.286log\frac{\omega_{s,50}D_{50}}{\nu}-0.457log\frac{u_{*}}{\omega_{s,50}} \\ -&+\left(1.799-0.409log\frac{\omega_{s,50}D_{50}}{\nu}-0.314log\frac{u_{*}}{\omega_{s,50}}\right)log\left(\frac{uS}{\omega_{s,50}}-\frac{u_{cr}S}{\omega_{s,50}}\right) -\end{split} + \log\left(C_{ppm}\right) = 5.435 - 0.286\log\left(\frac{\omega_{s,50}D_{50}}{\nu}\right)-0.457\log\left(\frac{u_*}{\omega_{s,50}}\right) \\ + +\left(1.799-0.409\log\left(\frac{\omega_{s,50}D_{50}}{\nu}\right)-0.314\log\left(\frac{u_*}{\omega_{s,50}}\right)\right)\log\left(\frac{uS}{\omega_{s,50}}-\frac{u_{cr}S}{\omega_{s,50}}\right) $$ - -And the gravel equation ($2 \leq D_{50} < 10 mm$) is: +And the gravel equation (``\SI{2.0}{mm} \leq D_{50} < \SI{10.0}{mm}``) is: $$ -\begin{split} -log\left(C_{ppm}\right) &= 6.681 - 0.633log\frac{\omega_{s,50}D_{50}}{\nu}-4.816log\frac{u_{*}}{\omega_{s,50}} \\ -&+\left(2.784-0.305log\frac{\omega_{s,50}D_{50}}{\nu}-0.282log\frac{u_{*}}{\omega_{s,50}}\right)log\left(\frac{uS}{\omega_{s,50}}-\frac{u_{cr}S}{\omega_{s,50}}\right) -\end{split} + \log\left(C_{ppm}\right) = 6.681 - 0.633\log\left(\frac{\omega_{s,50}D_{50}}{\nu}\right)-4.816\log\left(\frac{u_*}{\omega_{s,50}}\right) \\ + +\left(2.784-0.305\log\left(\frac{\omega_{s,50}D_{50}}{\nu}\right)-0.282\log\left(\frac{u_*}{\omega_{s,50}}\right)\right)\log\left(\frac{uS}{\omega_{s,50}}-\frac{u_{cr}S}{\omega_{s,50}}\right) $$ - where $C_{ppm}$ is sediment concentration in parts per million by weight, -$\omega_{s,50}$ is the settling velocity of a particle with the median riverbed diameter -estimated with Stokes (m s$^{-1}$), $\nu$ is the kinematic viscosity of the fluid -(m$^{2}$s$^{-1}$), $u_{*}$ is the shear velocity ($\sqrt{gR_{H}S}$ in m s$^{-1}$ -with $R_{H}$ the hydraulic radius of the river) and $u_{cr}$ is the critical velocity -(m/s, equation can be found in Hessel, 2007). +$\SIb{\omega_{s,50}}{m s^{-1}}$ is the settling velocity of a particle with the median riverbed diameter +estimated with Stokes, $\SIb{\nu}{m^2 s^{-1}}$ is the kinematic viscosity of the fluid, $\SIb{u_*}{m s^{-1}}$ is the shear velocity where $u_* = \sqrt{gR_{H}S}$ +with $R_{H}$ the hydraulic radius of the river and $\SIb{u_{cr}}{m s^{-1}}$ is the critical velocity +(equation can be found in Hessel, 2007). **Molinas and Wu** The Molinas and Wu (2001) transport equation was developed for large sand-bed rivers based on the universal stream power $\psi$. The corresponding equation is (Neitsch et al, 2011): $$ -C_{w} = \dfrac{1430 (0.86+\sqrt{\psi}) \psi^{1.5}}{0.016+\psi} 10^{-6} + C_{w} = \dfrac{1430 (0.86+\sqrt{\psi}) \psi^{1.5}}{0.016+\psi} 10^{-6} $$ - where $\psi$ is the universal stream power given by: $$ -\psi = \dfrac{\psi^{3}}{\left(\dfrac{\rho_{s}}{\rho}-1\right) g h \omega_{s,50} \left[ log_{10}\left(\dfrac{h}{D_{50}}\right)\right]^{2}} + \psi = \dfrac{\psi^{3}}{\left(\dfrac{\rho_{s}}{\rho}-1\right) g h \omega_{s,50} \left[ \log_{10}\left(\dfrac{h}{D_{50}}\right)\right]^{2}} $$ -Once the maximum concentration $C_{max}$ is established with one of the above transport +Once the maximum concentration $C_{\max}$ is established with one of the above transport formula, the model then determines if there is erosion of the river bed and bank. In order to do that, the difference $sed_{ex}$ between the maximum amount of sediment estimated -with transport ($sed_{max} = C_{max} V_{in}$) and the sediment inputs to the river cell -($sed_{in}$ calculated above) is calculated. If too much sediment is coming in and -$sed_{ex}$ is negative, then there is no river bed and bank erosion. And if the river has +with transport ($\mathrm{sed}_{\max} = C_{\max} \subtext{V}{in}$) and the sediment inputs to the river cell +($\subtext{\mathrm{sed}}{in}$ calculated above) is calculated. If too much sediment is coming in and +$\subtext{\mathrm{sed}}{ex}$ is negative, then there is no river bed and bank erosion. And if the river has not reach its maximum transport capacity, then erosion of the river happens. -First, the sediments stored in the cell from deposition in previous timesteps $sed_{stor}$ -are eroded from clay to gravel. If this amount is not enough to cover $sed_{ex}$, then +First, the sediments stored in the cell from deposition in previous timesteps $\subtext{\mathrm{sed}}{stor}$ +are eroded from clay to gravel. If this amount is not enough to cover $\subtext{\mathrm{sed}}{ex}$, then erosion of the local river bed and bank material starts. Instead of just setting river erosion amount to just cover the remaining difference -$sed_{exeff}$ between $sed_{ex}$ and $sed_{stor}$, actual erosion potential is +$\subtext{\mathrm{sed}}{exeff}$ between $\subtext{\mathrm{sed}}{ex}$ and $\subtext{\mathrm{sed}}{stor}$, actual erosion potential is adjusted using river characteristics and is separated between the bed and bank of the river using the physics-based approach of Knight (1984). The bed and bank of the river are supposed to only be able to erode a maximum amount of -their material $E_{R,bed}$ for the bed and $E_{R,bank}$ for the river bank. For a +their material ``E_{R,\mathrm{bed}}`` for the bed and ``E_{R,\mathrm{bank}}`` for the river bank. For a rectangular channel, assuming it is meandering and thus only one bank is prone to erosion, they are calculated from the equations (Neitsch et al, 2011): $$ -\begin{split} -E_{R,bed} &= k_{d,bed} \left( \tau_{e,bed} - \tau_{cr,bed} \right) 10^{-6} L W \rho_{b, bed} \Delta t \\ -E_{R,bank} &= k_{d,bank} \left( \tau_{e,bank} - \tau_{cr,bank} \right) 10^{-6} L h \rho_{b, bank} \Delta t -\end{split} + E_{R,\mathrm{bed}} = k_{d,\mathrm{bed}} \left( \tau_{e,\mathrm{bed}} - \tau_{cr,\mathrm{bed}} \right) 10^{-6} L W \rho_{b, \mathrm{bed}} \Delta t \\~\\ + E_{R,\mathrm{bank}} = k_{d,\mathrm{bank}} \left( \tau_{e,\mathrm{bank}} - \tau_{cr,\mathrm{bank}} \right) 10^{-6} L h \rho_{b, \mathrm{bank}} \Delta t $$ - -where $E_{R}$ is the potential bed/bank erosion rates (tons), $k_{d}$ is the erodibility -of the bed/bank material (cm$^{3}$ N$^{-1}$ s$^{-1}$), $\tau_{e}$ is the effective -shear stress from the flow on the bed/bank (N m$^{-2}$), $\tau_{cr}$ is the critical -shear stress for erosion to happen (N m$^{-2}$), $L$, $W$ and $h$ are the channel -length, width and water height (m), $\rho_{b}$ is the bulk density of the bed/bank of the -river (g cm$^{-3}$) and $\Delta t$ is the model timestep (s). +where $\SIb{E_R}{ton}$ is the potential bed/bank erosion rates, $\SIb{k_d}{cm^3 N^{-1}, s^{-1}}$ is the erodibility +of the bed/bank material, $\SIb{\tau_e}{N m^{-2}}$ is the effective +shear stress from the flow on the bed/bank, $\SIb{\tau_{cr}}{N m^{-2}}$ is the critical +shear stress for erosion to happen, $\SIb{L}{m}$, $\SIb{W}{m}$ and $\SIb{h}{m}$ are the channel +length, width and water height, $\SIb{\rho_{b}}{g cm^{-3}}$ is the bulk density of the bed/bank of the +river and $\SIb{\Delta t}{s}$ is the model timestep. In wflow_sediment, the erodibility of the bed/bank are approximated using the formula from Hanson and Simon (2001): $$ -k_{d}=0.2 \tau_{cr}^{-0.5} + k_d=0.2 \tau_{cr}^{-0.5} $$ - Normally erodibilities are evaluated using jet test in the field and there are several reviews and some adjustments possible to this equation (Simon et al, 2011). However, to avoid too heavy calibration and for the scale considered, this equation is supposed to be @@ -268,9 +258,8 @@ efficient enough. The critical shear stress $\tau_{cr}$ is evaluated differently bed and bank. For the bed, the most common formula from Shields initiation of movement is used. For the bank, a more recent approach from Julian and Torres (2006) is used : $$ -\tau_{cr,bank} = (0.1+0.1779 SC+0.0028 SC^{2}-2.34 10^{-5} SC^{3}) C_{ch} + \tau_{cr,\mathrm{bank}} = (0.1+0.1779 SC+0.0028 SC^{2}-2.34 10^{-5} SC^{3}) C_{ch} $$ - where $SC$ is the percent clay and silt content of the river bank and $C_{ch}$ is a coefficient taking into account the positive impact of vegetation on erosion reduction. This coefficient is then dependent on the land use and classical values are shown in the table @@ -307,31 +296,23 @@ Then, the repartition of the flow shear stress is refined into the effective she and the bed and bank of the river using the equations developed by Knight (1984) for a rectangular channel: $$ -\begin{split} -\tau_{e,bed} &= \rho g R_{H} S \left(1 - \dfrac{SF_{bank}}{100}\right) \left(1+\dfrac{2h}{W}\right) \\ -\tau_{e,bank} &= \rho g R_{H} S \left( SF_{bank}\right) \left(1+\dfrac{W}{2h}\right) -\end{split} + \tau_{e,\mathrm{bed}} = \rho g R_{H} S \left(1 - \dfrac{SF_{\mathrm{bank}}}{100}\right) \left(1+\dfrac{2h}{W}\right) \\~\\ + \tau_{e,\mathrm{bank}} = \rho g R_{H} S \left( SF_{\mathrm{bank}}\right) \left(1+\dfrac{W}{2h}\right) $$ - -where $\rho g$ is the fluid specific weight (9800 N m$^{-3}$ for water), $R_{H}$ is the -hydraulic radius of the channel (m), $h$ and $W$ are the water level and river width -(m). $SF_{bank}$ is the proportion of shear stress acting on the bank (%) and is estimated +where $\rho g$ is the fluid specific weight ($\SI{9800}{N m^{-3}}$ for water), $\SIb{R_H}{m}$ is the +hydraulic radius of the channel, $\SIb{h}{m}$ and $\SIb{W}{m}$ are the water level and river width. $SF_{\mathrm{bank}}$ is the proportion of shear stress acting on the bank (%) and is estimated from (Knight, 1984): $$ -SF_{bank} = exp \left( -3.230 log_{10}\left(\dfrac{W}{h}+3\right)+6.146 \right) + \mathrm{SF}_{\mathrm{bank}} = \exp \left( -3.230 \log_{10}\left(\dfrac{W}{h}+3\right)+6.146 \right) $$ - Finally the relative erosion potential of the bank and bed of the river is calculated by: $$ -\begin{split} -RTE_{bed} &= \dfrac{E_{R,bed}}{E_{R,bed}+E_{R,bank}} \\ -RTE_{bank} &= 1 - RTE_{bed} -\end{split} + \mathrm{RTE}_{\mathrm{bed}} = \dfrac{E_{R,\mathrm{bed}}}{E_{R,\mathrm{bed}}+E_{R,\mathrm{bank}}} \\~\\ + \mathrm{RTE}_{\mathrm{bank}} = 1 - RTE_{\mathrm{bed}} $$ - -And the final actual eroded amount for the bed and bank is the maximum between $RTE -sed_{exeff}$ and the erosion potential $E_{R}$. Total eroded amount of sediment -$sed_{erod}$ is then the sum of the eroded sediment coming from the storage of previously +And the final actual eroded amount for the bed and bank is the maximum between $\mathrm{RTE} +\subtext{\mathrm{sed}}{exeff}$ and the erosion potential $E_R$. Total eroded amount of sediment +$\subtext{\mathrm{sed}}{erod}$ is then the sum of the eroded sediment coming from the storage of previously deposited sediment and the river bed/bank erosion. ### River deposition @@ -340,20 +321,18 @@ the river bed. The deposition process depends on the mass of the sediment, but a characteristics such as velocity. In wflow_sediment, as in SWAT, deposition is modelled with Einstein's equation (Neitsch et al, 2011): $$ -P_{dep}=\left(1-\dfrac{1}{e^{x}}\right)100 + \subtext{P}{dep}=\left(1-\dfrac{1}{e^{x}}\right)100 $$ - -where $P_{dep}$ is the percentage of sediments that is deposited on the river bed and x is +where $\subtext{P}{dep}$ is the percentage of sediments that is deposited on the river bed and x is a parameter calculated with: $$ -x = \dfrac{1.055 L \omega_{s}}{u h} + x = \dfrac{1.055 L \omega_{s}}{u h} $$ - -where $L$ and $h$ are channel length and water height (m), $\omega_{s}$ is the -particle settling velocity calculated with Stokes formula (m s$^{-1}$) and $u$ is the -mean flow velocity (m s$^{-1}$). The calculated percentage is then subtracted from the -amount of sediment input and eroded river sediment for each particle size class ($sed_{dep} -= P_{dep}/100 (sed_{in} + sed_{erod})$). Resulting deposited sediment are then stored in +where $\SIb{L}{m}$ and $\SIb{h}{m}$ are channel length and water height, $\SIb{\omega_s}{m s^{-1}}$ is the +particle settling velocity calculated with Stokes' formula and $\SIb{u}{m s^{-1}}$ is the +mean flow velocity. The calculated percentage is then subtracted from the +amount of sediment input and eroded river sediment for each particle size class ($\subtext{\mathrm{sed}}{dep} += \subtext{P}{dep}/100 (\subtext{\mathrm{sed}}{in} + \subtext{\mathrm{sed}}{erod})$). Resulting deposited sediment are then stored in the river bed and can be re-mobilized in future time steps by erosion. ### Mass balance and sediment concentration @@ -361,47 +340,47 @@ Finally after estimating inputs, deposition and erosion with the transport capac flow, the amount of sediment actually leaving the river cell to go downstream is estimated using: $$ -sed_{out} = (sed_{in} + sed_{erod} - sed_{dep}) \dfrac{V_{out}}{V} + \subtext{\mathrm{sed}}{out} = (\subtext{\mathrm{sed}}{in} + \subtext{\mathrm{sed}}{erod} - \subtext{\mathrm{sed}}{dep}) \dfrac{\subtext{V}{out}}{V} $$ -where $sed_{out}$ is the amount of sediment leaving the river cell (tons), $sed_{in}$ is +where $\SIb{\subtext{\mathrm{sed}}{out}}{ton}$ is the amount of sediment leaving the river cell (tons), $\SIb{\subtext{\mathrm{sed}}{in}}{ton}$ is the amount of sediment coming into the river cell (storage from previous timestep, land -erosion and sediment flux from upstream river cells in tons), $sed_{erod}$ is the amount -of sediment coming from river erosion (tons), $sed_{dep}$ is the amount of deposited -sediments (tons), $V_{out}$ is the volume of water leaving the river cell (surface runoff -$Q$ times timestep $\Delta t$ in m$^{3}$) and $V$ is the total volume of water in -the river cell ($V_{out}$ plus storage $h W L$ in m$^{3}$). +erosion and sediment flux from upstream river cells), $\SIb{\subtext{\mathrm{sed}}{erod}}{ton}$ is the amount +of sediment coming from river erosion, $\SIb{\subtext{\mathrm{sed}}{dep}}{ton}$ is the amount of deposited +sediments, $\SIb{\subtext{V}{out}}{m^3}$ is the volume of water leaving the river cell (surface runoff +$Q$ times timestep $\Delta t$) and $\SIb{V}{m^3}$ is the total volume of water in +the river cell ($\subtext{V}{out}$ plus storage $h W L$). A mass balance is then used to calculate the amount of sediment remaining in the cell at the -end of the timestep $(sed_{riv})_{t}$: +end of the timestep $(\subtext{\mathrm{sed}}{riv})_t$: $$ -(sed_{riv})_{t} = (sed_{riv})_{t-1} + (sed_{land})_{t} + upstream\left[(sed_{out})_{t-1}\right] + (sed_{erod})_{t} - (sed_{dep})_{t} - (sed_{out})_{t} + (\subtext{\mathrm{sed}}{riv})_t = (\subtext{\mathrm{sed}}{riv})_{t-1} + (\subtext{\mathrm{sed}}{land})_t + \mathrm{upstream}\left[(\subtext{\mathrm{sed}}{out})_{t-1}\right] + (\subtext{\mathrm{sed}}{erod})_t - (\subtext{\mathrm{sed}}{dep})_t - (\subtext{\mathrm{sed}}{out})_t $$ ### Lake and reservoir modelling -Apart from land and river, the hydrologic wflow\_sbm model also handles lakes and reservoirs -modelling. In wflow\_sbm, lakes and large reservoirs are modelled using a 1D bucket model at +Apart from land and river, the hydrologic `wflow_sbm` model also handles lakes and reservoirs +modelling. In `wflow_sbm`, lakes and large reservoirs are modelled using a 1D bucket model at the cell corresponding to the outlet. For the other cells belonging to the lake/reservoir which are not the outlet, processes such as precipitation and evaporation are filtered out -and shifted to the outlet cell. wflow\_sediment handles the lakes and reservoirs in the same way. If a +and shifted to the outlet cell. `wflow_sediment` handles the lakes and reservoirs in the same way. If a cell belongs to a lake/reservoir and is not the outlet then the model assumes that no erosion/deposition of sediments is happening and the sediments are only all transported to the lake/reservoir outlet. Once the sediments reach the outlet, then sediments are deposited in the lake/reservoir according to Camp's model (1945) (Verstraeten et al, 2000): $$ -TE = \dfrac{\omega_{s}}{u_{cr,res}} = \dfrac{A_{res}}{Q_{out,res}} \omega_{s} + \mathrm{TE} = \dfrac{\omega_s}{u_{cr,\mathrm{res}}} = \dfrac{\subtext{A}{res}}{\subtext{Q}{out,res}} \omega_s $$ -where $TE$ is the trapping efficiency of the lake/reservoir (or the fraction of particles -trapped), $\omega_{s}$ is the particle velocity from Stokes (m s$^{-1}$), $u_{cr,res}$ -is the reservoir's critical settling velocity (m/s) which is equal to the reservoir's -outflow $Q_{out,res}$ (m$^{3}$ s$^{-1}$) divided by the reservoir's surface area -$A_{res}$ (m$^{2}$). +where $\mathrm{TE}$ is the trapping efficiency of the lake/reservoir (or the fraction of particles +trapped), $\SIb{\omega_{s}}{m s^{-1}}$ is the particle velocity from Stokes, $\SIb{\subtext{u}{cr,res}}{m s^{-1}}$ +is the reservoir's critical settling velocity which is equal to the reservoir's +outflow $\SIb{\subtext{Q}{out,res}}{m^3 s^{-1}}$ divided by the reservoir's surface area +$\SIb{\subtext{A}{res}}{m^2}$. For reservoirs, coarse sediment particles from the bed load are also assumed to be trapped by the dam structure. This adding trapping is taken into account with a reservoir trapping efficiency coefficient -for large particles (between 0 and 1). Depending on the type of the dam, all bed load particles are trapped -(restrapefficiency =1.0, for example for a gravity dam) or only partly (for example for run-of-the-river dams). +for large particles (between $0$ and $1$). Depending on the type of the dam, all bed load particles are trapped +(`restrapefficiency = 1.0`, for example for a gravity dam) or only partly (for example for run-of-the-river dams). Lake and reservoir modelling is enabled in the model section of the TOML and require the extra following input arguments: diff --git a/docs/model_docs/lateral/waterbodies.qmd b/docs/model_docs/lateral/waterbodies.qmd index e2d8229b0..c60ed4794 100644 --- a/docs/model_docs/lateral/waterbodies.qmd +++ b/docs/model_docs/lateral/waterbodies.qmd @@ -9,15 +9,14 @@ Simple reservoirs can be included within the river routing by supplying the foll reservoir parameters: + `locs` - Outlet of the reservoirs in which each reservoir has a unique id -+ `area` - Surface area of the reservoirs [m$^2$] ++ `area` - Surface area of the reservoirs $\SIb{}{m^2}$ + `areas` - Reservoir coverage + `targetfullfrac` - Target fraction full (of max storage) for the reservoir: number between 0 and 1 + `targetminfrac` - Target minimum full fraction (of max storage). Number between 0 and 1 -+ `maxvolume` - Maximum reservoir storage (above which water is spilled) [m$^3$] -+ `demand` - Minimum (environmental) flow requirement downstream of the reservoir [m$^3$ - s$^{-1}$] -+ `maxrelease` - Maximum Q that can be released if below spillway [m$^3$ s$^{-1}$] ++ `maxvolume` - Maximum reservoir storage (above which water is spilled) $\SIb{}{m^3}$ ++ `demand` - Minimum (environmental) flow requirement downstream of the reservoir $\SIb{}{m^3 s^{-1}}$ ++ `maxrelease` - Maximum $Q$ that can be released if below spillway $\SIb{}{m^3 s^{-1}}$ By default the reservoirs are not included in the model. To include them put the following lines in the TOML file of the model: @@ -46,18 +45,17 @@ targetminfrac = "ResTargetMinFrac" Lakes are modelled using a mass balance approach: $$ -\dfrac{S(t + \Delta t)}{\Delta t} = \dfrac{S(t)}{\Delta t} + Q_{in} + \dfrac{(P-E) A}{\Delta t} - Q_{out} + \dfrac{S(t + \Delta t)}{\Delta t} = \dfrac{S(t)}{\Delta t} + \subtext{Q}{in} + \dfrac{(P-E) A}{\Delta t} - \subtext{Q}{out} $$ -where $S$ is lake storage [m$^3$], $\Delta t$ is the model timestep [s], $Q_{in}$ is -the sum of inflows (river, overland and lateral subsurface flow) [m$^3$ s$^{-1}$], -$Q_{out}$ is the lake outflow at the outlet [m$^3$ s$^{-1}$], $P$ is precipitation -[m], $E$ is lake evaporation [m] and $A$ is the lake surface area [m$^2$]. +where $\SIb{S}{m^3}$ is lake storage, $\SIb{\Delta t}{s}$ is the model timestep, $\SIb{\subtext{Q}{in}}{m^3 s^{-1}}$ is +the sum of inflows (river, overland and lateral subsurface flow), +$\SIb{\subtext{Q}{out}}{m^3 s^{-1}}$ is the lake outflow at the outlet, $\SIb{P}{m}$ is precipitation, $\SIb{E}{m}$ is lake evaporation and $\SIb{A}{m^2}$ is the lake surface area. ![Lake schematization.](../../images/lake.png) Most of the variables in this equation are already known or coming from previous timestep, -apart from $S(t+ \Delta t)$ and $Q_{out}$ which can both be linked to the water level +apart from $S(t+ \Delta t)$ and $\subtext{Q}{out}$ which can both be linked to the water level $H$ in the lake using a storage curve $S = f(H)$ and a rating curve $Q = f(H)$. In wflow, several options are available to select storage and rating curves, and in most cases, the mass balance is then solved by linearization and iteration or using the Modified Puls @@ -69,9 +67,9 @@ Approach from Maniak (Burek et al., 2013). Storage curves in wflow can either: Rating curves in wflow can either: + Come from the interpolation of field data linking lake outflow and water height, also appropriate for regulated lakes/ dams, -+ Be computed from a rating curve of the form $Q_{out} = \alpha {(H-H_{0})}^{\beta}$, ++ Be computed from a rating curve of the form $\subtext{Q}{out} = \alpha (H-H_0)^\beta$, where $H_{0}$ is the minimum water level under which the outflow is zero. Usual values - for $\beta$ are 3/2 for a rectangular weir or 2 for a parabolic weir (Bos, 1989). + for $\beta$ are $\frac{3}{2}$ for a rectangular weir or $2$ for a parabolic weir (Bos, 1989). ### Modified Puls Approach The Modified Puls Approach is a resolution method of the lake balance that uses an explicit @@ -79,25 +77,33 @@ relationship between storage and outflow. Storage is assumed to be equal to $A H rating curve for a parabolic weir ($\beta = 2$): $$ -S = A H = A (h + H_{0}) = \dfrac{A}{\sqrt{\alpha}} \sqrt{Q} + A H_{0} + S = A H = A (h + H_{0}) = A \sqrt{\frac{Q}{\alpha}} + A H_0 $$ Inserting this equation in the mass balance gives: $$ -\dfrac{A}{\Delta t \sqrt{\alpha}} \sqrt{Q} + Q = \dfrac{S(t)}{\Delta t} + Q_{in} + -\dfrac{(P-E) A}{\Delta t} - \dfrac{A H_{0}}{\Delta t} = SI - \dfrac{A H_{0}}{\Delta t} + \dfrac{A}{\Delta t} \sqrt{\frac{Q}{\alpha}} + Q = \dfrac{S(t)}{\Delta t} + \subtext{Q}{in} + + A\dfrac{P-E}{\Delta t} - \dfrac{A H_0}{\Delta t} = \mathrm{SI} - \dfrac{A H_0}{\Delta t} $$ -The solution for Q is then: +The solution for $Q$ is then: $$ -\begin{split} -Q = { \left( \dfrac{-LF + \sqrt{LF^{2} + 4 \left( SI - \dfrac{A*H_{0}}{\Delta t} \right)}} -{2} \right) }^{2} \text{for } SI > \dfrac{A H_{0}}{\Delta t} \text{ and where}\\ -LF = \dfrac{A}{\Delta t \sqrt{\alpha}} \\~\\ -Q = 0 \text{ for } SI \leq \dfrac{A*H_{0}}{\Delta t} -\end{split} + Q = + \begin{cases} + \begin{align*} + \frac{1}{4}\left(-\mathrm{LF} + \sqrt{\mathrm{LF}^{2} + 4 \left(\mathrm{SI} - \dfrac{A H_0}{\Delta t} \right)} + \right)^2 &\text{ if }\quad \mathrm{SI} > \dfrac{A H_0}{\Delta t} \\ + 0 &\text{ if }\quad \mathrm{SI} \leq \dfrac{A H_0}{\Delta t} + \end{align*} + \end{cases} +$$ + +where + +$$ + \mathrm{LF} = \dfrac{A}{\Delta t \sqrt{\alpha}}. $$ ### Lake parameters @@ -149,8 +155,8 @@ supplied in the same folder of the TOML file. Naming of the files uses the ID of where data are available and is of the form lake\_sh\_1.csv and lake\_hq\_1.csv for respectively the storage and rating curves of lake with ID 1. -The storage curve is stored in a CSV file with lake level [m] in the first column `H` and -corresponding lake storage [m $^{3}$] in the second column `S`: +The storage curve is stored in a CSV file with lake level $\SIb{}{m}$ in the first column `H` and +corresponding lake storage $\SIb{}{m^3}$ in the second column `S`: ``` H, S diff --git a/docs/model_docs/vertical/sbm.qmd b/docs/model_docs/vertical/sbm.qmd index 7dbeb932d..08b51a1ba 100644 --- a/docs/model_docs/vertical/sbm.qmd +++ b/docs/model_docs/vertical/sbm.qmd @@ -4,7 +4,7 @@ engine: julia --- ## Introduction -The SBM vertical concept has its roots in the Topog\_SBM model but has had considerable +The SBM vertical concept has its roots in the `Topog_SBM` model but has had considerable changes over time. The main differences are: - The unsaturated zone can be split-up in different layers @@ -46,7 +46,7 @@ storm-based approach will yield better results in situations with more than one day. The amount of water needed to completely saturate the canopy is defined as: $$ -P'=\frac{-\overline{R}S}{\overline{E}_{w}}ln\left[1-\frac{\overline{E}_{w}}{\overline{R}}(1-p-p_{t})^{-1}\right] + P'=\frac{-\overline{R}S}{\overline{E}_{w}}\log\left[1-\frac{\overline{E}_{w}}{\overline{R}}(1-p-p_{t})^{-1}\right] $$ where $\overline{R}$ is the average precipitation intensity on a saturated canopy and @@ -108,18 +108,18 @@ path_static = "data/staticmaps-moselle.nc" cyclic = ["vertical.leaf_area_index"] ``` -Furthermore these additional parameters are required: -+ Specific leaf storage (`sl` \[mm\]) -+ Storage woody part of vegetation (`swood` \[mm\]) -+ Extinction coefficient (`kext` \[-\]) +Furthermore, these additional parameters are required: ++ Specific leaf storage (`sl` ``\SIb{}{mm}``) ++ Storage woody part of vegetation (`swood` ``\SIb{}{mm}``) ++ Extinction coefficient (`kext` ``\SIb{}{-}``) -Here it is assumed that `cmax` \[mm\] (leaves) (canopy storage capacity for the leaves only) +Here it is assumed that `cmax` ``\SIb{}{mm}`` (leaves) (canopy storage capacity for the leaves only) relates linearly with LAI (c.f. Van Dijk and Bruijnzeel 2001). This is done via the `sl`. `sl` can be determined through a lookup table with land cover based on literature (Pitman 1989, Lui 1998). Next the `cmax` (leaves) is determined using: $$ -cmax(leaves) = sl \, LAI + c_{\max}(\mathrm{leaves}) = \mathrm{sl} \cdot \mathrm{LAI} $$ To get to total storage (`cmax`) the woody part of the vegetation also needs to be added. As @@ -130,7 +130,7 @@ The canopy gap fraction is determined using the extinction coefficient `kext` (v Bruijnzeel 2001): $$ -canopygapfraction = exp(-kext \, LAI) + \mathrm{canopygapfraction} = \exp(-\subtext{k}{ext} \cdot \mathrm{LAI}) $$ The extinction coefficient `kext` can be related to land cover. @@ -186,18 +186,17 @@ availability. The maximum possible root water extraction rate for each soil layer is determined by partitioning the potential transpiration rate ``T_p`` based on the fraction of the total -root length (`rootfraction` [-]) in each soil layer. A root water uptake reduction model is +root length (`rootfraction` ``\SIb{}{-}``) in each soil layer. A root water uptake reduction model is used to calculate a reduction coefficient as a function of soil water pressure, that may reduce the maximum possible root water extraction rate. The root water uptake reduction model is based on the concept proposed by Feddes et al. (1978). This concept defines a -reduction coefficient ``\alpha`` [-] as a function of soil water pressure (``h`` [cm]). Four +reduction coefficient ``\SIb{\alpha}{-}`` as a function of soil water pressure (``\SIb{h}{cm}``). Four different levels of ``h`` are defined: `h1`, `h2`, `h3` and `h4`. `h1` represents anoxic moisture conditions, `h2` represents field capacity, `h3` represents the point of critical soil moisture content (onset of drought stress), and `h4` represents the wilting point. The -value of `h3` is a function of the potential transpiration rate, between 1 and 5 mm -d``^{-1}``. If ``T_p \le 1 \text{ mm d}^{-1}``, `h3` is set equal to `h3_low` (input model -parameter). If ``T_p \ge 5 \text{ mm d}^{-1}``, `h3` is set equal to `h3_high` (input model -parameter). For ``T_p`` values between 1 and 5 mm d``^{-1}``, the value of `h3` is linearly +value of `h3` is a function of the potential transpiration rate, between ``\SIb{1}{mm d^{-1}}`` and ``\SIb{5}{mm d^{-1}}``. If ``T_p \le \SIb{1}{mm d^{-1}}``, `h3` is set equal to `h3_low` (input model +parameter). If ``T_p \ge \SIb{5}{mm d^{-1}}``, `h3` is set equal to `h3_high` (input model +parameter). For ``T_p`` values between ``\SIb{1}{mm d^{-1}}`` and ``\SIb{5}{mm d^{-1}}``, the value of `h3` is linearly related to ``T_p`` (between `h3_low` and `h3_high`). Besides model parameters `h3_high` and `h3_low`, the critical pressure heads `h1`, `h2` and `h4` can be defined as input to the model. @@ -206,10 +205,10 @@ The current soil water pressure is determined following the concept defined by B Corey (1964): $$ -\frac{(\theta-\theta_r)}{(\theta_s-\theta_r)} = \Bigg\lbrace{\left(\frac{h_b}{h}\right)^{\lambda}, h > h_b \atop 1 , h \leq h_b} + \frac{\theta-\theta_r}{\theta_s-\theta_r} = \min\left\{1, \left(\frac{h_b}{h}\right)^\lambda\right\} $$ -where $h$ is the pressure head [cm], $h_b$ is the air entry pressure head [cm], and +where $\SIb{h}{cm}$ is the pressure head, $\SIb{h_b}{cm}$ is the air entry pressure head, and $\theta$, $\theta_s$, $\theta_r$ and $\lambda$ as previously defined. Whenever the current soil water pressure drops below `h4`, the root water uptake is set to @@ -267,7 +266,7 @@ whole_ust_available = true ::: The computation of transpiration from the saturated store depends on the water table depth, -rooting depth, the reduction coefficient ``\alpha``, the fraction of wet roots and the +rooting depth, the reduction coefficient $\alpha$, the fraction of wet roots and the `rootfraction` below the water table. The fraction of wet roots is determined using a sigmoid fuction (see figure below). The parameter `rootdistpar` defines the sharpness of the transition between fully wet and fully dry roots. If the water table depth is equal to or @@ -325,37 +324,35 @@ glacier = true ### The SBM soil water accounting scheme -A detailed description of the Topog\_SBM model has been given by Vertessy (1999). Briefly: -the soil is considered as a bucket with a certain depth ($z_{t}$ [mm]), divided into a -saturated store ($S$ [mm]) and an unsaturated store ($U$ [mm]). The top of the $S$ -store forms a pseudo-water table at depth $z_{i}$ [mm] such that the value of $S$ at any +A detailed description of the `Topog\_SBM` model has been given by Vertessy (1999). Briefly: +the soil is considered as a bucket with a certain depth ($\SIb{z_t}{mm}$), divided into a +saturated store ($\SIb{S}{mm}$) and an unsaturated store ($\SIb{U}{mm}$). The top of the $S$ +store forms a pseudo-water table at depth $\SIb{z_{i}}{mm}$ such that the value of $S$ at any time is given by: $$ -S=(z_{t}-z_{i})(\theta_{s}-\theta_{r}) + S=(z_t-z_i)(\theta_s-\theta_r) $$ -where $\theta_{s}$ [-] and $\theta_{r}$ [-] are the saturated and residual soil water +where $\SIb{\theta_{s}}{-}$ and $\SIb{\theta_{r}}{-}$ are the saturated and residual soil water contents, respectively. -The unsaturated store $U$ is subdivided into storage ($U_{s}$ [mm]) and deficit -($U_{d}$ [mm]): +The unsaturated store $U$ is subdivided into storage ($\SIb{U_s}{mm}$) and deficit +($\SIb{U_d}{m}$): $$ -\begin{split} -U_{d} &= (\theta_{s}-\theta_{r})z_{i}-U \\ -U_{s} &= U-U_{d} -\end{split} + U_d=(\theta_s-\theta_r)z_i-U\\ + U_s=U-U_d $$ -The saturation deficit ($S_{d}$ [mm]) for the soil profile as a whole is defined as: +The saturation deficit ($\SIb{S_d}{mm}$) for the soil profile as a whole is defined as: $$ -S_{d}=(\theta_{s}-\theta_{r})z_{t}-S + S_d=(\theta_s-\theta_r)z_t-S $$ All infiltrating water that enters the $U$ store first. The unsaturated layer can be -split-up in different layers, by providing the thickness [mm] of the layers in the TOML +split-up in different layers, by providing the thickness $\SIb{}{mm}$ of the layers in the TOML file. The following example specifies three layers (from top to bottom) of 100, 300 and 800 mm: @@ -364,37 +361,32 @@ mm: thicknesslayers = [100, 300, 800] ``` -The code checks for each grid cell the specified layers against the `soilthickness` [mm], +The code checks for each grid cell the specified layers against the `soilthickness` $\SIb{}{mm}$, and adds or removes (partly) layer(s) based on the `soilthickness`. -Assuming a unit head gradient, the transfer of water ($st$ [mm t$^{-1}$]) from a $U$ -[mm] store layer is controlled by the saturated hydraulic conductivity $K_{sat}$ [mm -t$^{-1}$] at depth $z$ \[mm\] (bottom layer) or $z_{i}$ [mm], the effective saturation +Assuming a unit head gradient, the transfer of water ($\SIb{\mathrm{st}}{mm t^{-1}}$) from a $\SIb{U}{mm}$ store layer is controlled by the saturated hydraulic conductivity $\SIb{\subtext{K}{sat}}{mm t^{-1}}$ at depth $\SIb{z}{mm}$ (bottom layer) or $\SIb{z_i}{mm}$, the effective saturation degree of the layer, and a Brooks-Corey power coefficient (parameter $c$) based on the pore size distribution index $\lambda$ (Brooks and Corey, 1964): $$ -\begin{split} -st &= K_{\mathit{sat}}\left(\frac{\theta-\theta_{r}}{\theta_{s}-\theta_{r}}\right)^{c} \\ -c &= \frac{2+3\lambda}{\lambda} -\end{split} + \mathrm{st}=\subtext{K}{sat}\left(\frac{\theta-\theta_r}{\theta_s-\theta_r}\right)^c\\~\\ + c=\frac{2+3\lambda}{\lambda} $$ +Here $\SIb{}{mm t^{-1}}$ denotes milimeter per time step. + When the unsaturated layer is not split-up into different layers, it is possible to use the -original Topog\_SBM vertical transfer formulation, by specifying in the TOML file: +original `Topog\_SBM` vertical transfer formulation, by specifying in the TOML file: ```toml [model] transfermethod = true ``` -The transfer of water from the $U$ [mm] store to the $S$ [mm] store ($st$ [mm -t$^{-1}$]) is in that case controlled by the saturated hydraulic conductivity $K_{sat}$ -[mm t$^{-1}$] at depth $z_{i}$ [mm] and the ratio between $U$ [mm] and $S_{d}$ -[mm]: +The transfer of water from the $\SIb{U}{mm}$ store to the $\SIb{S}{mm}$ store ($\SIb{st}{mm t^{-1}}$) is in that case controlled by the saturated hydraulic conductivity $\SIb{\subtext{K}{sat}}{mm s^{-1}}$ at depth $\SIb{z_i}{mm}$ and the ratio between $\SIb{U}{mm}$ and $\SIb{S_d}{mm}$: $$ -st=K_{\mathit{sat}}\frac{U_{s}}{S_{d}} + \mathrm{st}=\subtext{K}{sat}\frac{U_s}{S_d} $$ Four different saturated hydraulic conductivity depth profiles (`ksat_profile`) are @@ -405,68 +397,65 @@ available and a `ksat_profile` can be specified in the TOML file as follows: ksat_profile = "exponential_constant" # optional, one of ("exponential", "exponential_constant", "layered", "layered_exponential"), default is "exponential" ``` -Soil measurements are often available for about the upper 1.5-2 m of the soil column to +Soil measurements are often available for about the upper $\SI{1.5-2}{m}$ of the soil column to estimate the saturated hydraulic conductivity, while these measurements are often lacking -for soil depths beyond 1.5-2 m. These different profiles allow to extent the saturated +for soil depths beyond $\SI{1.5-2}{m}$. These different profiles allow to extent the saturated hydraulic conductivity profile based on measurements (either an exponential fit or hydraulic conductivity value per soil layer) with an exponential or constant profile. By default, with -`ksat_profile` "exponential", the saturated hydraulic conductivity ($K_{sat}$ [mm -t$^{-1}$]) declines with soil depth ($z$ [mm]) in the model according to: +`ksat_profile` "exponential", the saturated hydraulic conductivity $\SIb{\subtext{K}{sat}}{mm t^{-1}}$ declines with soil depth $\SIb{z}{mm}$ in the model according to: $$ -K_{sat}=K_{0}e^{(-fz)}, + \subtext{K}{sat} = K_0 e^{-fz}, $$ -where $K_{0}$ [mm t$^{-1}$] is the saturated hydraulic conductivity at the soil surface -and $f$ is a scaling parameter [mm$^{-1}$]. +where $\SIb{K_0}{mm s^{-1}}$ is the saturated hydraulic conductivity at the soil surface +and $\SIb{f}{mm^{-1}}$ is a scaling parameter. The plot below shows the relation between soil depth $z$ and saturated hydraulic -conductivity $K_{sat}$ for different values of $f$. +conductivity $\subtext{K}{sat}$ for different values of $f$. ```@setup plot using Printf using CairoMakie ``` -```julia -# -# let # hide -using Plots -fig = Figure(; resolution = (800, 400)) # hide -ax = Axis(fig[1, 1]; xlabel = "Kₛₐₜ [mm/day]", ylabel = "-z [mm]") # hide +```@example plot + let # hide + fig = Figure(resolution = (800, 400)) # hide + ax = Axis(fig[1, 1], xlabel = L"K_\mathrm{sat}\;[\mathrm{mm/day}]", ylabel = L"-z\;[\mathrm{mm}]") # hide z = 0:5.0:1000 # hide ksat = 100.0 # hide f = 0.6 ./ collect(50:150.0:800) # hide -for fi in f # hide - lines!(ax, ksat .* exp.(-fi .* z), -z; label = @sprintf("f = %.2e", fi)) # hide -end # hide + for fi in f # hide + lines!(ax, ksat .* exp.(-fi .* z), -z, label = @sprintf("%.2e", fi)) # hide + end # hide -Legend(fig[1, 2], ax, "f") # hide -fig # hide -# end # hide + Legend(fig[1, 2], ax, L"f") # hide + fig # hide + end # hide ``` -With `ksat_profile` "exponential\_constant", $K_{sat}$ declines exponentially with soil -depth $z$ until $z_\mathrm{exp}$ [mm] below the soil surface, and stays constant at and -beyond soil depth $z_\mathrm{exp}$: +With `ksat_profile` "exponential\_constant", $\subtext{K}{sat}$ declines exponentially with soil +depth $\SIb{z}{mm}$ until $\SIb{\subtext{z}{mm}}{mm}$ below the soil surface, and stays constant at and +beyond soil depth $\subtext{z}{exp}$: $$ -K_{sat} = \begin{cases} -K_{0}e^{(-fz)} & \text{if $z < z_\mathrm{exp}$}\\ -K_{0}e^{(-fz_\mathrm{exp})} & \text{if $z \ge z_\mathrm{exp}$}. -\end{cases} -$$ + \subtext{K}{sat} = \begin{cases} + K_0e^{-fz} & \text{if $z < \subtext{z}{exp}$}\\ + K_0e^{-f\subtext{z}{exp}} & \text{if $z \ge \subtext{z}{exp}$}. + \end{cases} +``` -It is also possible to provide a $K_{sat}$ value per soil layer by specifying -`ksat_profile` "layered", these $K_{sat}$ values are used directly to compute the vertical +It is also possible to provide a $\subtext{K}{sat}$ value per soil layer by specifying +`ksat_profile` "layered", these $\subtext{K}{sat}$ values are used directly to compute the vertical transfer of water between soil layers and to the saturated store $S$. Finally, with the -`ksat_profile` "layered\_exponential" a $K_{sat}$ value per soil layer is used until depth -$z_\mathrm{layered}$ below the soil surface, and beyond $z_\mathrm{layered}$ an -exponential decline of $K_{sat}$ (of the soil layer with bottom $z_\mathrm{layered}$) +`ksat_profile` "layered\_exponential" a $\subtext{K}{sat}$ value per soil layer is used until depth +$\subtext{z}{layered}$ below the soil surface, and beyond $\subtext{z}{layered}$ an +exponential decline of $\subtext{K}{sat}$ (of the soil layer with bottom $\subtext{z}{layered}$) controlled by $f$ occurs. The different available `ksat_profle` options are schematized in -the figure below where the blue line represents the $K_{sat}$ value. +the figure below where the blue line represents the $\subtext{K}{sat}$ value. ![Overview of available `ksat_profile` options, for a soil column with five layers](../../images/sbm_ksat_profiles.png) @@ -481,17 +470,17 @@ runoff routing scheme. The infiltrating water is split in two parts, the part that falls on compacted areas and the part that falls on non-compacted areas. The maximum amount of water that can infiltrate in these areas is calculated by taking the minimum of the maximum infiltration rate -(`infiltcapsoil` [mm t$^{-1}$] for non-compacted areas and `infiltcappath` [mm t$^{-1}$] +(`infiltcapsoil` $\SIb{}{mm t^{-1}}$ for non-compacted areas and `infiltcappath` $\SIb{}{mm t^{-1}}$ for compacted areas) and the amount of water available for infiltration `avail_forinfilt` -[mm t$^{-1}$]. The water that can actually infiltrate `infiltsoilpath` [mm t$^{-1}$] is +$\SIb{}{mm t^{-1}}$. The water that can actually infiltrate `infiltsoilpath` $\SIb{}{mm t^{-1}}$ is calculated by taking the minimum of the total maximum infiltration rate (compacted and non-compacted areas) and the remaining storage capacity. Infiltration excess occurs when the infiltration capacity is smaller then the throughfall -and stemflow rate. This amount of water (`infiltexcess` [mm t$^{-1}$]) becomes overland +and stemflow rate. This amount of water (`infiltexcess` $\SIb{}{mm t^{-1}}$) becomes overland flow (infiltration excess overland flow). Saturation excess occurs when the (upper) soil becomes saturated and water cannot infiltrate anymore. This amount of water `excesswater` -[mm t$^{-1}$] becomes overland flow (saturation excess overland flow). +$\SIb{}{mm t^{-1}}$ becomes overland flow (saturation excess overland flow). #### Infiltration in frozen soils @@ -506,14 +495,12 @@ The near surface soil temperature is modelled using a simple equation (Wigmosta 2009): $$ -T_s^{t} = T_s^{t-1} + w (T_a - T_s^{t-1}) +T_s^t = T_s^{t-1} + w (T_a - T_s^{t-1}) $$ - -where $T_s^{t}$ [$\degree$C] is the near-surface soil temperature at time $t$, $T_a$ -[$\degree$C] is air temperature and $w$ [-] is a weighting coefficient determined +where $\SIb{T_s^{t}}{\degree C}$ is the near-surface soil temperature at time $t$, $\SIb{T_a}{\degree C}$ is air temperature and $\SIb{w}{-}$ is a weighting coefficient determined through calibration (default is 0.1125 for daily timesteps). -A reduction factor (`cf_soil` [-], default is 0.038) is applied to the maximum infiltration +A reduction factor (`cf_soil` $\SIb{}{-}$, default is 0.038) is applied to the maximum infiltration rate (`infiltcapsoil` and `infiltcappath`), when the following model settings are specified in the TOML file: @@ -530,12 +517,10 @@ A S-curve (see plot below) is used to make a smooth transition (a c-factor ($c$) used): $$ -\begin{split} -b &= \frac{1.0}{(1.0 - cf\_soil)} \\ -soilinfredu &= \frac{1.0}{b + exp(-c (T_s - a))} + cf\_soil \\ -a &= 0.0 \\ -c &= 8.0 -\end{split} + b = \frac{1.0}{1.0 - \subtext{\mathrm{cf}}{soil}}\\~\\ + \mathrm{soilinfredu} = \frac{1.0}{b + \exp(-c (T_s - a))} + \subtext{\mathrm{cf}}{soil}\\~\\ + a = 0.0\\ + c = 8.0 $$ ![Infiltration correction factor as a function of soil temperature](../../images/soil_frozeninfilt.png) @@ -545,12 +530,12 @@ $$ ### Capillary rise -The actual capillary rise `actcapflux` [mm t$^{-1}$] is determined using the following -approach: first the saturated hydraulic conductivity `ksat` [mm t$^{-1}$] is determined at -the water table $z_{i}$; next a potential capillary rise `maxcapflux` [mm t$^{-1}$] is -determined from the minimum of `ksat`, actual transpiration `actevapustore` [mm t$^{-1}$] -taken from the $U$ store, available water in the $S$ store (`satwaterdepth` [mm]) and -the deficit of the $U$ store (`ustorecapacity` [mm]), as shown by the following code +The actual capillary rise `actcapflux` $\SIb{}{mm t^{-1}}$ is determined using the following +approach: first the saturated hydraulic conductivity `ksat` $\SIb{}{mm t^{-1}}$ is determined at +the water table $z_i$; next a potential capillary rise `maxcapflux` $\SIb{}{mm t^{-1}}$ is +determined from the minimum of `ksat`, actual transpiration `actevapustore` $\SIb{}{mm t^{-1}}$ +taken from the $U$ store, available water in the $S$ store (`satwaterdepth` $\SIb{}{mm}$) and +the deficit of the $U$ store (`ustorecapacity` $\SIb{}{mm}$), as shown by the following code block: ```julia @@ -558,8 +543,7 @@ maxcapflux = max(0.0, min(ksat, actevapustore, ustorecapacity, satwaterdepth)) ``` Then the potential rise `maxcapflux` is scaled using the water table depth `zi`, a maximum -water depth `cap_hmax` [mm] beyond which capillary rise ceases and a coefficient `cap_n` -[-], as follows in the code block below (`i` refers to the index of the vector that contains +water depth `cap_hmax` $\SIb{}{mm}$ beyond which capillary rise ceases and a coefficient `cap_n` $\SIb{}{-}$, as follows in the code block below (`i` refers to the index of the vector that contains all active cells within the spatial model domain): ```julia @@ -586,8 +570,8 @@ the layer position): usl[k] * (sbm.theta_s[i] - sbm.theta_r[i]) - usld[k] ``` -where `usl` [mm] is the unsaturated layer thickness, `usld` is the `ustorelayerdepth` \[mm\] -(amount of water in the unsaturated layer), and $\theta_{s}$ and $\theta_{r}$ as +where `usl` $\SIb{}{mm}$ is the unsaturated layer thickness, `usld` is the `ustorelayerdepth` $\SIb{}{mm}$ +(amount of water in the unsaturated layer), and $\theta_s$ and $\theta_r$ as previously defined. The calculation of the actual capillary rise `actcapflux` is as follows in the code block @@ -608,11 +592,11 @@ end In case of multiple unsaturated layers (`n_usl` $>$ 1), the calculation of the actual capillary rise starts at the lowest unsaturated layer while keeping track of the remaining -capillary rise `netcapflux` [mm t$^{-1}$]. +capillary rise `netcapflux` $\SIb{}{mm t^{-1}}$. ### Leakage -If the `maxleakage` (mm/day) input model parameter is set > 0, water is lost from the +If the `maxleakage` $\SIb{}{mm day^{-1}}$ input model parameter is set > 0, water is lost from the saturated zone and runs out of the model. ## Open water @@ -633,17 +617,17 @@ industry = true livestock = true ``` -For these non-irrigation sectors the gross demand (``d_\mathrm{gross}`` [mm t``^{-1}``]) and -net demand (``d_\mathrm{net}`` [mm t``^{-1}``]) are provided to the model (input through +For these non-irrigation sectors the gross demand ($d_\mathrm{gross}$ $\SIb{}{mm t^{-1}}$) and +net demand ($d_\mathrm{net}$ $\SIb{}{mm t^{-1}}$) are provided to the model (input through cyclic or forcing data). Gross demand represents the total demand and hence the total abstraction from surface water or groundwater when sufficient water is available. Net demand represents water consumption. The portion of total abstracted water that is not consumed is -returned as surface water. The return flow fraction (``f_\mathrm{return}`` [-]) is +returned as surface water. The return flow fraction ($f_\mathrm{return}$ [-]) is calculated as follows: -```math - f_\mathrm{return} = 1.0 - \frac{d_\mathrm{net}}{d_\mathrm{gross}}, -``` +$$ + \subtext{f}{return} = 1.0 - \frac{\subtext{d}{net}}{\subtext{d}{gross}}, +$$ and used to calculate the return flow rate (water abstracted from surface water or groundwater but not consumed). For grid cells containing a river the return flow is directly returned to the river routing component, otherwise the return flow is returned to the @@ -658,26 +642,25 @@ supported. These computations can be enabled by specifying the following in the nonpaddy = true ``` Irrigation is applied during the growing season (when input parameter `irrigation_trigger` -[-] is `true` (or `on`)) and when water depletion exceeds the readily available water: +$\SIb{}{-}$ is `true` (or `on`)) and when water depletion exceeds the readily available water: -```math - (U_\mathrm{field} - U_\mathrm{a}) \ge (U_\mathrm{field} - U_\mathrm{h3}) -``` -where ``U_\mathrm{field}`` \[mm\] is the unsaturated store in the root zone at field -capacity (defined at a soil water pressure head of -100 cm), ``U_\mathrm{a}`` \[mm\] is the -actual unsaturated store in the root zone and ``U_\mathrm{h3}`` \[mm\] is the unsaturated +$$ + (\subtext{U}{field} - \subtext{U}{a}) \ge (\subtext{U}{field} - \subtext{U}{h3}) +$$ +where $\SIb{\subtext{U}{field}}{mm}$ is the unsaturated store in the root zone at field +capacity (defined at a soil water pressure head of $\SI{-100}{cm}$), $\SIb{\subtext{U}{a}}{mm}$ is the +actual unsaturated store in the root zone and $\SIb{\subtext{U}{h3}}{mm}$ is the unsaturated store in the root zone at the critical soil water pressure head `h3`, below this pressure head reduction of root water uptake starts due to drought stress. The net irrigation demand -[mm t``^{-1}``] is the irrigation rate that brings the root zone back to field capacity, -limited by the soil infiltration capacity [mm t``^{-1}``], assuming that farmers do not +$\SIb{}{mm t^{-1}}$ is the irrigation rate that brings the root zone back to field capacity, +limited by the soil infiltration capacity $\SIb{}{mm t^{-1}}$, assuming that farmers do not apply an irrigation rate higher than the soil infiltration capacity. To account for limited irrigation efficiency the net irrigation demand is divided by the irrigation efficiency for -non-paddy crops (`irrigation_efficiency` [-], default is 1.0), resulting in gross irrigation -demand [mm t``^{-1}``]. Finally, the gross irrigation demand is limited by the maximum -irrigation rate (`maximum_irrigation_rate` [mm t``^{-1}``], default is 25 mm d``^{-1}``). If +non-paddy crops (`irrigation_efficiency` $\SIb{}{-}$, default is $1.0$), resulting in gross irrigation +demand $\SIb{}{mm t^{-1}}$. Finally, the gross irrigation demand is limited by the maximum +irrigation rate (`maximum_irrigation_rate` $\SIb{}{mm t^{-1}}$, default is $\SI{25}^{mm\;day-1}$). If the maximum irrigation rate is applied, irrigation continues at subsequent time steps until -field capacity is reached. Irrigation is added to the `SBM` variable `avail_forinfilt` [mm -t``^{-1}``], the amount of water available for infiltration. +field capacity is reached. Irrigation is added to the `SBM` variable `avail_forinfilt` $\SIb{}{mm t^{-1}}$, the amount of water available for infiltration. ## Paddy irrigation Paddy (flooded rice) water demand and allocation computations are supported. These @@ -688,26 +671,25 @@ computations can be enabled by specifying the following in the TOML file: paddy = true ``` Irrigation is applied during the growing season (when input parameter `irrigation_trigger` -[-] is `true` (or `on`)) and when the paddy water depth `h` \[mm\] reaches below the minimum -water depth `h_min` \[mm\] (see also the figure below). The net irrigation demand [mm -t``^{-1}``] is the irrigation rate required to reach the optimal paddy water depth `h_opt` -\[mm\], an approach similar to Xie and Cui (2011). To account for limited irrigation +$\SIb{}{-}$ is `true` (or `on`)) and when the paddy water depth `h` $\SIb{}{mm}$ reaches below the minimum +water depth `h_min` $\SIb{}{mm}$ (see also the figure below). The net irrigation demand [mm +t$^{-1}$] is the irrigation rate required to reach the optimal paddy water depth `h_opt` +$\SIb{}{mm}$, an approach similar to Xie and Cui (2011). To account for limited irrigation efficiency the net irrigation demand is divided by the irrigation efficiency for paddy -fields (`irrigation_efficiency` [-], default is 1.0), resulting in gross irrigation demand -[mm t``^{-1}``]. Finally, the gross irrigation demand is limited by the maximum irrigation -rate (`maximum_irrigation_rate` [mm t``^{-1}``], default is 25 mm d``^{-1}``). If the +fields (`irrigation_efficiency` $\SIb{}{-}$, default is 1.0), resulting in gross irrigation demand +$\SIb{}{mm t^{-1}}$. Finally, the gross irrigation demand is limited by the maximum irrigation +rate (`maximum_irrigation_rate` $\SIb{}{mm t^{-1}}$, default is $\SIb{25}{mm d^{-1}}$). If the maximum irrigation rate is applied, irrigation continues at subsequent time steps until the optimal paddy water depth `h_opt` is reached. Irrigation is added to the `SBM` variable -`avail_forinfilt` [mm t``^{-1}``], the amount of water available for infiltration. When the -paddy water depth `h` exceeds `h_max` \[mm\] runoff occurs, and this amount is added to the +`avail_forinfilt` $\SIb{}{mm t^{-1}}$, the amount of water available for infiltration. When the +paddy water depth `h` exceeds `h_max` $\SIb{}{mm}$ runoff occurs, and this amount is added to the runoff routing scheme for overland flow. The figure below shows a typical vertical soil profile of a puddled rice soil with a muddy layer of about 15 cm (in this case represented by two soil layers of 5 cm and 10 cm thickness), a plow soil layer of 5 cm with relative low -permeability (vertical hydraulic conductivity ``k_v`` of about 5 mm d``^{-1}``), and a +permeability (vertical hydraulic conductivity $k_v$ of about $\SI{5}{mm d^{-1}}$), and a non-puddled soil below the plow soil layer. The low vertical hydraulic conductivity of the -plow soil layer can be realized by making use of the parameter `kvfrac` [-], a -multiplication factor applied to the vertical hydraulic conductivity at soil depth ``z`` -[mm]. +plow soil layer can be realized by making use of the parameter `kvfrac` $\SIb{}{-}$, a +multiplication factor applied to the vertical hydraulic conductivity at soil depth $\SIb{z}{mm}$. ![paddy_profile](../../images/paddy_profile.png) @@ -731,76 +713,72 @@ how much water is supplied by available surface water and groundwater. ### Local First, surface water abstraction (excluding reservoir and lake locations) is computed to satisfy local (same grid cell) water demand. The available surface water volume is limited -by a fixed scaling factor of 0.8 to prevent rivers from completely drying out. It is assumed +by a fixed scaling factor of $0.8$ to prevent rivers from completely drying out. It is assumed that the water demand cannot be satisfied completely from local surface water and -groundwater. The next step is to satisfy the remaining water demand for allocation `areas` -[-], described in the next sub-section. +groundwater. The next step is to satisfy the remaining water demand for allocation `areas` $\SIb{}{-}$, described in the next sub-section. ### Allocation areas -For allocation areas the water demand ``V_\mathrm{sw, demand}`` [m``^3``] and availability -``V_\mathrm{sw, availabilty}`` [m``^3``] are summed (including reservoir and lake locations -limited by a fixed scaling factor of 0.98), and the total surface water abstraction is then: +For allocation areas the water demand $\SIb{\subtext{V}{sw, demand}}{m^3}$ and availability +$\SIb{\subtext{V}{sw, availabilty}}{m^3}$ are summed (including reservoir and lake locations +limited by a fixed scaling factor of $0.98$), and the total surface water abstraction is then: -```math - V_\mathrm{sw, abstraction} = \mathrm{min}(V_\mathrm{sw, demand}, V_\mathrm{sw, availabilty}) -``` -The fraction of available surface water that can be abstracted ``f_\mathrm{sw, -abstraction}`` [-] at the allocation area level is then: +$$ + \subtext{V}{sw, abstraction} = \min (\subtext{V}{sw, demand}, \subtext{V}{sw, availabilty}) +$$ +The fraction of available surface water that can be abstracted $\SIb{\subtext{f}{sw,abstraction}}{-}$ at the allocation area level is then: -```math - f_\mathrm{sw, abstraction} = \frac{V_\mathrm{sw, abstraction}}{V_\mathrm{sw, available}} -``` +$$ + \subtext{f}{sw, abstraction} = \frac{\subtext{V}{sw, abstraction}}{\subtext{V}{sw, available}} +$$ This fraction is applied to the remaining available surface water of each river cell (including lake and reservoir locations) to compute surface water abstraction at each river cell and to update the local surface water abstraction. The fraction of water demand that can be satisfied by available surface water -``f_\mathrm{sw, allocation}`` [-] at the allocation area level is then: +$\SIb{\subtext{f}{sw, allocation}}{-}$ at the allocation area level is then: -```math - f_\mathrm{sw, allocation} = \frac{V_\mathrm{sw, abstraction}}{V_\mathrm{sw, demand}} -``` +$$ + \subtext{f}{sw, allocation} = \frac{\subtext{V}{sw, abstraction}}{\subtext{V}{sw, demand}} +$$ This fraction is applied to the remaining surface water demand of each land cell to compute the allocated surface water to each land cell. Then groundwater abstraction is computed to satisfy the remaining local water demand, where -groundwater abstraction is limited by a fixed scaling factor of 0.75 applied to the -groundwater volume. Finally, for allocation `areas` the water demand ``V_\mathrm{gw, -demand}`` [m``^3``] and availability ``V_\mathrm{gw, availabilty}`` [m``^3``] are summed, +groundwater abstraction is limited by a fixed scaling factor of $0.75$ applied to the +groundwater volume. Finally, for allocation `areas` the water demand $\SIb{\subtext{V}{gw,demand}}{m^3}$ and availability $\SIb{\subtext{V}{gw, availabilty}}{m^3}$ are summed, and the total groundwater abstraction is then: -```math - V_\mathrm{gw, abstraction} = \mathrm{min}(V_\mathrm{gw, demand}, V_\mathrm{gw, availabilty}) -``` +$$ + \subtext{V}{gw, abstraction} = \min(\subtext{V}{gw, demand}, \subtext{V}{gw, availabilty}) +$$ The fraction of available groundwater that can be abstracted at allocation area level -``f_\mathrm{gw, abstraction}`` [-] at the allocation area level is then: +$\SIb{\subtext{f}{gw, abstraction}}{-}$ at the allocation area level is then: -```math - f_\mathrm{gw, abstraction} = \frac{V_\mathrm{gw, abstraction}}{V_\mathrm{gw, available}} -``` +$$ + \subtext{f}{gw, abstraction} = \frac{\subtext{V}{gw, abstraction}}{\subtext{V}{gw, available}} +$$ This fraction is applied to the remaining available groundwater of each land cell to compute groundwater abstraction and to update the local groundwater abstraction. -The fraction of water demand that can be satisfied by available groundwater ``f_\mathrm{gw, -allocation}`` [-] at the allocation area level is then: +The fraction of water demand that can be satisfied by available groundwater $\SIb{\subtext{f}{gw,allocation}}{-}$ at the allocation area level is then: -```math - f_\mathrm{gw, allocation} = \frac{V_\mathrm{gw, abstraction}}{V_\mathrm{gw, demand}} -``` +$$ + \subtext{f}{gw, allocation} = \frac{\subtext{V}{gw, abstraction}}{\subtext{V}{gw, demand}} +$$ This fraction is applied to the remaining groundwater demand of each land cell to compute the allocated groundwater to each land cell. ### Abstractions Groundwater abstraction is implemented by subtracting this amount from the `recharge` variable of the lateral subsurface flow component (kinematic wave) or the recharge `rate` of -the groundwater flow module. Surface water `abstraction` [m``^3`` s``^{-1}``] is divided by -the flow length `dl` [m] and subtracted from the lateral inflow of kinematic wave routing +the groundwater flow module. Surface water `abstraction` $\SIb{}{m^3 s^{-1}}$ is divided by +the flow length `dl` $\SIb{}{m}$ and subtracted from the lateral inflow of kinematic wave routing scheme for river flow. For the local inertial routing scheme (river and optional floodplain -routing), the surface water `abstraction` [m``^3`` s``^{-1}``] is subtracted as part of the +routing), the surface water `abstraction` $\SIb{}{m^3 s^{-1}}$ is subtracted as part of the continuity equation of the local inertial model. For reservoir and lake locations surface -water is abstracted (`act_surfacewater_abst_vol` [m``^3`` t``^{-1}``]) from the reservoir -`volume` [m``^3``] and lake `storage` [m``^3``] respectively, with a subsequent update of -the lake `waterlevel` [m]. +water is abstracted (`act_surfacewater_abst_vol` $\SIb{}{m^3 s^{-1}}$) from the reservoir +`volume` $\SIb{}{m^3}$ and lake `storage` $\SIb{}{m^3}$ respectively, with a subsequent update of +the lake `waterlevel` $\SIb{}{m}$. ## References + Brooks, R. H., and Corey, A. T., 1964, Hydraulic properties of porous media, Hydrology diff --git a/docs/model_docs/vertical/sediment.qmd b/docs/model_docs/vertical/sediment.qmd index 8551af333..b1873d3d5 100644 --- a/docs/model_docs/vertical/sediment.qmd +++ b/docs/model_docs/vertical/sediment.qmd @@ -40,45 +40,42 @@ intensity of the rain kinetic energy depends on the length of the fall, rainfall by vegetation will then be reduced compared to direct throughfall. The kinetic energy of direct throughfall is estimated by (Morgan et al, 1998): $$ -KE_{direct} = 8.95 + 8.44\,log_{10}\,R_{i} + \subtext{\mathrm{KE}}{direct} = 8.95 + 8.44\,\log_{10}(R_i) $$ -where $KE_{direct}$ is the kinetic energy of direct throughfall (J m$^{-2}$ mm$^{-1}$) and -$R_{i}$ is rainfall intensity (mm h$^{-1}$). If the rainfall is intercepted by +where $\SIb{\subtext{\mathrm{KE}}{direct}}{J m^{-2} mm^{-1}}$ is the kinetic energy of direct throughfall and +$\SIb{R_i}{mm h^{-1}}$ is rainfall intensity. If the rainfall is intercepted by vegetation and falls as leaf drainage, its kinetic energy is then reduced according to (Brandt, 1990): $$ -KE_{leaf} = 15.8\,H_{p}^{0.5} - 5.87 + \subtext{\mathrm{KE}}{leaf} = 15.8\,\sqrt{H_p} - 5.87 $$ - -where $KE_{leaf}$ is kinetic energy of leaf drainage (J m$^{-2}$ mm$^{-1}$) and -$H_{p}$ is the effective canopy height (half of plant height in m). Canopy height can be +where $\SIb{\subtext{\mathrm{KE}}{leaf}}{J m^{-2} mm^{-1}}$ is kinetic energy of leaf drainage and +$\SIb{H_p}{m}$ is the effective canopy height (half of plant height). Canopy height can be derived from the global map from Simard & al. (2011) or by user input depending on the land use. Kinetic energies from both direct throughfall and leaf drainage are then multiplied by the respective depths of direct throughfall and leaf drainage (mm) and added to get the total -rainfall kinetic energy $KE$. The soil detached by rainfall $D_{R}$ (g m$^{-2}$) is +rainfall kinetic energy ``\mathrm{KE}``. The soil detached by rainfall ``\SIb{D_R}{g m^{-2}}`` is then: $$ -D_{R} = k\,KE\,e^{-\varphi h} + D_R = k\,\mathrm{KE}\,e^{-\varphi h} $$ - -where $k$ is an index of the detachability of the soil (g $J^{-1}$), $KE$ is the total -rainfall kinetic energy (J m$^{-2}$), $h$ is the surface runoff depth on the soil (m) -and $\varphi$ is an exponent varying between 0.9 and 3.1 used to reduce rainfall impact if +where $\SIb{k}{g J^{-1}}$ is an index of the detachability of the soil, $\SIb{\mathrm{KE}}{J m^{-2}}$ is the total +rainfall kinetic energy, $\SIb{h}{m}$ is the surface runoff depth on the soil and $\varphi$ is an exponent varying between $0.9$ and $3.1$ used to reduce rainfall impact if the soil is already covered by water. As a simplification, Torri (1987) has shown that a -value of 2.0 for $\varphi$ is representative enough for a wide range of soil conditions. +value of $2.0$ for $\varphi$ is representative enough for a wide range of soil conditions. The detachability of the soil $k$ depends on the soil texture (proportion of clay, silt and sand content) and corresponding values are defined in EUROSEM user guide (Morgan et al, -1998). As a simplification, in wflow\_sediment, the mean value of the detachability shown in +1998). As a simplification, in `wflow_sediment`, the mean value of the detachability shown in the table below are used. Soil texture can for example be derived from the topsoil clay and silt content from SoilGrids (Hengl et al, 2017). Table: Mean detachability of soil depending on its texture (Morgan et al, 1998). -| Texture (USDA system) | Mean detachability $k$ (g/J) | -| ---- | ---- | +| Texture (USDA system) | Mean detachability $\SIb{k}{g J^{-1}}$ | +|:--------------------- | ------------------------------ | | Clay | 2.0 | | Clay Loam | 1.7 | | Silt | 1.2 | @@ -93,13 +90,12 @@ Rainfall erosion is handled differently in ANSWERS. There, the impacts of vegeta soil properties are handled through the USLE coefficients in the equation (Beasley et al, 1991): $$ -D_{R} = 0.108 \, C_{USLE} \, K_{USLE} \, A_{i} \, R_{i}^{2} + D_R = 0.108 \, \subtext{C}{USLE} \, \subtext{K}{USLE} \, A_i \, R_i^2 $$ - -where $D_{R}$ is the soil detachment by rainfall (here in kg min$^{-1}$), $C_{USLE}$ -is the soil cover-management factor from the USLE equation, $K_{USLE}$ is the soil -erodibility factor from the USLE equation, $A_{i}$ is the area of the cell (m$^{2}$) and -$R_{i}$ is the rainfall intensity (here in mm min$^{-1}$). There are several methods +where $\SIb{D_R}{kg min^{-1}}$ is the soil detachment by rainfall, $\subtext{C}{USLE}$ +is the soil cover-management factor from the USLE equation, $\subtext{K}{USLE}$ is the soil +erodibility factor from the USLE equation, $\SIb{A_i}{m^2}$ is the area of the cell and +$\SIb{R_i}{mm\;min^{-1}}$ is the rainfall intensity. There are several methods available to estimate the $C$ and $K$ factors from the USLE. They can come from user input maps, for example maps resulting from Panagos & al.'s recent studies for Europe (Panagos et al, 2015) (Ballabio et al, 2016). To get an estimate of the $C$ factor @@ -114,28 +110,25 @@ The other methods to estimate the USLE $K$ factor are to use either topsoil comp topsoil geometric mean diameter. $K$ estimation from topsoil composition is estimated with the equation developed in the EPIC model (Williams et al, 1983): $$ -\begin{split} -K_{USLE} &= \left\{ 0.2 + 0.3exp\left[-0.0256SAN\frac{(1-SIL)}{100}\right] \right\} -\left(\frac{SIL}{CLA+SIL}\right)^{0.3} \\ -& \left(1-\frac{0.25OC}{OC+e^{(3.72-2.95OC)}}\right)\left(1-\frac{0.75SN}{SN+e^{(-5.51+22.9SN)}}\right) -\end{split} + \subtext{K}{USLE} = \left[ 0.2 + 0.3\exp\left(-0.0256\;\mathrm{SAN}\frac{(1-\mathrm{SIL})}{100}\right) \right] + \left(\frac{\mathrm{SIL}}{\mathrm{CLA}+\mathrm{SIL}}\right)^{0.3} \\~\\ + \left(1-\frac{0.25\;\mathrm{OC}}{\mathrm{OC}+e^{3.72-2.95\;\mathrm{OC}}}\right)\left(1-\frac{0.75\;\mathrm{SN}}{\mathrm{SN}+e^{-5.51+22.9\;\mathrm{SN}}}\right) $$ - -where $CLA$, $SIL$, $SAN$ are respectively the clay, silt and sand fractions of the -topsoil (%), $OC$ is the topsoil organic carbon content (%) and $SN$ is $1-SAN/100$. +where $\SIb{\mathrm{CLA}}{\%}$, $\SIb{\mathrm{SIL}}{\%}$, $\SIb{\mathrm{SAN}}{\%}$ are respectively the clay, silt and sand fractions of the +topsoil, $\SIb{OC}{\%}$ is the topsoil organic carbon content and $\mathrm{SN} = 1-\mathrm{SAN}/100$. These soil parameters can be derived for example from the SoilGrids dataset. The $K$ factor can also be estimated from the soil mean geometric diameter using the formulation from the RUSLE guide by Renard & al. (1997): $$ -K_{USLE} = 0.0034 + 0.0405e^{\left(-\dfrac{1}{2}\left(\dfrac{log_{10}(D_{g})+1.659}{0.7101}\right)^{2}\right)} + \subtext{K}{USLE} = 0.0034 + 0.0405\exp\left(-\dfrac{1}{2}\left(\dfrac{\log_{10}(D_g)+1.659}{0.7101}\right)^2\right) $$ -where $D_{g}$ is the soil geometric mean diameter (mm) estimated from topsoil clay, silt, +where $D_g$ is the soil geometric mean diameter (mm) estimated from topsoil clay, silt, sand fraction. Table: Estimation of USLE C factor per Globcover land use type -| GlobCover Value | Globcover label | $C_{USLE}$ | -| ---- | ---------- | ---- | +| GlobCover Value | Globcover label | $\subtext{C}{USLE}$ | +|:--------------- | --------------- | ------------ | | 11 | Post-flooding or irrigated croplands (or aquatic) | 0.2 | | 14 | Rainfed croplands | 0.35 | | 20 | Mosaic cropland (50-70%) vegetation (grassland/shrubland/forest) (20-50%) | 0.27 | @@ -167,13 +160,11 @@ the surface water on the soil. As in rainfall erosion, the effect of the flow sh can be reduced by the soil vegetation or by the soil properties. In wflow_sediment, soil detachment by overland flow is modelled as in ANSWERS with (Beasley et al, 1991): $$ -D_{F} = 0.90 \, C_{USLE} \, K_{USLE} \, A_{i} \, S \, q + D_G = 0.90 \, \subtext{C}{USLE} \, \subtext{K}{USLE} \, A_i \, S \, q $$ - -where $D_{F}$ is soil detachment by flow (kg min$^{-1}$), $C_{USLE}$ and $K_{USLE}$ -are the USLE cover and soil erodibility factors, $A_{i}$ is the cell area (m$^{2}$), -$S$ is the slope gradient and $q$ is the overland flow rate per unit width (m$^{2}$ -min$^{-1}$). The USLE $C$ and $K$ factors can be estimated with the same methods as +where $\SIb{D_F}{kg\;min^{-1}}$ is soil detachment by flow, $\subtext{C}{USLE}$ and $\subtext{K}{USLE}$ +are the USLE cover and soil erodibility factors, $\SIb{A_i}{m^2}$ is the cell area, +$S$ is the slope gradient and $\SIb{q}{m^2 min^{-1}}$ is the overland flow rate per unit width. The USLE $C$ and $K$ factors can be estimated with the same methods as for rainfall erosion and here the slope gradient is obtained from the sinus rather than the tangent of the slope angle. diff --git a/docs/model_docs/vertical/shared_processes.qmd b/docs/model_docs/vertical/shared_processes.qmd index e1e7b9d55..8c154ae2a 100644 --- a/docs/model_docs/vertical/shared_processes.qmd +++ b/docs/model_docs/vertical/shared_processes.qmd @@ -6,8 +6,8 @@ title: Shared processes ### Snow modelling -If the air temperature, $T_a$, is below a user-defined threshold `tt` ($\degree$C) -precipitation occurs as snowfall, whereas it occurs as rainfall if $Ta ≥ tt$. A another +If the air temperature, $T_a$, is below a user-defined threshold `tt` $\SIb{}{\degree C}$ +precipitation occurs as snowfall, whereas it occurs as rainfall if $T_a ≥ \mathrm{tt}$. A another parameter `tti` defines how precipitation can occur partly as rain or snowfall (see the figure below). If precipitation occurs as snowfall, it is added to the dry snow component within the snow pack. Otherwise it ends up in the free water reservoir, which represents the @@ -18,15 +18,14 @@ interactions take place, either through snow melt (if temperatures are above a t The respective rates of snow melt and refreezing are: $$ -\begin{split} -Q_m &= cfmax(T_a−tt)\, ;\,T_a > tt \\ -Q_r &= cfmax \, cfr(tt−T_a)\,;\, Ta < tt -\end{split} +\begin{align*} + Q_m &=& \subtext{\mathrm{cf}}{max}(T_a−\mathrm{tt})\, &&T_a > \mathrm{tt} \\~\\ + Q_r &=& \subtext{\mathrm{cf}}{max} \, \mathrm{cf}_r(\mathrm{tt}−T_a) &&T_a < \mathrm{tt} +\end{align*} $$ where $Q_m$ is the rate of snow melt, $Q_r$ is the rate of snow refreezing, and -$cfmax$ and $cfr$ are user defined model parameters (the melting factor -[mm/($\degree$C day)] and the refreezing factor respectively). +$\SIb{\subtext{\mathrm{cf}}{max}}{mm\;(\degree C)^{-1} day^{-1}}$ and $\mathrm{cf}_r$ are user defined model parameters (the melting factor and the refreezing factor respectively). The fraction of liquid water in the snow pack is at most equal to a user defined fraction, `whc`, of the water equivalent of the dry snow content. If the liquid water concentration @@ -52,31 +51,30 @@ similar to snow modelling and considers two main processes: glacier build-up fro into firn/ice (using the HBV-light model) and glacier melt (using a temperature degree-day model). -The definition of glacier boundaries and initial volume is defined in three parameters. -`glacierfrac` is a parameter that gives the fraction of each grid cell covered by a glacier -as a number between zero and one. `glacierstore` is a state parameter that gives the amount -of water (in mm w.e.) within the glaciers at each gridcell. Because the glacier store +The definition of glacier boundaries and initial volume is defined by two parameters. The +parameter `glacierfrac` gives the fraction of each grid cell covered by a glacier as a +number between zero and one. The state parameter `glacierstore` gives the amount of water +(in mm w.e.) within the glaciers at each grid cell. Because the glacier store (`glacierstore`) cannot be initialized by running the model for a couple of years, a default initial state should be supplied by adding this parameter to the input static file. The required glacier data can be prepared from available glacier datasets. First, a fixed fraction of the snowpack on top of the glacier is converted into ice for each timestep and added to the `glacierstore` using the HBV-light model (Seibert et al., 2018). -This fraction `g_sifrac` typically ranges from 0.001 to 0.006. +This fraction `g_sifrac` typically ranges from $0.001$ to $0.006$. -Then, when the snowpack on top of the glacier is almost all melted (snow cover < 10 mm), +Then, when the snowpack on top of the glacier is almost all melted (snow cover $< \SI{10}{mm}$), glacier melt is enabled and estimated with a degree-day model. If the air temperature, -$T_a$, is below a certain threshold `g_tt` ($\degree$C) precipitation occurs as +$T_a$, is below a certain threshold `g_tt` ($\SIb{}{\degree C}$) precipitation occurs as snowfall, whereas it occurs as rainfall if $T_a ≥$ `g_tt`. With this the rate of glacier melt in mm is estimated as: $$ -Q_m = g\_cfmax(T_a − g\_tt)\, ; \, T_a > g\_tt +Q_m = \subtext{g}{cfmax}(T_a − \subtext{g}{tt})\, ; \, T_a > \subtext{g}{tt} $$ -where $Q_m$ is the rate of glacier melt and $g\_cfmax$ is the melting factor in -mm/($\degree$C day). Parameter `g_tt` can be taken as equal to the snow `tt` parameter. +where $Q_m$ is the rate of glacier melt and $\SIb{\subtext{g}{cfmax}}{mm (\degree C)^{-1}day^{-1}}$ is the melting factor. Parameter `g_tt` can be taken as equal to the snow `tt` parameter. Values of the melting factor `g_cfmax` normally varies from one glacier to another and some values are reported in the literature. `g_cfmax` can also be estimated by multiplying snow `cfmax` by a factor between 1 and 2, to take into account the higher albedo of ice compared @@ -93,7 +91,7 @@ storm-based approach will yield better results in situations with more than one day. The amount of water needed to completely saturate the canopy is defined as: $$ -P'=\frac{-\overline{R}S}{\overline{E}_{w}}ln\left[1-\frac{\overline{E}_{w}}{\overline{R}}(1-p-p_{t})^{-1}\right] +P'=\frac{-\overline{R}S}{\overline{E}_w}\log\left[1-\frac{\overline{E}_w}{\overline{R}}(1-p-p_t)^{-1}\right] $$ where $\overline{R}$ is the average precipitation intensity on a saturated canopy and @@ -110,13 +108,13 @@ and neglected. Table: Formulation of the components of interception loss according to Gash: | Components | Interception loss | -| -------- | ---- | -| For $m$ small storms ($P_{g}<{P'}_{g}$) | $(1-p-p_{t})\sum_{j=1}^{m}P_{g,j}$ | -| Wetting up the canopy in $n$ large storms ($P_{g}\geq{P'}_{g}$) | $n(1-p-p_{t}){P'}_{g}-nS$ | -| Evaporation from saturated canopy during rainfall | $\overline{E}/\overline{R}\sum_{j=1}^{n}(P_{g,j}-{P'}_{g})$| +|:----------- | ----------------- | +| For $m$ small storms ($P_g<{P'}_g$) | $(1-p-p_t)\sum_{j=1}^m P_{g,j}$ | +| Wetting up the canopy in $n$ large storms ($P_g\geq{P'}_g$) | $n(1-p-p_{t}){P'}_g-nS$ | +| Evaporation from saturated canopy during rainfall | $\overline{E}/\overline{R}\sum_{j=1}^n(P_{g,j}-{P'}_g)$| | Evaporation after rainfall ceases for $n$ large storms | $nS$ | -| Evaporation from trunks in $q$ storms that fill the trunk storage | $qS_{t}$ | -| Evaporation from trunks in $m+n-q$ storms that do not fill the trunk storage | $p_{t}\sum_{j=1}^{m+n-q}P_{g,j}$ | +| Evaporation from trunks in $q$ storms that fill the trunk storage | $qS_t$ | +| Evaporation from trunks in $m+n-q$ storms that do not fill the trunk storage | $p_t\sum_{j=1}^{m+n-q}P_{g,j}$ | In applying the analytical model, saturated conditions are assumed to occur when the hourly rainfall exceeds a certain threshold. Often a threshold of 0.5 mm/hr is used. @@ -153,11 +151,11 @@ cyclic = ["vertical.leaf_area_index"] ``` Furthermore these additional parameters are required: -+ Specific leaf storage (`sl` \[mm\]) -+ Storage woody part of vegetation (`swood` \[mm\]) -+ Extinction coefficient (`kext` \[-\]) ++ Specific leaf storage (`sl` $\SIb{}{mm}$) ++ Storage woody part of vegetation (`swood` $\SIb{}{mm}$) ++ Extinction coefficient (`kext` $\SIb{}{-}$) -Here it is assumed that `cmax` \[mm\] (leaves) (canopy storage capacity for the leaves only) +Here it is assumed that `cmax` $\SIb{}{mm}$ (leaves) (canopy storage capacity for the leaves only) relates linearly with LAI (c.f. Van Dijk and Bruijnzeel 2001). This done via the `sl`. `sl` can be determined through a lookup table with land cover based on literature (Pitman 1989, Lui 1998). Next the `cmax` (leaves) is determined using: @@ -166,6 +164,8 @@ $$ cmax(leaves) = sl \, LAI $$ + \mathrm{cmax}(\mathrm{leaves}) = \mathrm{sl} \cdot \mathrm{LAI} +``` To get to total storage (`cmax`) the woody part of the vegetation also needs to be added. As for `sl`, the storage of the woody part `swood` can also be related to land cover (lookup table). @@ -173,9 +173,9 @@ table). The canopy gap fraction is determined using the extinction coefficient `kext` (van Dijk and Bruijnzeel 2001): -$$ -canopygapfraction = exp(-kext \, LAI) -$$ +```math + \mathrm{canopygapfraction} = \exp(-\subtext{k}{ext} \cdot \mathrm{LAI}) +``` The extinction coefficient `kext` can be related to land cover. diff --git a/docs/user_guide/toml_file.qmd b/docs/user_guide/toml_file.qmd index 63265b907..8a922e582 100644 --- a/docs/user_guide/toml_file.qmd +++ b/docs/user_guide/toml_file.qmd @@ -10,25 +10,25 @@ relative to the location of the TOML file, or to `dir_input` and `dir_output` if given. ## General time info -Time information is optional. When left out, for each timestamp in the forcing netCDF wflow -will do computations, except for the first forcing timestamp that is considered equal to the -initial conditions of the wflow model (state time). If you wish to calculate a subset of -this time range, or a different timestep, you can specify a `starttime`, `endtime` and -`timestepsecs` yourself. The `starttime` is defined as the model state time. In the TOML -file settings below the `starttime` is 2000-01-01T00:00:00 (state time) and the first update -(and output) of the wflow model is at 2000-01-02T00:00:00. The `time_units` optional -information is used by the `writer` of the model, for model output in netCDF format. The -`calendar` option allows you to calculate in one of the different [CF conventions -calendars](http://cfconventions.org/cf-conventions/cf-conventions.html#calendar) provided by -the [CFTime.jl package](https://juliageo.org/CFTime.jl/latest/), such as `"360_day"`. This -is useful if you want to calculate climate scenarios which are sometimes provided in these -alternative calendars. +Time information is optional. When omitted, wflow will perform computations for each +timestamp in the forcing netCDF file, except for the first forcing timestamp, which is +considered equal to the initial conditions of the wflow model (state time). If you wish to +calculate a subset of this time range, or a different timestep, you can specify a +`starttime`, `endtime` and `timestepsecs`. The `starttime` is defined as the model state +time. In the TOML file settings below, the `starttime` is 2000-01-01T00:00:00 (state time) +and the first update (and output) of the wflow model is at 2000-01-02T00:00:00. The +`time_units` optional information is used by the `writer` of the model, for model output in +netCDF format. The `calendar` option allows you to calculate in one of the different [CF +conventions calendars](http://cfconventions.org/cf-conventions/cf-conventions.html#calendar) +provided by the [CFTime.jl package](https://juliageo.org/CFTime.jl/latest/), such as +`"360_day"`. This is useful if you want to calculate climate scenarios which are sometimes +provided in these alternative calendars. ```toml -calendar = "standard" # optional, this is default value +calendar = "standard" # optional, this is the default value starttime = 2000-01-01T00:00:00 # optional, default from forcing netCDF endtime = 2000-02-01T00:00:00 # optional, default from forcing netCDF -time_units = "days since 1900-01-01 00:00:00" # optional, this is default value +time_units = "days since 1900-01-01 00:00:00" # optional, this is the default value timestepsecs = 86400 # optional, default from forcing netCDF dir_input = "data/input" # optional, default is the path of the TOML dir_output = "data/output" # optional, default is the path of the TOML @@ -48,15 +48,16 @@ path_log = "log.txt" # optional, default is "log.txt" fews_run = false # optional, default value is false ``` -`silent` avoids logging to the terminal, and only writes the log file. `loglevel` controls -which levels are filtered out, so the default setting `"info"` does not show any debug level -messages. Note that for finer control, you can also pass an integer log level, see Julia's +`silent` avoids logging to the terminal, and only writes to the log file. `loglevel` +controls which levels are filtered out; for instance, the default setting `"info"` does not +print any debug-level messages. Note that for finer control, you can also pass an integer +log level. For details, see Julia's [Logging](https://docs.julialang.org/en/v1/stdlib/Logging/#Log-event-structure) -documentation. `path_log` sets the desired output path for the log file. For information -regarding `fews_run`, see [Run from Delft-FEWS](@ref run_fews). +documentation. `path_log` sets the desired output path for the log file. For information on +`fews_run`, see [Run from Delft-FEWS](@ref run_fews). ## Model section -Model specific settings can be included in the model section of the TOML file. +Model-specific settings can be included in the model section of the TOML file. ```toml [model] @@ -66,20 +67,19 @@ snow = false # include snow modelling, default is false reinit = true # cold (reinit = true) or warm state (reinit = false), default is true reservoirs = false # include reservoir modelling, default is false kin_wave_iteration = false # enable kinematic wave iterations in the model, default is false -thicknesslayers = [100, 300, 800] # specific SBM setting: for each soil layer a thickness [mm] is specified +thicknesslayers = [100, 300, 800] # specific SBM setting: for each soil layer, a thickness [mm] is specified min_streamorder_river = 5 # minimum stream order to delineate subbasins for river domain, default is 6 (for multi-threading computing purposes) min_streamorder_land = 4 # minimum stream order to delineate subbasins for land domain, default is 5 (for multi-threading computing purposes) ``` ## State options The `state` section in the TOML file provides information about the location of input and -output states of the model. This section is mostly relevant if the model needs to be started -with a "warm" state (i.e. based on the results of a previous simulation). The example below -shows how to save the output states of the current simulation, so it can be used to -initialize another model in the future. Details on the settings required to start a model -with a warm state can be found in the [additional model options](@ref reinit). If it is not -required to store the outstates of the current simulation, the entire `state` section can be -removed. +output states of the model. This section is mostly relevant if the model needs to start with +a "warm" state (i.e. based on the results of a previous simulation). The example below shows +how to save the output states of the current simulation, so it can be used to initialize +another model in the future. Details on the settings required to start a model with a warm +state can be found in the [additional model options](@ref reinit). If it is not required to +store the outstates of the current simulation, the entire `state` section can be removed. ```toml [state] @@ -113,16 +113,16 @@ h_av = "h_av_land" ## Input section The `input` section of the TOML file contains information about the input forcing and model -parameters files (netCDF format). Forcing is applied to the vertical component of the model, -and needs to be mapped to the external netCDF variable name. `forcing` lists the internal -model forcing parameters, and these are mapped to the external netCDF variables listed under -the section `[input.vertical]`. It is possible to provide cyclic parameters to the model -(minimum time step of 1 day). In the example below this is done for the internal -`vertical.leaf_area_index` model parameter, that is linked to the external netCDF variable -"LAI" variable. Cyclic time inputs of parameters can be different (for example daily and -monthly). The `time` dimension name of these cylic input parameters in the model parameter -netCDF file should start with "time". If a model parameter is not mapped, a default value -will be used if available. +parameters files (in netCDF format). Forcing is applied to the vertical component of the +model, and needs to be mapped to the external netCDF variable name. `forcing` lists the +internal model forcing parameters, and these are mapped to the external netCDF variables +listed under the section `[input.vertical]`. It is possible to provide cyclic parameters to +the model (minimum time step of 1 day). In the example below, the internal +`vertical.leaf_area_index` model parameter is mapped to the external netCDF variable "LAI" +variable. Cyclic time inputs of parameters can be different (e.g., daily or monthly). The +`time` dimension name of these cylic input parameters in the model parameter netCDF file +should start with "time". If a model parameter is not mapped, a default value will be used, +if available. ```toml [input] @@ -146,7 +146,7 @@ forcing = [ cyclic = ["vertical.leaf_area_index"] -[input.vertical] # Map internal model variable/parameter names to names of the variables in the netCDF files +[input.vertical] # Map internal model variable/parameter names to variable names in the netCDF files altitude = "wflow_dem" c = "c" cf_soil = "cf_soil" @@ -195,23 +195,22 @@ slope = "Slope" ## Output netCDF section ### Grid data -This optional section of the TOML file contains the output netCDF file for writing gridded -model output, including a mapping between internal model parameter components and external +This optional section of the TOML file specifies the output netCDF file for writing gridded +model output. It includes a mapping between internal model parameter components and external netCDF variables. -To limit the size of the resulting netCDF file, file compression can be enabled. This causes -an increase in computational time, but can significantly reduce the file size of the netCDF -file. This can be enabled by setting the `compressionlevel` variable to any value between -`0` and `9`. A setting of `0` indicates that compression is not enabled, and values between -1 and 9 indicate different levels of compression (1: least compression, smallest impact on -run time, 9: highest compression level, biggest impact on run times). If file size becomes -an issue, we recommend using a value of `1`, as higher compression levels generally have -only a limited effect on the file size. +To limit the size of the resulting netCDF file, file compression can be enabled. Compression +increases computational time but can significantly reduce the size of the netCDF file. Set +the `compressionlevel` variable to a value between `0` and `9`. A setting of `0` means no +compression, while values between 1 and 9 indicate increasing levels of compression (1: +least compression, minimal run-time impact, 9: highest compression, maximum run-time +impact). If file size is a concern, we recommend using a value of `1`, as higher compression +levels generally have a limited effect on file size. ```toml [output] path = "output_moselle.nc" # Location of the output file -compressionlevel = 1 # Amount of compression (default 0) +compressionlevel = 1 # Compression level (default 0) [output.vertical] # Mapping of names between internal model components and external netCDF variables satwaterdepth = "satwaterdepth" @@ -259,12 +258,12 @@ of Delft-FEWS can ingest this data format directly. [netcdf] path = "output_scalar_moselle.nc" # Location of the results -[[netcdf.variable]] # Extract the values of lateral.river.q using the gauges map, and assigning it with the name 'Q' as variable to the netCDF +[[netcdf.variable]] # Extract the values of lateral.river.q using the gauges map, and assign it with the name 'Q' as a variable in the netCDF file name = "Q" map = "gauges" parameter = "lateral.river.q" -[[netcdf.variable]] # Using coordinates to extract the temperature +[[netcdf.variable]] # Using coordinates to extract temperature coordinate.x = 6.255 coordinate.y = 50.012 name = "vwc_layer2_bycoord" @@ -272,7 +271,7 @@ location = "vwc_bycoord" parameter = "vertical.vwc" layer = 2 -[[netcdf.variable]] # Using indices to extract the temperature +[[netcdf.variable]] # Using indices to extract temperature location = "temp_byindex" name = "temp_index" index.x = 100 @@ -281,9 +280,9 @@ parameter = "vertical.temperature" ``` ## Output CSV section -Model output can also be written to CSV output. Below is an example that writes model output -to the file "output_moselle.csv". For each CSV column a `header` and `parameter` (internal -model parameter) is required. A `reducer` can be specified to apply to the model output, +Model output can also be written to a CSV file. Below is an example that writes model output +to the file "output_moselle.csv". For each CSV column, a `header` and `parameter` (internal +model parameter) are required. A `reducer` can be specified to apply to the model output, with the following available reducers: + maximum @@ -305,8 +304,8 @@ variables that have an extra dimension `layer` and are part of the vertical `sbm internal layer index (see also example below) should be specified. If multiple layers are desired, this can be specified in separate `[[csv.column]]` entries. -The double brackets in `[[csv.column]]` is TOML syntax to indicate that it is part of a -list. You may specify as many entries as you wish. +The double brackets in `[[csv.column]]` follow TOML syntax, indicating that it is part of a +list. You can specify as many entries as you want. ```toml [csv] @@ -357,11 +356,11 @@ reducer = "mean" It is possible to modify model parameters and forcing through the TOML file. Two options to modify input parameters are available: -- Set an input parameter (static) to an uniform value. -- Modify an input parameter (cyclic and static) or forcing variable through the use of a - `scale` factor and `offset`. +- Set an input parameter (static) to a uniform value. +- Modify an input parameter (cyclic and static) or forcing variable using a `scale` factor + and `offset`. -To set for example the input parameter `cfmax` to an uniform value of 2.5: +For example, to set the input parameter `cfmax` to an uniform value of 2.5: ```toml [input.vertical] @@ -370,10 +369,9 @@ waterfrac = "WaterFrac" cfmax.value = 2.5 ``` -For input parameters with an extra dimension (e.g. `layer` or `classes`) one uniform value -can be provided or a list of values that should be equal to the length of the extra -dimension. For example, for input parameter `c`, a list of values can be provided as -follows: +For input parameters with an extra dimension (e.g. `layer` or `classes`), one uniform value +can be provided or a list of values that matches the length of the additional dimension. For +example, a list of values can be provided for input parameter `c` as follows: ```toml [input.vertical] @@ -382,7 +380,7 @@ waterfrac = "WaterFrac" c.value = [10.5, 11.25, 9.5, 7.0] ``` -To change for example the forcing variable `precipitation` with a `scale` factor of 1.5 and +To change the forcing variable `precipitation` with a `scale` factor of 1.5 and an `offset` of 0.5: ```toml @@ -392,10 +390,10 @@ scale = 1.5 offset = 0.5 ``` -For input parameters with an extra dimension it is also possible to modify multiple indices -at once with different `scale` and `offset` values. In the example below the external -netCDF variable `c` is modified at `layer` index 1 and 2, with a `scale` factor of 2.0 and -1.5 respectively, and an `offset` of 0.0 for both indices: +For input parameters with an extra dimension, it is also possible to modify multiple indices +simultaneously with different `scale` and `offset` values. In the example below, the +external netCDF variable `c` is modified at `layer` index 1 and 2, with a `scale` factor of +2.0 and 1.5 respectively, and an `offset` of 0.0 for both indices: ```toml [input.vertical.c] @@ -406,9 +404,9 @@ layer = [1, 2] ``` ## Fixed forcing values -It is possible to set fixed values for forcing parameters through the TOML file. To set for -example `temperature` to a fixed value of 10 ``\degree``C, the complete `forcing` list is -required: +It is possible to set fixed values for forcing parameters through the TOML file. For +example, to set `temperature` to a fixed value of 10 ``\degree``C, the complete `forcing` +list is required: ```toml forcing = [ @@ -421,8 +419,8 @@ forcing = [ value = 10 ``` -Note that the mapping to the external netCDF variable listed under the section -`[input.vertical]` needs to be removed or commented out: +Note that the mapping to the external netCDF variable listed under the `[input.vertical]` +section needs to be removed or commented out: ```toml [input.vertical] diff --git a/pixi.lock b/pixi.lock index c641b5934..2eb64b424 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,4 +1,4 @@ -version: 4 +version: 5 environments: default: channels: @@ -7,42 +7,43 @@ environments: linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/juliaup-1.13.0-he8a937b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/juliaup-1.17.6-h8fae777_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.2-hab00c5b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.6-hc5c86c4_2_cpython.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 win-64: - - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/juliaup-1.13.0-h975169c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/juliaup-1.17.6-ha073cba_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.2-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.6-hce54a09_2_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_21.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-ha82c5b3_21.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_21.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 packages: - kind: conda @@ -77,131 +78,143 @@ packages: - kind: conda name: bzip2 version: 1.0.8 - build: hcfcfb64_5 - build_number: 5 + build: h2466b09_7 + build_number: 7 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda - sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 - md5: 26eb8ca6ea332b675e11704cce84a3be + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h2466b09_7.conda + sha256: 35a5dad92e88fdd7fc405e864ec239486f4f31eec229e31686e61a140a8e573b + md5: 276e7ffe9ffe39688abc665ef0f45596 depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: bzip2-1.0.6 license_family: BSD - size: 124580 - timestamp: 1699280668742 + size: 54927 + timestamp: 1720974860185 - kind: conda name: bzip2 version: 1.0.8 - build: hd590300_5 - build_number: 5 + build: h4bc722e_7 + build_number: 7 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda - sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 - md5: 69b8b6202a07720f448be700e300ccf4 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda + sha256: 5ced96500d945fb286c9c838e54fa759aa04a7129c59800f0846b4335cee770d + md5: 62ee74e96c5ebb0af99386de58cf9553 depends: + - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 license: bzip2-1.0.6 license_family: BSD - size: 254228 - timestamp: 1699279927352 + size: 252783 + timestamp: 1720974456583 - kind: conda name: ca-certificates - version: 2024.2.2 + version: 2024.8.30 build: h56e8100_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.2.2-h56e8100_0.conda - sha256: 4d587088ecccd393fec3420b64f1af4ee1a0e6897a45cfd5ef38055322cea5d0 - md5: 63da060240ab8087b60d1357051ea7d6 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.8.30-h56e8100_0.conda + sha256: 0fcac3a7ffcc556649e034a1802aedf795e64227eaa7194d207b01eaf26454c4 + md5: 4c4fd67c18619be5aa65dc5b6c72e490 license: ISC - size: 155886 - timestamp: 1706843918052 + size: 158773 + timestamp: 1725019107649 - kind: conda name: ca-certificates - version: 2024.2.2 + version: 2024.8.30 build: hbcca054_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda - sha256: 91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb - md5: 2f4327a1cbe7f022401b236e915a5fef + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.8.30-hbcca054_0.conda + sha256: afee721baa6d988e27fef1832f68d6f32ac8cc99cdf6015732224c2841a09cea + md5: c27d1c142233b5bc9ca570c6e2e0c244 license: ISC - size: 155432 - timestamp: 1706843687645 + size: 159003 + timestamp: 1725018903918 - kind: conda name: juliaup - version: 1.13.0 - build: h975169c_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/juliaup-1.13.0-h975169c_0.conda - sha256: a14b9856b9c2f6ffd40d1b538dc1539b5e3058710df7c3c8fd8d837d2d43b1eb - md5: 78c45d1f9c8f0f4e563802d46db11ec0 + version: 1.17.6 + build: h8fae777_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/juliaup-1.17.6-h8fae777_0.conda + sha256: 3c536811bf6efc004b34b81e6f6b8670c070c93dca67d8dbf4869c311a977a40 + md5: f355be9b0191ef5c52e282808ae13ba2 depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - __glibc >=2.17 license: MIT license_family: MIT - size: 1391312 - timestamp: 1706565757417 + size: 2630720 + timestamp: 1725414884974 - kind: conda name: juliaup - version: 1.13.0 - build: he8a937b_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/juliaup-1.13.0-he8a937b_0.conda - sha256: 7eec8c76b948ff51cfdb03e4d0d5303dba913b929de8173dc2df1ad5f8900cee - md5: 36f632298719dd4b37d57cca4ebd2ead + version: 1.17.6 + build: ha073cba_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/juliaup-1.17.6-ha073cba_0.conda + sha256: b8c826842cb49578f67f0fcdcb9d383e162d6618c31e30ff1aa2f37da5b0cd87 + md5: 3b56f87c6f2b17a246dad6d06d86127b depends: - - libgcc-ng >=12 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 license: MIT license_family: MIT - size: 3859930 - timestamp: 1706564340550 + size: 1517497 + timestamp: 1725415742700 - kind: conda name: ld_impl_linux-64 - version: '2.40' - build: h41732ed_0 + version: '2.43' + build: h712a8e2_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda - sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd - md5: 7aca3059a1729aa76c597603f10b0dd3 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.43-h712a8e2_1.conda + sha256: 0c21387f9a411e3d1f7f2969026bacfece133c8f1e72faea9cde29c0c19e1f3a + md5: 83e1364586ceb8d0739fbc85b5c95837 + depends: + - __glibc >=2.17,<3.0.a0 constrains: - - binutils_impl_linux-64 2.40 + - binutils_impl_linux-64 2.43 license: GPL-3.0-only license_family: GPL - size: 704696 - timestamp: 1674833944779 + size: 669616 + timestamp: 1727304687962 - kind: conda name: libexpat - version: 2.6.2 - build: h59595ed_0 + version: 2.6.3 + build: h5888daf_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda - sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 - md5: e7ba12deb7020dd080c6c70e7b6f6a3d + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.3-h5888daf_0.conda + sha256: 4bb47bb2cd09898737a5211e2992d63c555d63715a07ba56eae0aff31fb89c22 + md5: 59f4c43bb1b5ef1c71946ff2cbf59524 depends: - - libgcc-ng >=12 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 constrains: - - expat 2.6.2.* + - expat 2.6.3.* license: MIT license_family: MIT - size: 73730 - timestamp: 1710362120304 + size: 73616 + timestamp: 1725568742634 - kind: conda name: libexpat - version: 2.6.2 - build: h63175ca_0 + version: 2.6.3 + build: he0c23c2_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda - sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 - md5: bc592d03f62779511d392c175dcece64 + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.3-he0c23c2_0.conda + sha256: 9543965d155b8da96fc67dd81705fe5c2571c7c00becc8de5534c850393d4e3c + md5: 21415fbf4d0de6767a621160b43e5dea + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 constrains: - - expat 2.6.2.* + - expat 2.6.3.* license: MIT license_family: MIT - size: 139224 - timestamp: 1710362609641 + size: 138992 + timestamp: 1725569106114 - kind: conda name: libffi version: 3.4.2 @@ -234,38 +247,54 @@ packages: size: 42063 timestamp: 1636489106777 - kind: conda - name: libgcc-ng - version: 13.2.0 - build: h807b86a_5 - build_number: 5 + name: libgcc + version: 14.1.0 + build: h77fa898_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda - sha256: d32f78bfaac282cfe5205f46d558704ad737b8dbf71f9227788a5ca80facaba4 - md5: d4ff227c46917d3b4565302a2bbb276b + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-14.1.0-h77fa898_1.conda + sha256: 10fa74b69266a2be7b96db881e18fa62cfa03082b65231e8d652e897c4b335a3 + md5: 002ef4463dd1e2b44a94a4ace468f5d2 depends: - _libgcc_mutex 0.1 conda_forge - _openmp_mutex >=4.5 constrains: - - libgomp 13.2.0 h807b86a_5 + - libgomp 14.1.0 h77fa898_1 + - libgcc-ng ==14.1.0=*_1 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 770506 - timestamp: 1706819192021 + size: 846380 + timestamp: 1724801836552 +- kind: conda + name: libgcc-ng + version: 14.1.0 + build: h69a702a_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h69a702a_1.conda + sha256: b91f7021e14c3d5c840fbf0dc75370d6e1f7c7ff4482220940eaafb9c64613b7 + md5: 1efc0ad219877a73ef977af7dbb51f17 + depends: + - libgcc 14.1.0 h77fa898_1 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 52170 + timestamp: 1724801842101 - kind: conda name: libgomp - version: 13.2.0 - build: h807b86a_5 - build_number: 5 + version: 14.1.0 + build: h77fa898_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_5.conda - sha256: 0d3d4b1b0134283ea02d58e8eb5accf3655464cf7159abf098cc694002f8d34e - md5: d211c42b9ce49aee3734fdc828731689 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_1.conda + sha256: c96724c8ae4ee61af7674c5d9e5a3fbcf6cd887a40ad5a52c99aa36f1d4f9680 + md5: 23c255b008c4f2ae008f81edcabaca89 depends: - _libgcc_mutex 0.1 conda_forge license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 419751 - timestamp: 1706819107383 + size: 460218 + timestamp: 1724801743478 - kind: conda name: libnsl version: 2.0.1 @@ -282,33 +311,34 @@ packages: timestamp: 1697359010159 - kind: conda name: libsqlite - version: 3.45.2 - build: h2797004_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.2-h2797004_0.conda - sha256: 8cdbeb7902729e319510a82d7c642402981818702b58812af265ef55d1315473 - md5: 866983a220e27a80cb75e85cb30466a1 - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - license: Unlicense - size: 857489 - timestamp: 1710254744982 -- kind: conda - name: libsqlite - version: 3.45.2 - build: hcfcfb64_0 + version: 3.46.1 + build: h2466b09_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.2-hcfcfb64_0.conda - sha256: 4bb24b986550275a6d02835150d943c4c675808d05c0efc5c2a22154d007a69f - md5: f95359f8dc5abf7da7776ece9ef10bc5 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.46.1-h2466b09_0.conda + sha256: ef83f90961630bc54a95e48062b05cf9c9173a822ea01784288029613a45eea4 + md5: 8a7c1ad01f58623bfbae8d601db7cf3b depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 license: Unlicense - size: 869606 - timestamp: 1710255095740 + size: 876666 + timestamp: 1725354171439 +- kind: conda + name: libsqlite + version: 3.46.1 + build: hadc24fc_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.1-hadc24fc_0.conda + sha256: 9851c049abafed3ee329d6c7c2033407e2fc269d33a75c071110ab52300002b0 + md5: 36f79405ab16bf271edb55b213836dac + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + license: Unlicense + size: 865214 + timestamp: 1725353659783 - kind: conda name: libuuid version: 2.38.1 @@ -339,147 +369,147 @@ packages: timestamp: 1702724383534 - kind: conda name: libzlib - version: 1.2.13 - build: hcfcfb64_5 - build_number: 5 + version: 1.3.1 + build: h2466b09_1 + build_number: 1 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 - md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda + sha256: b13846a54a15243e15f96fec06b526d8155adc6a1ac2b6ed47a88f6a71a94b68 + md5: d4483ca8afc57ddf1f6dded53b36c17f depends: - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 constrains: - - zlib 1.2.13 *_5 + - zlib 1.3.1 *_1 license: Zlib license_family: Other - size: 55800 - timestamp: 1686575452215 + size: 56186 + timestamp: 1716874730539 - kind: conda name: libzlib - version: 1.2.13 - build: hd590300_5 - build_number: 5 + version: 1.3.1 + build: h4ab18f5_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 - md5: f36c115f1ee199da648e0597ec2047ad + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda + sha256: adf6096f98b537a11ae3729eaa642b0811478f0ea0402ca67b5108fe2cb0010d + md5: 57d7dc60e9325e3de37ff8dffd18e814 depends: - libgcc-ng >=12 constrains: - - zlib 1.2.13 *_5 + - zlib 1.3.1 *_1 license: Zlib license_family: Other - size: 61588 - timestamp: 1686575217516 + size: 61574 + timestamp: 1716874187109 - kind: conda name: ncurses - version: 6.4.20240210 - build: h59595ed_0 + version: '6.5' + build: he02047a_1 + build_number: 1 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4.20240210-h59595ed_0.conda - sha256: aa0f005b6727aac6507317ed490f0904430584fa8ca722657e7f0fb94741de81 - md5: 97da8860a0da5413c7c98a3b3838a645 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-he02047a_1.conda + sha256: 6a1d5d8634c1a07913f1c525db6455918cbc589d745fac46d9d6e30340c8731a + md5: 70caf8bb6cf39a0b6b7efc885f51c0fe depends: + - __glibc >=2.17,<3.0.a0 - libgcc-ng >=12 license: X11 AND BSD-3-Clause - size: 895669 - timestamp: 1710866638986 + size: 889086 + timestamp: 1724658547447 - kind: conda name: openssl - version: 3.2.1 - build: hcfcfb64_1 - build_number: 1 + version: 3.3.2 + build: h2466b09_0 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.1-hcfcfb64_1.conda - sha256: 61ce4e11c3c26ed4e4d9b7e7e2483121a1741ad0f9c8db0a91a28b6e05182ce6 - md5: 958e0418e93e50c575bff70fbcaa12d8 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.2-h2466b09_0.conda + sha256: a45c42f3577294e22ac39ddb6ef5a64fd5322e8a6725afefbf4f2b4109340bf9 + md5: 1dc86753693df5e3326bb8a85b74c589 depends: - ca-certificates - ucrt >=10.0.20348.0 - vc >=14.2,<15 - vc14_runtime >=14.29.30139 - constrains: - - pyopenssl >=22.1 license: Apache-2.0 license_family: Apache - size: 8230112 - timestamp: 1710796158475 + size: 8396053 + timestamp: 1725412961673 - kind: conda name: openssl - version: 3.2.1 - build: hd590300_1 - build_number: 1 + version: 3.3.2 + build: hb9d3cd8_0 subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_1.conda - sha256: 2c689444ed19a603be457284cf2115ee728a3fafb7527326e96054dee7cdc1a7 - md5: 9d731343cff6ee2e5a25c4a091bf8e2a + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.2-hb9d3cd8_0.conda + sha256: cee91036686419f6dd6086902acf7142b4916e1c4ba042e9ca23e151da012b6d + md5: 4d638782050ab6faa27275bed57e9b4e depends: + - __glibc >=2.17,<3.0.a0 - ca-certificates - - libgcc-ng >=12 - constrains: - - pyopenssl >=22.1 + - libgcc >=13 license: Apache-2.0 license_family: Apache - size: 2865379 - timestamp: 1710793235846 + size: 2891789 + timestamp: 1725410790053 - kind: conda name: python - version: 3.12.2 - build: h2628c8c_0_cpython - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.2-h2628c8c_0_cpython.conda - sha256: b8eda863b48ae4531635e23fd15e759d93212b6204c6847d591e25fa5fd67477 - md5: be8803e9f75a477df61d4aabea3c1246 + version: 3.12.6 + build: hc5c86c4_2_cpython + build_number: 2 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.6-hc5c86c4_2_cpython.conda + sha256: dda1e75f5227654c78d9143562366eff04444cc8b887cf8f0cc4f6236996b744 + md5: cebe1534cdebcac43acca87bec946b01 depends: + - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.5.0,<3.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.3,<3.0a0 - libffi >=3.4,<4.0a0 - - libsqlite >=3.45.1,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.1,<4.0a0 + - libgcc >=13 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.3.1,<2.0a0 + - ncurses >=6.5,<7.0a0 + - openssl >=3.3.2,<4.0a0 + - readline >=8.2,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - xz >=5.2.6,<6.0a0 constrains: - python_abi 3.12.* *_cp312 license: Python-2.0 - size: 16083296 - timestamp: 1708116662336 + size: 31531222 + timestamp: 1727721840884 - kind: conda name: python - version: 3.12.2 - build: hab00c5b_0_cpython - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.2-hab00c5b_0_cpython.conda - sha256: ddb7a2d8d78046bda5d7631e6814f9468d2eb054e10f86f4648c9d1fdaa30c0f - md5: ad7b68400f3a6ebe72b00be093c7f301 + version: 3.12.6 + build: hce54a09_2_cpython + build_number: 2 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.6-hce54a09_2_cpython.conda + sha256: 41325d4c2b5f8bda2b5dd4a71555ad12f3c78b7f0a00e41e57475822e7e89a73 + md5: c30b76855225babfbf18595408a377f3 depends: - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libexpat >=2.5.0,<3.0a0 + - libexpat >=2.6.3,<3.0a0 - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.45.1,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.0a0 - - openssl >=3.2.1,<4.0a0 - - readline >=8.2,<9.0a0 + - libsqlite >=3.46.1,<4.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 - xz >=5.2.6,<6.0a0 constrains: - python_abi 3.12.* *_cp312 license: Python-2.0 - size: 32312631 - timestamp: 1708118077305 + size: 15854309 + timestamp: 1727719258211 - kind: conda name: readline version: '8.2' @@ -524,7 +554,7 @@ packages: md5: d453b98d9c83e71da0741bb0ff4d76bc depends: - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 + - libzlib >=1.2.13,<2.0.0a0 license: TCL license_family: BSD size: 3318875 @@ -532,15 +562,16 @@ packages: - kind: conda name: tzdata version: 2024a - build: h0c530f3_0 + build: h8827d51_1 + build_number: 1 subdir: noarch noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda - sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 - md5: 161081fc7cec0bfda0d86d7cb595f8d8 + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h8827d51_1.conda + sha256: 7d21c95f61319dba9209ca17d1935e6128af4235a67ee4e57a00908a1450081e + md5: 8bfdead4e0fff0383ae4c9c50d0531bd license: LicenseRef-Public-Domain - size: 119815 - timestamp: 1706886945727 + size: 124164 + timestamp: 1724736371498 - kind: conda name: ucrt version: 10.0.22621.0 @@ -558,52 +589,52 @@ packages: - kind: conda name: vc version: '14.3' - build: hcf57466_18 - build_number: 18 + build: h8a93ad2_21 + build_number: 21 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - sha256: 447a8d8292a7b2107dcc18afb67f046824711a652725fc0f522c368e7a7b8318 - md5: 20e1e652a4c740fa719002a8449994a2 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h8a93ad2_21.conda + sha256: f14f5238c2e2516e292af43d91df88f212d769b4853eb46d03291793dcf00da9 + md5: e632a9b865d4b653aa656c9fb4f4817c depends: - - vc14_runtime >=14.38.33130 + - vc14_runtime >=14.40.33810 track_features: - vc14 license: BSD-3-Clause license_family: BSD - size: 16977 - timestamp: 1702511255313 + size: 17243 + timestamp: 1725984095174 - kind: conda name: vc14_runtime - version: 14.38.33130 - build: h82b7239_18 - build_number: 18 + version: 14.40.33810 + build: ha82c5b3_21 + build_number: 21 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - sha256: bf94c9af4b2e9cba88207001197e695934eadc96a5c5e4cd7597e950aae3d8ff - md5: 8be79fdd2725ddf7bbf8a27a4c1f79ba + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.40.33810-ha82c5b3_21.conda + sha256: c3bf51bff7db39ad7e890dbef1b1026df0af36975aea24dea7c5fe1e0b382c40 + md5: b3ebb670caf046e32b835fbda056c4f9 depends: - ucrt >=10.0.20348.0 constrains: - - vs2015_runtime 14.38.33130.* *_18 + - vs2015_runtime 14.40.33810.* *_21 license: LicenseRef-ProprietaryMicrosoft license_family: Proprietary - size: 749868 - timestamp: 1702511239004 + size: 751757 + timestamp: 1725984166774 - kind: conda name: vs2015_runtime - version: 14.38.33130 - build: hcb4865c_18 - build_number: 18 + version: 14.40.33810 + build: h3bf8584_21 + build_number: 21 subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - sha256: a2fec221f361d6263c117f4ea6d772b21c90a2f8edc6f3eb0eadec6bfe8843db - md5: 10d42885e3ed84e575b454db30f1aa93 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.40.33810-h3bf8584_21.conda + sha256: 472410455c381e406ec8c1d3e0342b48ee23122ef7ffb22a09d9763ca5df4d20 + md5: b3f37db7b7ae1c22600fa26a63ed99b3 depends: - - vc14_runtime >=14.38.33130 + - vc14_runtime >=14.40.33810 license: BSD-3-Clause license_family: BSD - size: 16988 - timestamp: 1702511261442 + size: 17241 + timestamp: 1725984096440 - kind: conda name: xz version: 5.2.6 diff --git a/pixi.toml b/pixi.toml index 65e9e5ffb..77dcb5e2c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -10,10 +10,10 @@ platforms = ["win-64", "linux-64"] [tasks] # Installation -install-julia = "juliaup add 1.10.0 && juliaup override unset && juliaup override set 1.10.0" +install-julia = "juliaup add 1.10.5 && juliaup override unset && juliaup override set 1.10.5" # Julia update-registry-julia = "julia --eval='using Pkg; Registry.update()'" -instantiate-julia = "julia --project --eval='using Pkg; Pkg.instantiate()'" +instantiate-julia = {cmd = "julia --project --eval='using Pkg; Pkg.instantiate()'",env = { JULIA_SSL_CA_ROOTS_PATH = "" } } initialize-julia = { depends_on = [ "update-registry-julia", "instantiate-julia", @@ -28,7 +28,7 @@ download-test-data = { cmd = "julia --project download_test_data.jl", cwd = "bui build-wflow-cli = { cmd = "julia --project create_app.jl", cwd = "build/create_binaries", depends_on = [ "download-test-data", "instantiate-wflow-cli", -] } +], env = { JULIA_SSL_CA_ROOTS_PATH = "" } } # Test test-wflow-cli = { cmd = "julia --project --eval 'using Pkg; Pkg.test()'", cwd = "build/wflow_cli", depends_on = [ "download-test-data", diff --git a/server/Manifest.toml b/server/Manifest.toml index aba619527..e4c10a2ac 100644 --- a/server/Manifest.toml +++ b/server/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.2" +julia_version = "1.10.5" manifest_format = "2.0" project_hash = "b955683a8ff3d663c1ae626b1dc754fbae9fa2f7" @@ -11,9 +11,9 @@ version = "0.4.5" [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "e2a9873379849ce2ac9f9fa34b0e37bde5d5fe0a" +git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.2" +version = "4.0.4" weakdeps = ["StaticArrays"] [deps.Adapt.extensions] @@ -25,22 +25,25 @@ version = "1.1.1" [[deps.ArnoldiMethod]] deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.2.0" +version = "0.4.0" [[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "Requires", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "881e43f1aa014a6f75c8fc0847860e00a1500846" +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "3640d077b6dafd64ceb8fd5c1ec76f7ca53bcf76" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.8.0" +version = "7.16.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" + ArrayInterfaceChainRulesExt = "ChainRules" ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" ArrayInterfaceTrackerExt = "Tracker" @@ -48,8 +51,11 @@ version = "7.8.0" 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" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" @@ -66,9 +72,15 @@ version = "0.1.0" [[deps.BitTwiddlingConvenienceFunctions]] deps = ["Static"] -git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" -version = "0.1.5" +version = "0.1.6" + +[[deps.Blosc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "19b98ee7e3db3b4eff74c5c9c72bf32144e24f10" +uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9" +version = "1.21.5+0" [[deps.Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -84,27 +96,32 @@ version = "0.1.3" [[deps.CPUSummary]] deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] -git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +git-tree-sha1 = "5a97e67919535d6841172016c9530fd69494e5ec" uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.2.4" +version = "0.2.6" [[deps.CloseOpenIntervals]] deps = ["Static", "StaticArrayInterface"] -git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.12" +version = "0.1.13" [[deps.CommonDataModel]] -deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf"] -git-tree-sha1 = "7f5717cbb2c1ce650cfd454451f282df33103596" +deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] +git-tree-sha1 = "d6fb5bf939a2753c74984b11434ea25d6c397a58" uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" -version = "0.2.5" +version = "0.3.6" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.14.0" +version = "4.16.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -113,7 +130,7 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.0+0" +version = "1.1.1+0" [[deps.CpuId]] deps = ["Markdown"] @@ -123,9 +140,9 @@ version = "0.3.1" [[deps.DataStructures]] deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "0f4b5d62a88d8f59003e43c25a8a90de9eb76317" +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.18" +version = "0.18.20" [[deps.Dates]] deps = ["Printf"] @@ -166,34 +183,45 @@ version = "0.3.1" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +[[deps.GMP_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" +version = "6.2.1+6" + [[deps.Glob]] git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" version = "1.3.1" +[[deps.GnuTLS_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Nettle_jll", "P11Kit_jll", "Zlib_jll"] +git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3" +uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d" +version = "3.8.4+0" + [[deps.Graphs]] deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "899050ace26649433ef1af25bc17a815b3db52b7" +git-tree-sha1 = "1dc470db8b1131cfc7fb4c115de89fe391b9e780" uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.9.0" +version = "1.12.0" [[deps.HDF5_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "e4591176488495bf44d7456bd73179d87d5e6eab" +git-tree-sha1 = "82a471768b513dc39e471540fdadc84ff80ff997" uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.3+1" +version = "1.14.3+3" [[deps.HostCPUFeatures]] deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +git-tree-sha1 = "8e070b599339d622e9a081d17230d74a5c473293" uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.16" +version = "0.1.17" [[deps.Hwloc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114" +git-tree-sha1 = "dd3b49277ec2bb2c6b94eb1604d4d0616016f7a6" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.10.0+0" +version = "2.11.2+0" [[deps.IfElse]] git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" @@ -201,9 +229,9 @@ uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" [[deps.Inflate]] -git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.4" +version = "0.1.5" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -211,9 +239,9 @@ uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +git-tree-sha1 = "f389674c99bfcde17dc57454011aa44d5a260a40" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" +version = "1.6.0" [[deps.JSON3]] deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] @@ -238,9 +266,9 @@ weakdeps = ["Serialization"] [[deps.LayoutPointers]] deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.15" +version = "0.1.17" [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] @@ -300,9 +328,9 @@ version = "1.0.3" [[deps.LoopVectorization]] deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] -git-tree-sha1 = "0f5648fbae0d015e3abe5867bca2b362f67a5894" +git-tree-sha1 = "8084c25a250e00ae427a379a5b607e7aed96a2dd" uuid = "bdcacae8-1622-11e9-2a5c-532679323890" -version = "0.12.166" +version = "0.12.171" [deps.LoopVectorization.extensions] ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] @@ -313,23 +341,29 @@ version = "0.12.166" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" +[[deps.Lz4_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "abf88ff67f4fd89839efcae2f4c39cbc4ecd0846" +uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" +version = "1.10.0+1" + [[deps.MPICH_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "656036b9ed6f942d35e536e249600bc31d0f9df8" +git-tree-sha1 = "19d4bd098928a3263693991500d05d74dbdc2004" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.0+0" +version = "4.2.2+0" [[deps.MPIPreferences]] deps = ["Libdl", "Preferences"] -git-tree-sha1 = "8f6af051b9e8ec597fa09d8885ed79fd582f33c9" +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.10" +version = "0.1.11" [[deps.MPItrampoline_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "77c3bd69fdb024d75af38713e883d0f249ce19c2" +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "fde81c9f9c94fe5fbeaed7b3f1330305cf9a327c" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.3.2+0" +version = "5.5.0+0" [[deps.MacroTools]] deps = ["Markdown", "Random"] @@ -366,24 +400,30 @@ version = "2023.1.10" [[deps.NCDatasets]] deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] -git-tree-sha1 = "173a378f357e9bb24b22019efb5e4778223ce8cf" +git-tree-sha1 = "77df6d3708ec0eb3441551e1f20f7503b37c2393" uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -version = "0.13.2" +version = "0.14.5" [[deps.NetCDF_jll]] -deps = ["Artifacts", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "XML2_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "10c612c81eaffdd6b7c28a45a554cdd9d2f40ff1" +deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "XML2_jll", "Zlib_jll", "Zstd_jll", "libzip_jll"] +git-tree-sha1 = "4686378c4ae1d1948cfbe46c002a11a4265dcb07" uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" -version = "400.902.208+0" +version = "400.902.211+1" + +[[deps.Nettle_jll]] +deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "eca63e3847dad608cfa6a3329b95ef674c7160b4" +uuid = "4c82536e-c426-54e4-b420-14f461c4ed8b" +version = "3.7.2+0" [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" [[deps.OffsetArrays]] -git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.13.0" +version = "1.14.1" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] @@ -402,15 +442,21 @@ version = "4.1.6+0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "60e3045590bd104a16fefb12836c00c0ef8c7f8c" +git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.13+0" +version = "3.0.15+1" [[deps.OrderedCollections]] git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.6.3" +[[deps.P11Kit_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "2cd396108e178f3ae8dedbd8e938a18726ab2fbf" +uuid = "c2071276-7c44-58a7-b746-946036e04d0a" +version = "0.24.1+0" + [[deps.Parameters]] deps = ["OrderedCollections", "UnPack"] git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" @@ -429,22 +475,22 @@ uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" version = "1.10.0" [[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "fca25670784a1ae44546bcb17288218310af2778" +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6d38fea02d983051776a856b7df75b30cf9a3c1f" uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.9" +version = "0.7.16" [[deps.PolyesterWeave]] deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.2.1" +version = "0.2.2" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.0" +version = "1.2.1" [[deps.Preferences]] deps = ["TOML"] @@ -487,9 +533,9 @@ version = "0.1.0" [[deps.SLEEFPirates]] deps = ["IfElse", "Static", "VectorizationBase"] -git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +git-tree-sha1 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" -version = "0.6.42" +version = "0.6.43" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" @@ -513,16 +559,16 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" version = "1.10.0" [[deps.Static]] -deps = ["IfElse"] -git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools"] +git-tree-sha1 = "87d51a3ee9a4b0d2fe054bdd3fc2436258db2603" uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.8.10" +version = "1.1.1" [[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] -git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.5.0" +version = "1.8.0" weakdeps = ["OffsetArrays", "StaticArrays"] [deps.StaticArrayInterface.extensions] @@ -531,9 +577,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.3" +version = "1.9.7" [deps.StaticArrays.extensions] StaticArraysChainRulesCoreExt = "ChainRulesCore" @@ -544,9 +590,9 @@ version = "1.9.3" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" [[deps.StaticArraysCore]] -git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.2" +version = "1.4.3" [[deps.Statistics]] deps = ["LinearAlgebra", "SparseArrays"] @@ -554,20 +600,16 @@ uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" version = "1.10.0" [[deps.StrideArraysCore]] -deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] -git-tree-sha1 = "d6415f66f3d89c615929af907fdc6a3e17af0d8c" +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "f35f6ab602df8413a50c4a25ca14de821e8605fb" uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.5.2" +version = "0.5.7" [[deps.StructTypes]] deps = ["Dates", "UUIDs"] -git-tree-sha1 = "ca4bccb03acf9faaf4137a9abc1881ed1841aa70" +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" -version = "1.10.0" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" +version = "1.11.0" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] @@ -610,27 +652,33 @@ uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [[deps.VectorizationBase]] deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] -git-tree-sha1 = "7209df901e6ed7489fe9b7aa3e46fb788e15db85" +git-tree-sha1 = "e7f5b81c65eb858bed630fe006837b935518aca5" uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" -version = "0.21.65" +version = "0.21.70" [[deps.Wflow]] deps = ["BasicModelInterface", "CFTime", "Dates", "DelimitedFiles", "FieldMetadata", "Glob", "Graphs", "IfElse", "LoggingExtras", "LoopVectorization", "NCDatasets", "Parameters", "Polyester", "ProgressLogging", "Random", "StaticArrays", "Statistics", "TOML", "TerminalLoggers", "UnPack"] path = ".." uuid = "d48b7d99-76e7-47ae-b1d5-ff0c1cf9a818" -version = "0.7.3" +version = "0.8.1" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "07e470dabc5a6a4254ffebc29a1b3fc01464e105" +git-tree-sha1 = "1165b0443d0eca63ac1e32b8c0eb69ed2f4f8127" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.5+0" +version = "2.13.3+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.4.6+0" [[deps.ZMQ]] -deps = ["FileWatching", "Sockets", "ZeroMQ_jll"] -git-tree-sha1 = "356d2bdcc0bce90aabee1d1c0f6d6f301eda8f77" +deps = ["FileWatching", "PrecompileTools", "Sockets", "ZeroMQ_jll"] +git-tree-sha1 = "18cfd00df3cbbebf8ea4ec7ea6bbceb3af716bd0" uuid = "c2297ded-f4af-51ae-bb23-16f91089e4e1" -version = "1.2.2" +version = "1.3.0" [[deps.ZeroMQ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "libsodium_jll"] @@ -645,9 +693,9 @@ version = "1.2.13+1" [[deps.Zstd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "49ce682769cd5de6c72dcf1b94ed7790cd08974c" +git-tree-sha1 = "555d1076590a6cc2fdee2ef1469451f872d8b41b" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.5+0" +version = "1.5.6+1" [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -658,13 +706,19 @@ version = "1.1.2+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" +version = "5.11.0+0" [[deps.libsodium_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "848ab3d00fe39d6fbc2a8641048f8f272af1c51e" +git-tree-sha1 = "f76d682d87eefadd3f165d8d9fda436464213142" uuid = "a9144af2-ca23-56d9-984f-0d03f7b5ccf8" -version = "1.0.20+0" +version = "1.0.20+1" + +[[deps.libzip_jll]] +deps = ["Artifacts", "Bzip2_jll", "GnuTLS_jll", "JLLWrappers", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "3282b7d16ae7ac3e57ec2f3fa8fafb564d8f9f7f" +uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" +version = "1.10.1+0" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] diff --git a/src/Wflow.jl b/src/Wflow.jl index f4a8bd8f5..f4f898e0d 100644 --- a/src/Wflow.jl +++ b/src/Wflow.jl @@ -1,26 +1,25 @@ module Wflow -using Dates -using TOML -using Graphs -using NCDatasets -using StaticArrays -using Statistics -using UnPack -using Random -using BasicModelInterface -using FieldMetadata -using Parameters -using DelimitedFiles -using ProgressLogging +import BasicModelInterface as BMI + +using Base.Threads: nthreads +using CFTime: CFTime, monthday, dayofyear +using Dates: Dates, Second, Minute, Hour, Day, Month, year, TimeType, DatePeriod, TimePeriod, Date, DateTime, now, isleapyear, datetime2unix +using DelimitedFiles: readdlm +using FieldMetadata: @metadata +using Glob: glob +using Graphs: Graphs, Graph, DiGraph, add_edge!, is_cyclic, inneighbors, outneighbors, edges, topological_sort_by_dfs, src, dst, vertices, nv, ne, induced_subgraph, add_vertex! +using IfElse: IfElse using LoggingExtras +using LoopVectorization: @tturbo +using NCDatasets: NCDatasets, NCDataset, dimnames, dimsize, nomissing, defDim, defVar +using Parameters: @with_kw +using Polyester: @batch +using ProgressLogging: @progress +using StaticArrays: SVector, pushfirst, setindex +using Statistics: mean, median, quantile! using TerminalLoggers -using CFTime -using Base.Threads -using Glob -using Polyester -using LoopVectorization -using IfElse +using TOML: TOML @metadata get_units "mm dt-1" String # metadata for BMI grid @@ -28,7 +27,6 @@ using IfElse @metadata grid_type "unstructured" String @metadata grid_location "node" String -const BMI = BasicModelInterface const Float = Float64 const CFDataset = Union{NCDataset,NCDatasets.MFDataset} const CFVariable_MF = Union{NCDatasets.CFVariable,NCDatasets.MFCFVariable} @@ -213,7 +211,7 @@ function run_timestep(model::Model; update_func = update, write_model_output = t end function run(model::Model; close_files = true) - @unpack network, config, writer, clock = model + (; config, writer, clock) = model model_type = config.model.type::String diff --git a/src/bmi.jl b/src/bmi.jl index a2a7b9899..68093f03a 100644 --- a/src/bmi.jl +++ b/src/bmi.jl @@ -48,7 +48,6 @@ Update the model for a single timestep. - `run = nothing`: to update a model partially. """ function BMI.update(model::Model; run = nothing) - @unpack clock, network, config = model if isnothing(run) model = run_timestep(model) elseif run == "sbm_until_recharge" @@ -64,7 +63,6 @@ function BMI.update(model::Model; run = nothing) end function BMI.update_until(model::Model, time::Float64) - @unpack clock, network, config = model t = BMI.get_current_time(model) _div, _rem = divrem(time - t, model.clock.dt.value) steps = Int(_div) @@ -85,7 +83,7 @@ end "Write state output to netCDF and close files." function BMI.finalize(model::Model) - @unpack config, writer, clock = model + (; config, writer) = model # it is possible that the state dataset has been closed by `save_state` if !isnothing(writer.state_dataset) && isopen(writer.state_dataset) write_netcdf_timestep(model, writer.state_dataset, writer.state_parameters) @@ -95,8 +93,7 @@ function BMI.finalize(model::Model) end function BMI.get_component_name(model::Model) - @unpack config = model - return config.model.type + return model.config.model.type end function BMI.get_input_item_count(model::Model) @@ -115,7 +112,7 @@ This `API` sections contains a list of `Model` components for which variables ca exchanged. """ function BMI.get_input_var_names(model::Model) - @unpack config = model + (; config) = model if haskey(config, "API") var_names = Vector{String}() for c in config.API.components @@ -211,7 +208,7 @@ function BMI.get_var_location(model::Model, name::String) end function BMI.get_current_time(model::Model) - @unpack config = model + (; config) = model calendar = get(config, "calendar", "standard")::String starttime = cftime(config.starttime, calendar) return 0.001 * Dates.value(model.clock.time - starttime) @@ -222,7 +219,7 @@ function BMI.get_start_time(model::Model) end function BMI.get_end_time(model::Model) - @unpack config = model + (; config) = model calendar = get(config, "calendar", "standard")::String starttime = cftime(config.starttime, calendar) endtime = cftime(config.endtime, calendar) @@ -243,7 +240,7 @@ function BMI.get_value(model::Model, name::String, dest::Vector{T}) where {T<:Ab end function BMI.get_value_ptr(model::Model, name::String) - @unpack network = model + (; network) = model s = split(name, "[") key = symbols(first(s)) if exchange(param(model, key[1:end-1]), key[end]) == 1 @@ -322,9 +319,9 @@ function BMI.get_grid_rank(model::Model, grid::Int) end function BMI.get_grid_x(model::Model, grid::Int, x::Vector{T}) where {T<:AbstractFloat} - @unpack reader, config = model - @unpack dataset = reader - sel = active_indices(model.network, grids[grid]) + (; reader, network) = model + (; dataset) = reader + sel = active_indices(network, grids[grid]) inds = [sel[i][1] for i in eachindex(sel)] x_nc = read_x_axis(dataset) x .= x_nc[inds] @@ -332,9 +329,9 @@ function BMI.get_grid_x(model::Model, grid::Int, x::Vector{T}) where {T<:Abstrac end function BMI.get_grid_y(model::Model, grid::Int, y::Vector{T}) where {T<:AbstractFloat} - @unpack reader, config = model - @unpack dataset = reader - sel = active_indices(model.network, grids[grid]) + (; reader, network) = model + (; dataset) = reader + sel = active_indices(network, grids[grid]) inds = [sel[i][2] for i in eachindex(sel)] y_nc = read_y_axis(dataset) y .= y_nc[inds] @@ -350,7 +347,7 @@ function BMI.get_grid_size(model::Model, grid::Int) end function BMI.get_grid_edge_count(model::Model, grid::Int) - @unpack network = model + (; network) = model if grid == 3 return ne(network.river.graph) elseif grid == 4 @@ -365,7 +362,7 @@ function BMI.get_grid_edge_count(model::Model, grid::Int) end function BMI.get_grid_edge_nodes(model::Model, grid::Int, edge_nodes::Vector{Int}) - @unpack network = model + (; network) = model n = length(edge_nodes) m = div(n, 2) # inactive nodes (boundary/ghost points) are set at -999 @@ -402,7 +399,7 @@ function load_state(model::Model) end function save_state(model::Model) - @unpack config, writer, clock = model + (; config, writer) = model if haskey(config, "state") && haskey(config.state, "path_output") @info "Write output states to netCDF file `$(model.writer.state_nc_path)`." end diff --git a/src/flextopo_model.jl b/src/flextopo_model.jl index 039759940..8ea773d63 100644 --- a/src/flextopo_model.jl +++ b/src/flextopo_model.jl @@ -665,7 +665,7 @@ function initialize_flextopo_model(config::Config) end function update(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:FlextopoModel} - @unpack lateral, vertical, network, clock, config = model + (; lateral, vertical, network, config) = model inds_riv = network.index_river @@ -716,7 +716,7 @@ function update(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:FlextopoModel} end function set_states(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:FlextopoModel} - @unpack lateral, config = model + (; lateral, config) = model reinit = get(config.model, "reinit", true)::Bool # read and set states in model object if reinit=true if reinit == false diff --git a/src/flow.jl b/src/flow.jl index c778b9f6c..f7578cc03 100644 --- a/src/flow.jl +++ b/src/flow.jl @@ -189,7 +189,7 @@ end function update(sf::SurfaceFlowLand, network, frac_toriver) - @unpack graph, subdomain_order, topo_subdomain, indices_subdomain, upstream_nodes = + (; subdomain_order, topo_subdomain, indices_subdomain, upstream_nodes) = network ns = length(subdomain_order) @@ -256,7 +256,7 @@ end function update(sf::SurfaceFlowRiver, network, doy) - @unpack graph, subdomain_order, topo_subdomain, indices_subdomain, upstream_nodes = + (; graph, subdomain_order, topo_subdomain, indices_subdomain, upstream_nodes) = network ns = length(subdomain_order) @@ -429,7 +429,7 @@ end end function update(ssf::LateralSSF, network, frac_toriver, ksat_profile) - @unpack subdomain_order, topo_subdomain, indices_subdomain, upstream_nodes, area = + (; subdomain_order, topo_subdomain, indices_subdomain, upstream_nodes, area) = network @@ -749,7 +749,7 @@ end function shallowwater_river_update(sw::ShallowWaterRiver, network, dt, doy, update_h) - @unpack nodes_at_link, links_at_node = network + (; nodes_at_link, links_at_node) = network sw.q0 .= sw.q if !isnothing(sw.floodplain) @@ -952,8 +952,6 @@ function shallowwater_river_update(sw::ShallowWaterRiver, network, dt, doy, upda end function update(sw::ShallowWaterRiver{T}, network, doy; update_h = true) where {T} - @unpack nodes_at_link, links_at_node = network - if !isnothing(sw.reservoir) sw.reservoir.inflow .= 0.0 sw.reservoir.totaloutflow .= 0.0 @@ -1192,9 +1190,6 @@ function update( doy; update_h = false, ) where {T} - - @unpack nodes_at_link, links_at_node = network.river - if !isnothing(swr.reservoir) swr.reservoir.inflow .= 0.0 swr.reservoir.totaloutflow .= 0.0 @@ -1236,7 +1231,7 @@ function shallowwater_update( indices = network.land.staggered_indices inds_riv = network.land.index_river - @unpack nodes_at_link, links_at_node = network.river + (; links_at_node) = network.river sw.qx0 .= sw.qx sw.qy0 .= sw.qy @@ -1637,7 +1632,7 @@ function set_river_inwater( model::Model{N,L,V,R,W,T}, ssf_toriver, ) where {N,L,V,R,W,T<:Union{SbmModel,SbmGwfModel}} - @unpack lateral, vertical, network, config = model + (; lateral, vertical, network, config) = model inds = network.index_river do_water_demand = haskey(config.model, "water_demand") if do_water_demand @@ -1667,7 +1662,7 @@ end Set `inwater` of the lateral river component (based on overland flow). """ function set_river_inwater(model, ssf_toriver) - @unpack lateral, network = model + (; lateral, network) = model inds = network.index_river lateral.river.inwater .= lateral.land.to_river[inds] end @@ -1678,7 +1673,7 @@ end Set `inwater` of the lateral land component for the `SbmGwfModel` type. """ function set_land_inwater(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SbmGwfModel} - @unpack lateral, vertical, network, config = model + (; lateral, vertical, network, config) = model do_water_demand = haskey(config.model, "water_demand") do_drains = get(config.model, "drains", false)::Bool drainflux = zeros(vertical.n) @@ -1703,7 +1698,7 @@ end Set `inwater` of the lateral land component for the `SbmModel` type. """ function set_land_inwater(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SbmModel} - @unpack lateral, vertical, network, config = model + (; lateral, vertical, network, config) = model do_water_demand = haskey(config.model, "water_demand") if do_water_demand @. lateral.land.inwater = @@ -1722,7 +1717,7 @@ end Set `inwater` of the lateral land component, based on `runoff` of the `vertical` concept. """ function set_land_inwater(model) - @unpack lateral, vertical, network = model + (; lateral, vertical, network) = model @. lateral.land.inwater = (vertical.runoff * network.land.area * 0.001) / lateral.land.dt end @@ -1746,8 +1741,8 @@ Set inflow from the subsurface and land components to a water body (reservoir or function set_inflow_waterbody( model::Model{N,L,V,R,W,T}, ) where {N,L<:NamedTuple{<:Any,<:Tuple{Any,SurfaceFlow,SurfaceFlow}},V,R,W,T} - @unpack lateral, network = model - @unpack subsurface, land, river = lateral + (; lateral, network) = model + (; subsurface, land, river) = lateral inds = network.index_river if !isnothing(lateral.river.reservoir) || !isnothing(lateral.river.lake) @@ -1772,8 +1767,8 @@ Set inflow from the subsurface and land components to a water body (reservoir or function set_inflow_waterbody( model::Model{N,L,V,R,W,T}, ) where {N,L<:NamedTuple{<:Any,<:Tuple{Any,SurfaceFlow,ShallowWaterRiver}},V,R,W,T} - @unpack lateral, network = model - @unpack subsurface, land, river = lateral + (; lateral, network) = model + (; subsurface, land, river) = lateral inds = network.index_river if !isnothing(lateral.river.reservoir) || !isnothing(lateral.river.lake) @@ -1801,8 +1796,8 @@ Set inflow from the subsurface and land components to a water body (reservoir or function set_inflow_waterbody( model::Model{N,L,V,R,W,T}, ) where {N,L<:NamedTuple{<:Any,<:Tuple{Any,ShallowWaterLand,ShallowWaterRiver}},V,R,W,T} - @unpack lateral, network = model - @unpack subsurface, land, river = lateral + (; lateral, network) = model + (; subsurface, land) = lateral inds = network.index_river if !isnothing(lateral.river.reservoir) || !isnothing(lateral.river.lake) @@ -1820,7 +1815,7 @@ Run surface routing (land and river). Kinematic wave for overland flow and kinem local inertial model for river flow. """ function surface_routing(model; ssf_toriver = 0.0) - @unpack lateral, network, clock = model + (; lateral, network, clock) = model # run kinematic wave for overland flow set_land_inwater(model) @@ -1846,7 +1841,7 @@ function surface_routing( ssf_toriver = 0.0, ) where {N,L<:NamedTuple{<:Any,<:Tuple{Any,ShallowWaterLand,ShallowWaterRiver}},V,R,W,T} - @unpack lateral, vertical, network, clock = model + (; lateral, vertical, network, clock) = model @. lateral.land.runoff = ( (vertical.net_runoff / 1000.0) * network.land.area / vertical.dt + diff --git a/src/hbv_model.jl b/src/hbv_model.jl index 988dc4249..7c63bc252 100644 --- a/src/hbv_model.jl +++ b/src/hbv_model.jl @@ -385,9 +385,7 @@ function initialize_hbv_model(config::Config) end function update(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:HbvModel} - @unpack lateral, vertical, network, clock, config = model - - inds_riv = network.index_river + (; lateral, vertical, network, config) = model # vertical hbv concept is updated until snow state, after that (optional) # snow transport is possible @@ -412,7 +410,7 @@ function update(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:HbvModel} end function set_states(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:HbvModel} - @unpack lateral, config = model + (; lateral, config) = model reinit = get(config.model, "reinit", true)::Bool do_lakes = get(config.model, "lakes", false)::Bool @@ -422,7 +420,7 @@ function set_states(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:HbvModel} @info "Set initial conditions from state file `$instate_path`." set_states(instate_path, model; type = Float) # update kinematic wave volume for river and land domain - @unpack lateral = model + (; lateral) = model # makes sure land cells with zero flow width are set to zero q and h for i in eachindex(lateral.land.width) if lateral.land.width[i] <= 0.0 diff --git a/src/horizontal_process.jl b/src/horizontal_process.jl index 2d10333ce..5977a667c 100644 --- a/src/horizontal_process.jl +++ b/src/horizontal_process.jl @@ -274,7 +274,7 @@ such as that returned by `Graphs.topological_sort_by_dfs`. Returns the material state after transport. """ function accucapacitystate!(material, network, capacity) - @unpack graph, order = network + (; graph, order) = network for v in order downstream_nodes = outneighbors(graph, v) n = length(downstream_nodes) @@ -313,7 +313,7 @@ interface, and the order is a valid topological ordering such as that returned b Returns the flux (material leaving each cell), and material (left after transport). """ function accucapacityflux!(flux, material, network, capacity) - @unpack graph, order = network + (; graph, order) = network for v in order downstream_nodes = outneighbors(graph, v) n = length(downstream_nodes) diff --git a/src/io.jl b/src/io.jl index 16d89baed..3b7c63499 100644 --- a/src/io.jl +++ b/src/io.jl @@ -195,8 +195,8 @@ end mover_params = (symbols"vertical.precipitation", symbols"vertical.potential_evaporation") function load_fixed_forcing(model) - @unpack reader, network, config = model - @unpack forcing_parameters = reader + (; reader, network, config) = model + (; forcing_parameters) = reader do_reservoirs = get(config.model, "reservoirs", false)::Bool do_lakes = get(config.model, "lakes", false)::Bool @@ -241,8 +241,8 @@ end "Get dynamic netCDF input for the given time" function update_forcing!(model) - @unpack vertical, clock, reader, network, config = model - @unpack dataset, dataset_times, forcing_parameters = reader + (; clock, reader, network, config) = model + (; dataset, dataset_times, forcing_parameters) = reader do_reservoirs = get(config.model, "reservoirs", false)::Bool do_lakes = get(config.model, "lakes", false)::Bool @@ -331,8 +331,8 @@ end "Get cyclic netCDF input for the given time" function update_cyclic!(model) - @unpack vertical, clock, reader, network, config = model - @unpack cyclic_dataset, cyclic_times, cyclic_parameters = reader + (; clock, reader, network) = model + (; cyclic_dataset, cyclic_times, cyclic_parameters) = reader # pick up the data that is valid for the past model time step month_day = monthday(clock.time - clock.dt) @@ -1058,7 +1058,7 @@ end "Write a new timestep with scalar data to a netCDF file" function write_netcdf_timestep(model, dataset) - @unpack writer, clock, config = model + (; writer, clock, config) = model time_index = add_time(dataset, clock.time) for (nt, nc) in zip(writer.nc_scalar, config.netcdf.variable) @@ -1090,13 +1090,13 @@ end "Write a new timestep with grid data to a netCDF file" function write_netcdf_timestep(model, dataset, parameters) - @unpack vertical, clock, reader, network = model + (; clock, network) = model time_index = add_time(dataset, clock.time) buffer = zeros(Union{Float,Missing}, size(model.network.land.reverse_indices)) for (key, val) in parameters - @unpack par, vector = val + (; par, vector) = val sel = active_indices(network, par) # write the active cells vector to the 2d buffer matrix elemtype = eltype(vector) @@ -1128,8 +1128,8 @@ write_netcdf_timestep(model, dataset::Nothing) = model "Write model output" function write_output(model) - @unpack vertical, clock, reader, network, writer = model - @unpack dataset, dataset_scalar, parameters = writer + (; writer) = model + (; dataset, dataset_scalar, parameters) = writer write_csv_row(model) write_netcdf_timestep(model, dataset, parameters) @@ -1183,7 +1183,7 @@ end "Close input and output datasets that are opened on model initialization" function close_files(model; delete_output::Bool = false) - @unpack reader, writer, config = model + (; reader, writer, config) = model close(reader.dataset) if haskey(config.input, "cyclic") @@ -1307,7 +1307,7 @@ function reducer(col, rev_inds, x_nc, y_nc, config, dataset, fileformat) end function write_csv_row(model) - @unpack writer, clock, config = model + (; writer, clock, config) = model isnothing(writer.csv_path) && return nothing io = writer.csv_io print(io, string(clock.time)) @@ -1630,7 +1630,7 @@ end "Get `index` for dimension name `layer` or `classes` based on `model`" function get_index_dimension(var, model)::Int - @unpack vertical = model + (; vertical) = model if haskey(var, "layer") inds = collect(1:vertical.maxlayers) index = inds[var["layer"]] diff --git a/src/sbm.jl b/src/sbm.jl index 60bfc6f24..baab14691 100644 --- a/src/sbm.jl +++ b/src/sbm.jl @@ -1,4 +1,14 @@ -@get_units @exchange @grid_type @grid_location @with_kw struct SBM{T,N,M} +@get_units @exchange @grid_type @grid_location @with_kw struct SBM{ + T, + N, + M, + P<:Union{Paddy,Nothing}, + NP<:Union{NonPaddy,Nothing}, + D<:Union{NonIrrigationDemand,Nothing}, + L<:Union{NonIrrigationDemand,Nothing}, + I<:Union{NonIrrigationDemand,Nothing}, + A<:Union{AllocationLand,Nothing}, +} # Model time step [s] dt::T | "s" | 0 | "none" | "none" # Maximum number of soil layers @@ -225,15 +235,15 @@ # Total water storage (excluding floodplain volume, lakes and reservoirs) [mm] total_storage::Vector{T} | "mm" # Water demand structs (of arrays) - paddy::Union{Paddy,Nothing} | "-" | 0 - nonpaddy::Union{NonPaddy,Nothing} | "-" | 0 - domestic::Union{NonIrrigationDemand,Nothing} | "-" | 0 - livestock::Union{NonIrrigationDemand,Nothing} | "-" | 0 - industry::Union{NonIrrigationDemand,Nothing} | "-" | 0 - allocation::Union{AllocationLand,Nothing} | "-" | 0 + paddy::P | "-" | 0 + nonpaddy::NP | "-" | 0 + domestic::D | "-" | 0 + livestock::L | "-" | 0 + industry::I | "-" | 0 + allocation::A | "-" | 0 - function SBM{T,N,M}(args...) where {T,N,M} + function SBM{T,N,M,P,NP,D,L,I,A}(args...) where {T,N,M,P,NP,D,L,I,A} equal_size_vectors(args) return new(args...) end @@ -1327,19 +1337,16 @@ function update_total_water_storage( river_routing, land_routing, ) - # Get length active river cells - nriv = length(river_network) - # Set the total storage to zero fill!(sbm.total_storage, 0) # Burn the river routing values - sbm.total_storage[river_network] = ( - ( - river_routing.h_av[1:nriv] .* river_routing.width[1:nriv] .* - river_routing.dl[1:nriv] - ) ./ (area[river_network]) * 1000 # Convert to mm - ) + for (i, index_river) in enumerate(river_network) + sbm.total_storage[index_river] = ( + (river_routing.h_av[i] * river_routing.width[i] * river_routing.dl[i]) / + (area[index_river]) * 1000 # Convert to mm + ) + end # Chunk the data for parallel computing threaded_foreach(1:sbm.n, basesize = 1000) do i diff --git a/src/sbm_gwf_model.jl b/src/sbm_gwf_model.jl index 2dfe4a2ae..2e4913c83 100644 --- a/src/sbm_gwf_model.jl +++ b/src/sbm_gwf_model.jl @@ -526,7 +526,7 @@ end "update the sbm_gwf model for a single timestep" function update(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SbmGwfModel} - @unpack lateral, vertical, network, clock, config = model + (; lateral, vertical, network, config) = model do_water_demand = haskey(config.model, "water_demand") inds_riv = network.index_river diff --git a/src/sbm_model.jl b/src/sbm_model.jl index ec1032894..0ad9054f0 100644 --- a/src/sbm_model.jl +++ b/src/sbm_model.jl @@ -434,7 +434,7 @@ end "update SBM model for a single timestep" function update(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SbmModel} - @unpack lateral, vertical, network, clock, config = model + (; lateral, vertical, network, config) = model do_water_demand = haskey(config.model, "water_demand") ksat_profile = get(config.input.vertical, "ksat_profile", "exponential")::String @@ -465,7 +465,7 @@ Update SBM model until recharge for a single timestep. This function is also acc through BMI, to couple the SBM model to an external groundwater model. """ function update_until_recharge(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SbmModel} - @unpack lateral, vertical, network, clock, config = model + (; lateral, vertical, network, config) = model do_water_demand = haskey(config.model, "water_demand") @@ -511,7 +511,7 @@ accessible through BMI, to couple the SBM model to an external groundwater model function update_after_subsurfaceflow( model::Model{N,L,V,R,W,T}, ) where {N,L,V,R,W,T<:SbmModel} - @unpack lateral, vertical, network, clock, config = model + (; lateral, vertical) = model # update vertical sbm concept (runoff, ustorelayerdepth and satwaterdepth) update_after_subsurfaceflow( @@ -532,7 +532,7 @@ Update of the total water storage at the end of each timestep per model cell. This is done here at model level. """ function update_total_water_storage(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SbmModel} - @unpack lateral, vertical, network, clock, config = model + (; lateral, vertical, network) = model # Update the total water storage based on vertical states # TODO Maybe look at routing in the near future @@ -549,7 +549,7 @@ end function set_states( model::Model{N,L,V,R,W,T}, ) where {N,L,V,R,W,T<:Union{SbmModel,SbmGwfModel}} - @unpack lateral, vertical, network, config = model + (; lateral, vertical, network, config) = model reinit = get(config.model, "reinit", true)::Bool routing_options = ("kinematic-wave", "local-inertial") diff --git a/src/sediment.jl b/src/sediment.jl index dd708a32a..13a919114 100644 --- a/src/sediment.jl +++ b/src/sediment.jl @@ -1133,7 +1133,7 @@ function initialize_riversed(nc, config, riverwidth, riverlength, inds_riv) end function update(rs::RiverSediment, network, config) - @unpack graph, order = network + (; graph, order) = network tcmethod = get(config.model, "rivtransportmethod", "bagnold")::String # River sediment loads are separated into different particle class. diff --git a/src/sediment_model.jl b/src/sediment_model.jl index e2229a1bd..2c5d5ebd6 100644 --- a/src/sediment_model.jl +++ b/src/sediment_model.jl @@ -155,7 +155,7 @@ function initialize_sediment_model(config::Config) end function update(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SedimentModel} - @unpack lateral, vertical, network, clock, config = model + (; lateral, vertical, network, config) = model update_until_ols(vertical, config) update_until_oltransport(vertical, config) @@ -194,7 +194,7 @@ end function set_states(model::Model{N,L,V,R,W,T}) where {N,L,V,R,W,T<:SedimentModel} # read and set states in model object if reinit=false - @unpack config = model + (; config) = model reinit = get(config.model, "reinit", true)::Bool if reinit == false instate_path = input_path(config, config.state.path_input) diff --git a/src/utils.jl b/src/utils.jl index 1f557b1cb..b81248c9e 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -137,7 +137,7 @@ and set states in `model` object. Active cells are selected with the correspondi - `type = nothing`: type to convert data to after reading. By default no conversion is done. """ function set_states(instate_path, model; type = nothing, dimname = nothing) - @unpack network, config = model + (; network, config) = model # Check if required states are covered state_ncnames = check_states(config) diff --git a/src/water_demand.jl b/src/water_demand.jl index 32e364e0c..432db1b69 100644 --- a/src/water_demand.jl +++ b/src/water_demand.jl @@ -536,7 +536,7 @@ function update_water_allocation( model::Model{N,L,V,R,W,T}, ) where {N,L,V,R,W,T<:Union{SbmModel,SbmGwfModel}} - @unpack network, lateral, vertical = model + (; network, lateral, vertical) = model river = lateral.river index_river = network.land.index_river_wb diff --git a/test/io.jl b/test/io.jl index f692efed3..25e142de3 100644 --- a/test/io.jl +++ b/test/io.jl @@ -3,7 +3,6 @@ using Dates using TOML using CFTime using Random -using UnPack using LoggingExtras tomlpath = joinpath(@__DIR__, "sbm_config.toml") @@ -196,7 +195,7 @@ model = Wflow.initialize_sbm_model(config) Wflow.advance!(model.clock) Wflow.load_dynamic_input!(model) -@unpack vertical, clock, reader, writer = model +(; vertical, clock, reader, writer) = model @testset "output and state names" begin ncdims = ("lon", "lat", "layer", "time") @@ -242,8 +241,8 @@ end end @testset "network" begin - @unpack network = model - @unpack indices, reverse_indices = model.network.land + (; network) = model + (; indices, reverse_indices) = model.network.land # test if the reverse index reverses the index linear_index = 100 cartesian_index = indices[linear_index] @@ -252,7 +251,7 @@ end end @testset "initial parameter values" begin - @unpack vertical = model + (; vertical) = model @test vertical.cfmax[1] ≈ 3.7565300464630127 @test vertical.soilthickness[1] ≈ 2000.0 @test vertical.precipitation[49951] ≈ 2.2100000381469727 @@ -280,7 +279,7 @@ Wflow.advance!(model.clock) Wflow.load_dynamic_input!(model) @testset "changed parameter values" begin - @unpack vertical = model + (; vertical) = model @test vertical.cfmax[1] == 2.0 @test vertical.soilthickness[1] ≈ 2000.0 * 3.0 + 100.0 @test vertical.precipitation[49951] ≈ 1.5 * 2.2100000381469727 diff --git a/test/run_flextopo.jl b/test/run_flextopo.jl index cfb4bbffb..974fc085c 100644 --- a/test/run_flextopo.jl +++ b/test/run_flextopo.jl @@ -3,7 +3,7 @@ tomlpath = joinpath(@__DIR__, "flextopo_config.toml") config = Wflow.Config(tomlpath) model = Wflow.initialize_flextopo_model(config) -@unpack network = model +(; network) = model model = Wflow.run_timestep(model) @@ -82,7 +82,7 @@ config["model"]["select_fast"] = ["fast_no_storage", "fast_storage", "fast_stora config["model"]["select_slow"] = ["common_slow_storage"] model = Wflow.initialize_flextopo_model(config) -@unpack network = model +(; network) = model model = Wflow.run_timestep(model) diff --git a/test/run_hbv.jl b/test/run_hbv.jl index 12d6eb169..b0706f316 100644 --- a/test/run_hbv.jl +++ b/test/run_hbv.jl @@ -3,7 +3,7 @@ tomlpath = joinpath(@__DIR__, "hbv_config.toml") config = Wflow.Config(tomlpath) model = Wflow.initialize_hbv_model(config) -@unpack network = model +(; network) = model model = Wflow.run_timestep(model) diff --git a/test/run_sbm.jl b/test/run_sbm.jl index d50ccb752..fe81c53ec 100644 --- a/test/run_sbm.jl +++ b/test/run_sbm.jl @@ -4,7 +4,7 @@ tomlpath = joinpath(@__DIR__, "sbm_config.toml") config = Wflow.Config(tomlpath) model = Wflow.initialize_sbm_model(config) -@unpack network = model +(; network) = model model = Wflow.run_timestep(model) @@ -446,7 +446,7 @@ Wflow.close_files(model, delete_output = false) @testset "exponential profile" begin model = Wflow.initialize_sbm_model(config) - @unpack vertical = model + (; vertical) = model z = vertical.zi[i] kv_z = Wflow.hydraulic_conductivity_at_depth(vertical, z, i, 2, "exponential") @test kv_z ≈ vertical.kvfrac[i][2] * vertical.kv_0[i] * exp(-vertical.f[i] * z) @@ -465,7 +465,7 @@ Wflow.close_files(model, delete_output = false) @testset "exponential constant profile" begin config.input.vertical.ksat_profile = "exponential_constant" model = Wflow.initialize_sbm_model(config) - @unpack vertical = model + (; vertical) = model z = vertical.zi[i] kv_z = Wflow.hydraulic_conductivity_at_depth(vertical, z, i, 2, "exponential_constant") @@ -500,7 +500,7 @@ Wflow.close_files(model, delete_output = false) @testset "layered profile" begin config.input.vertical.ksat_profile = "layered" model = Wflow.initialize_sbm_model(config) - @unpack vertical = model + (; vertical) = model z = vertical.zi[i] @test Wflow.hydraulic_conductivity_at_depth(vertical, z, i, 2, "layered") ≈ vertical.kv[100][2] @@ -513,7 +513,7 @@ Wflow.close_files(model, delete_output = false) @testset "layered exponential profile" begin config.input.vertical.ksat_profile = "layered_exponential" model = Wflow.initialize_sbm_model(config) - @unpack vertical = model + (; vertical) = model z = vertical.zi[i] @test Wflow.hydraulic_conductivity_at_depth( vertical, diff --git a/test/run_sbm_gwf.jl b/test/run_sbm_gwf.jl index b984fed2b..3af207643 100644 --- a/test/run_sbm_gwf.jl +++ b/test/run_sbm_gwf.jl @@ -3,7 +3,7 @@ tomlpath = joinpath(@__DIR__, "sbm_gwf_config.toml") config = Wflow.Config(tomlpath) model = Wflow.initialize_sbm_gwf_model(config) -@unpack network = model +(; network) = model model = Wflow.run_timestep(model) @@ -144,7 +144,7 @@ config = Wflow.Config(tomlpath) config.model.reinit = false model = Wflow.initialize_sbm_gwf_model(config) -@unpack network = model +(; network) = model model = Wflow.run_timestep(model) model = Wflow.run_timestep(model) diff --git a/test/run_sediment.jl b/test/run_sediment.jl index 7d009bddc..f8b323996 100644 --- a/test/run_sediment.jl +++ b/test/run_sediment.jl @@ -4,7 +4,7 @@ tomlpath = joinpath(@__DIR__, "sediment_config.toml") config = Wflow.Config(tomlpath) model = Wflow.initialize_sediment_model(config) -@unpack network = model +(; network) = model model = Wflow.run_timestep(model) diff --git a/test/runtests.jl b/test/runtests.jl index 3dd096afe..67947e377 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,7 +6,6 @@ using NCDatasets using StaticArrays using Statistics using Test -using UnPack using Wflow using Base.MathConstants: eulergamma using Base.Threads @@ -100,6 +99,6 @@ with_logger(NullLogger()) do include("subdomains.jl") include("run_flextopo.jl") - Aqua.test_all(Wflow; ambiguities = false) + Aqua.test_all(Wflow; ambiguities = false, persistent_tasks = false) end end diff --git a/test/subdomains.jl b/test/subdomains.jl index bb5517640..12b5170b3 100644 --- a/test/subdomains.jl +++ b/test/subdomains.jl @@ -3,7 +3,7 @@ config = Wflow.Config(tomlpath) model = Wflow.initialize_sbm_model(config) -@unpack network = model +(; network) = model min_sto_river = get(config.model, "min_streamorder_river", 6) min_sto_land = get(config.model, "min_streamorder_land", 5)