diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 5bc07c3a..ef8db316 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -5,6 +5,8 @@ agents: env: JULIA_LOAD_PATH: "${JULIA_LOAD_PATH}:${BUILDKITE_BUILD_CHECKOUT_PATH}/.buildkite" + OPENBLAS_NUM_THREADS: 1 + OMPI_MCA_opal_warn_on_missing_libcuda: 0 steps: - label: "initialize" @@ -39,14 +41,24 @@ steps: commands: - "julia --project -e 'using Pkg; Pkg.test()'" - - label: "documentation" + - label: "Run surface flux tests" + key: "tests_fluxes" env: CUDA_VISIBLE_DEVICES: "-1" - JULIA_DEBUG: "Documenter" - # TMPDIR: "$TARTARUS_HOME/tmp" + TEST_GROUP: "fluxes" commands: - - "julia --color=yes --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'" - - "julia --color=yes --project=docs/ docs/make.jl" - + - "julia --project -e 'using Pkg; Pkg.test()'" + + # - label: "documentation" + # env: + # JULIA_DEBUG: "Documenter" + # commands: + # - "julia --color=yes --project=docs/ -e 'using Pkg; Pkg.develop(PackageSpec(path=pwd())); Pkg.instantiate()'" + # - "julia --color=yes --project=docs/ docs/make.jl" + # agents: + # slurm_mem: 120G + # slurm_ntasks: 1 + # slurm_gpus_per_task: 1 + - wait: ~ continue_on_failure: true diff --git a/.gitignore b/.gitignore index 353c5651..675d9791 100644 --- a/.gitignore +++ b/.gitignore @@ -18,17 +18,19 @@ docs/build/ docs/site/ docs/src/literated/ +# Output files +*.nc +*.jld2 +*.mp4 +*.png +*.svg +*.gif + # File generated by Pkg, the package manager, based on a corresponding Project.toml # It records a fixed state of all packages used by the project. As such, it should not be # committed for packages, but should be committed for applications that require a static # environment. # Manifest.toml - -*.nc -*.jld2 -*.mp4 *.DS_Store *.swp -*.svg -*.gif *.zip diff --git a/Manifest.toml b/Manifest.toml index de7f1d1e..8e086043 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.2" +julia_version = "1.10.4" manifest_format = "2.0" -project_hash = "b77431445966c6920fb04c6ab1b5a7dbdaa668aa" +project_hash = "edb3b1f7c1c580248896d1c4ed1aa39adff53b7e" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] @@ -52,14 +52,15 @@ version = "1.1.1" [[deps.ArrayInterface]] deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "44691067188f6bd1b2289552a23e4b7572f4528d" +git-tree-sha1 = "ed2ec3c9b483842ae59cd273834e5b46206d6dda" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.9.0" +version = "7.11.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" ArrayInterfaceChainRulesExt = "ChainRules" ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" ArrayInterfaceReverseDiffExt = "ReverseDiff" @@ -70,6 +71,7 @@ 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" @@ -99,6 +101,12 @@ git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" version = "0.1.8" +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + [[deps.Blosc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] git-tree-sha1 = "19b98ee7e3db3b4eff74c5c9c72bf32144e24f10" @@ -122,40 +130,57 @@ git-tree-sha1 = "5afb5c5ba2688ca43a9ad2e5a91cbb93921ccfa1" uuid = "179af706-886a-5703-950a-314cd64e0468" version = "0.1.3" +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "585a387a490f1c4bd88be67eea15b93da5e85db7" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.5" + [[deps.CUDA]] deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "StaticArrays", "Statistics"] -git-tree-sha1 = "baa8ea7a1ea63316fa3feb454635215773c9c845" +git-tree-sha1 = "6e945e876652f2003e6ca74e19a3c45017d3e9f6" uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "5.2.0" -weakdeps = ["ChainRulesCore", "SpecialFunctions"] +version = "5.4.2" [deps.CUDA.extensions] ChainRulesCoreExt = "ChainRulesCore" + EnzymeCoreExt = "EnzymeCore" SpecialFunctionsExt = "SpecialFunctions" + [deps.CUDA.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + [[deps.CUDA_Driver_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "d01bfc999768f0a31ed36f5d22a76161fc63079c" +git-tree-sha1 = "c48f9da18efd43b6b7adb7ee1f93fe5f2926c339" uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" -version = "0.7.0+1" +version = "0.9.0+0" [[deps.CUDA_Runtime_Discovery]] deps = ["Libdl"] -git-tree-sha1 = "2cb12f6b2209f40a4b8967697689a47c50485490" +git-tree-sha1 = "5db9da5fdeaa708c22ba86b82c49528f402497f2" uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" -version = "0.2.3" +version = "0.3.3" [[deps.CUDA_Runtime_jll]] deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "8e25c009d2bf16c2c31a70a6e9e8939f7325cc84" +git-tree-sha1 = "bcba305388e16aa5c879e896726db9e71b4942c6" uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" -version = "0.11.1+0" +version = "0.14.0+1" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "a2f1c8c668c8e3cb4cca4e57a8efdb09067bb3fd" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.0+2" [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" +git-tree-sha1 = "71acdbf594aab5bbb2cec89b208c41b4c411e49f" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.23.0" +version = "1.24.0" weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] @@ -163,10 +188,18 @@ weakdeps = ["SparseArrays"] [[deps.ClimaSeaIce]] deps = ["Adapt", "KernelAbstractions", "Oceananigans", "RootSolvers", "Roots", "SeawaterPolynomials"] -git-tree-sha1 = "e25e43451edd449c3dcc899bd447983d7b76a59f" +git-tree-sha1 = "0ac8d2566e8f4887896c8a03ee87050fcbbf6599" +repo-rev = "ss/new-oceananigans" +repo-url = "https://github.com/CliMA/ClimaSeaIce.jl.git" uuid = "6ba0ff68-24e6-4315-936c-2e99227c95a4" version = "0.1.0" +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" @@ -175,21 +208,31 @@ version = "0.7.4" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.4" +version = "0.11.5" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.10.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" [[deps.Colors]] deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" +git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.10" +version = "0.12.11" [[deps.CommonDataModel]] deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] -git-tree-sha1 = "d7d7b58e149f19c322840a50d1bc20e8c23addb4" +git-tree-sha1 = "d6fb5bf939a2753c74984b11434ea25d6c397a58" uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" -version = "0.3.5" +version = "0.3.6" [[deps.CommonSolve]] git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" @@ -204,9 +247,9 @@ version = "0.3.0" [[deps.Compat]] deps = ["TOML", "UUIDs"] -git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" +git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.14.0" +version = "4.15.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -215,7 +258,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.CompositionsBase]] git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" @@ -246,6 +289,12 @@ version = "1.5.5" IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + [[deps.Crayons]] git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" @@ -275,16 +324,16 @@ uuid = "124859b0-ceae-595e-8997-d05f6a7a8dfe" version = "0.7.13" [[deps.DataFrames]] -deps = ["Compat", "DataAPI", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SnoopPrecompile", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] -git-tree-sha1 = "aa51303df86f8626a962fccb878430cdb0a97eee" +deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "04c738083f29f86e62c8afc341f0967d8717bdb8" uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -version = "1.5.0" +version = "1.6.1" [[deps.DataStructures]] -deps = ["InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "88d48e133e6d3dd68183309877eac74393daa7eb" +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.17.20" +version = "0.18.20" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -350,11 +399,29 @@ git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" version = "0.1.10" +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.2+0" + [[deps.ExprTools]] git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" version = "0.1.10" +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + [[deps.FFTW]] deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" @@ -378,9 +445,15 @@ uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" [[deps.FixedPointNumbers]] deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.96+0" [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] @@ -392,6 +465,18 @@ weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] ForwardDiffStaticArraysExt = "StaticArrays" +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.2+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.14+0" + [[deps.Future]] deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" @@ -403,9 +488,9 @@ version = "6.2.1+6" [[deps.GPUArrays]] deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] -git-tree-sha1 = "47e4686ec18a9620850bad110b79966132f14283" +git-tree-sha1 = "38cb19b8a3e600e509dc36a6396ac74266d108c1" uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "10.0.2" +version = "10.1.1" [[deps.GPUArraysCore]] deps = ["Adapt"] @@ -415,9 +500,21 @@ version = "0.1.6" [[deps.GPUCompiler]] deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "a846f297ce9d09ccba02ead0cae70690e072a119" +git-tree-sha1 = "518ebd058c9895de468a8c255797b0c53fdb44dd" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.25.0" +version = "0.26.5" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.80.2+0" [[deps.Glob]] git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" @@ -430,6 +527,12 @@ git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3" uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d" version = "3.8.4+0" +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+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" @@ -438,9 +541,21 @@ version = "1.14.2+1" [[deps.HTTP]] deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "8e59b47b9dc525b70550ca082ce85bcd7f5477cd" +git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.5" +version = "1.10.8" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.16" [[deps.Hwloc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -453,6 +568,18 @@ git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.2" + +[[deps.ImageMorphology]] +deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] +git-tree-sha1 = "6f0a801136cb9c229aebea0df296cdcd471dbcd1" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.4.5" + [[deps.IncompleteLU]] deps = ["LinearAlgebra", "SparseArrays"] git-tree-sha1 = "6c676e79f98abb6d33fa28122cad099f1e464afe" @@ -467,9 +594,9 @@ version = "1.4.0" [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "5fdf2fe6724d8caabf43b557b84ce53f3b7e2f6b" +git-tree-sha1 = "be50fe8df3acbffa0274a744f1a99d29c45a57f4" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2024.0.2+0" +version = "2024.1.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -477,9 +604,9 @@ uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" [[deps.InverseFunctions]] deps = ["Test"] -git-tree-sha1 = "896385798a8d49a255c398bd49162062e4a4c435" +git-tree-sha1 = "e7cbed5032c4c397a6ac23d1493f3289e01231c4" uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.13" +version = "0.1.14" weakdeps = ["Dates"] [deps.InverseFunctions.extensions] @@ -507,10 +634,10 @@ uuid = "82899510-4779-5014-852e-03e436cf321d" version = "1.0.0" [[deps.JLD2]] -deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] -git-tree-sha1 = "5ea6acdd53a51d897672edb694e3cc2912f3f8a7" +deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Reexport", "Requires", "TranscodingStreams", "UUIDs", "Unicode"] +git-tree-sha1 = "bdbe8222d2f5703ad6a7019277d149ec6d78c301" uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.4.46" +version = "0.4.48" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] @@ -538,9 +665,9 @@ version = "0.2.1+0" [[deps.KernelAbstractions]] deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] -git-tree-sha1 = "ed7167240f40e62d97c1f5f7735dea6de3cc5c49" +git-tree-sha1 = "8e5a339882cc401688d79b811d923a38ba77d50a" uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.9.18" +version = "0.9.20" [deps.KernelAbstractions.extensions] EnzymeExt = "EnzymeCore" @@ -548,11 +675,17 @@ version = "0.9.18" [deps.KernelAbstractions.weakdeps] EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + [[deps.LLVM]] deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"] -git-tree-sha1 = "839c82932db86740ae729779e610f07a1640be9a" +git-tree-sha1 = "389aea28d882a40b5e1747069af71bdbd47a1cae" uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "6.6.3" +version = "7.2.1" weakdeps = ["BFloat16s"] [deps.LLVM.extensions] @@ -584,11 +717,23 @@ weakdeps = ["Serialization"] [deps.LRUCache.extensions] SerializationExt = ["Serialization"] +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.2+0" + [[deps.LaTeXStrings]] git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" version = "1.3.1" +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.15" + [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" @@ -620,21 +765,51 @@ version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.11+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.49.0+0" + [[deps.Libiconv_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" version = "1.17.0+0" +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.40.1+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.40.1+0" + [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" +git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea" uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.27" +version = "0.3.28" [deps.LogExpFunctions.extensions] LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" @@ -655,6 +830,17 @@ git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" 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 = "8f6786d8b2b3248d79db3ad359ce95382d5a6df8" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.170" +weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"] + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + [[deps.Lz4_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "6c26c5e8a4203d43b5497be3ec5d4e0c3cde240a" @@ -662,10 +848,10 @@ uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" version = "1.9.4+0" [[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "72dc3cf284559eb8f53aa593fe62cb33f83ed0c0" +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "80b2833b56d466b3858d565adcd16a4a05f2089b" uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2024.0.0+0" +version = "2024.1.0+0" [[deps.MPI]] deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] @@ -683,21 +869,21 @@ version = "0.20.16" [[deps.MPICH_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "656036b9ed6f942d35e536e249600bc31d0f9df8" +git-tree-sha1 = "4099bb6809ac109bfc17d521dad33763bcf026b7" uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.0+0" +version = "4.2.1+1" [[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 = "8c35d5420193841b2f367e658540e8d9e0601ed0" uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.3.2+0" +version = "5.4.0+0" [[deps.MacroTools]] deps = ["Markdown", "Random"] @@ -705,6 +891,16 @@ git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.13" +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + [[deps.Markdown]] deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" @@ -728,22 +924,28 @@ version = "10.1.4+2" [[deps.Missings]] deps = ["DataAPI"] -git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.1.0" +version = "1.2.0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" version = "2023.1.10" [[deps.NCDatasets]] deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] -git-tree-sha1 = "d40d24d12f710c39d3a66be99c567ce0032f28a7" +git-tree-sha1 = "a640912695952b074672edb5f9aaee2f7f9fd59a" uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -version = "0.14.3" +version = "0.14.4" [[deps.NVTX]] deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] @@ -781,11 +983,9 @@ version = "1.2.0" [[deps.Oceananigans]] deps = ["Adapt", "CUDA", "Crayons", "CubedSphere", "Dates", "Distances", "DocStringExtensions", "FFTW", "Glob", "IncompleteLU", "InteractiveUtils", "IterativeSolvers", "JLD2", "KernelAbstractions", "LinearAlgebra", "Logging", "MPI", "NCDatasets", "OffsetArrays", "OrderedCollections", "PencilArrays", "PencilFFTs", "Pkg", "Printf", "Random", "Rotations", "SeawaterPolynomials", "SparseArrays", "Statistics", "StructArrays"] -git-tree-sha1 = "82eddd14528a13419be8b75da9daa23fb2a14363" -repo-rev = "main" -repo-url = "https://github.com/CliMA/Oceananigans.jl.git" +git-tree-sha1 = "994ae77f4f232940822770d8ce7c2f84e373156e" uuid = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" -version = "0.90.12" +version = "0.91.1" [deps.Oceananigans.extensions] OceananigansEnzymeExt = "Enzyme" @@ -794,14 +994,20 @@ version = "0.90.12" Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" [[deps.OffsetArrays]] -git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.13.0" +version = "1.14.0" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] OffsetArraysAdaptExt = "Adapt" +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" @@ -813,22 +1019,22 @@ uuid = "05823500-19ac-5b8b-9628-191a04bc5112" version = "0.8.1+2" [[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", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] +git-tree-sha1 = "a9de2f1fc98b92f8856c640bf4aec1ac9b2a0d86" uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "5.0.2+0" +version = "5.0.3+0" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "af81a32750ebc831ee28bdaaba6e1067decef51e" +git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.4.2" +version = "1.4.3" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" +git-tree-sha1 = "a028ee3cb5641cccc4c24e90c36b0a4f7707bdf5" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.13+1" +version = "3.0.14+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] @@ -836,6 +1042,12 @@ git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.5+0" +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + [[deps.OrderedCollections]] git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" @@ -847,11 +1059,10 @@ git-tree-sha1 = "2cd396108e178f3ae8dedbd8e938a18726ab2fbf" uuid = "c2071276-7c44-58a7-b746-946036e04d0a" version = "0.24.1+0" -[[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.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" [[deps.PackageExtensionCompat]] git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" @@ -859,6 +1070,12 @@ uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" version = "1.0.2" weakdeps = ["Requires", "TOML"] +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" + [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" @@ -867,9 +1084,9 @@ version = "2.8.1" [[deps.PencilArrays]] deps = ["Adapt", "JSON3", "LinearAlgebra", "MPI", "OffsetArrays", "Random", "Reexport", "StaticArrayInterface", "StaticArrays", "StaticPermutations", "Strided", "TimerOutputs", "VersionParsing"] -git-tree-sha1 = "6510e851700a851944f7ffa5cd990cced4802ad2" +git-tree-sha1 = "8c5b9251650cb0ac77911f7e8a9e8f7c15bd5c99" uuid = "0e08944d-e94e-41b1-9406-dcf66b6a9d2e" -version = "0.19.3" +version = "0.19.4" [deps.PencilArrays.extensions] PencilArraysDiffEqExt = ["DiffEqBase"] @@ -885,6 +1102,12 @@ git-tree-sha1 = "bd69f3f0ee248cfb4241800aefb705b5ded592ff" uuid = "4a48f351-57a6-4416-9ec4-c37015456aae" version = "0.15.1" +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.43.4+0" + [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" @@ -896,6 +1119,12 @@ git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" version = "0.3.3" +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" + [[deps.PooledArrays]] deps = ["DataAPI", "Future"] git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" @@ -916,9 +1145,9 @@ version = "1.4.3" [[deps.PrettyTables]] deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "88b895d13d53b5577fd53379d913b9ab9ac82660" +git-tree-sha1 = "66b20dd35966a748321d3b2537c4584cf40387c7" uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "2.3.1" +version = "2.3.2" [[deps.Printf]] deps = ["Unicode"] @@ -1005,9 +1234,9 @@ version = "2.1.5" [[deps.Rotations]] deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] -git-tree-sha1 = "2a0a5d8569f481ff8840e3b7c84bbf188db6a3fe" +git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e" uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.7.0" +version = "1.7.1" weakdeps = ["RecipesBase"] [deps.Rotations.extensions] @@ -1017,6 +1246,17 @@ weakdeps = ["RecipesBase"] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" version = "0.7.0" +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.42" + [[deps.Scratch]] deps = ["Dates"] git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" @@ -1030,9 +1270,9 @@ version = "0.3.4" [[deps.SentinelArrays]] deps = ["Dates", "Random"] -git-tree-sha1 = "0e7508ff27ba32f26cd459474ca2ede1bc10991f" +git-tree-sha1 = "90b4f68892337554d31cdcdbe19e48989f26c7e6" uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.1" +version = "1.4.3" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" @@ -1042,12 +1282,6 @@ git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" version = "1.1.0" -[[deps.SnoopPrecompile]] -deps = ["Preferences"] -git-tree-sha1 = "e760a70afdcd461cf01a575947738d359234665c" -uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" -version = "1.0.3" - [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" @@ -1064,14 +1298,20 @@ version = "1.10.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" +git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.3.1" +version = "2.4.0" weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + [[deps.Static]] deps = ["IfElse"] git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" @@ -1091,9 +1331,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" +git-tree-sha1 = "6e00379a24597be4ae1ee6b2d882e15392040132" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.3" +version = "1.9.5" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -1101,9 +1341,9 @@ weakdeps = ["ChainRulesCore", "Statistics"] StaticArraysStatisticsExt = "Statistics" [[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.StaticPermutations]] git-tree-sha1 = "193c3daa18ff3e55c1dae66acb6a762c4a3bdb0b" @@ -1173,17 +1413,15 @@ version = "7.2.1+1" [[deps.SurfaceFluxes]] deps = ["DocStringExtensions", "RootSolvers", "Thermodynamics"] -git-tree-sha1 = "c2c43206af0d861e018f746286d1af036aa7bc3a" -repo-rev = "glw/generalize-parameters" -repo-url = "https://github.com/glwagner/SurfaceFluxes.jl.git" +git-tree-sha1 = "89c701c87f378ce95e7ddbcd69b8f1106ba8b968" uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" -version = "0.9.2" +version = "0.11.0" [deps.SurfaceFluxes.extensions] - CreateParametersExt = "CLIMAParameters" + CreateParametersExt = "ClimaParams" [deps.SurfaceFluxes.weakdeps] - CLIMAParameters = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" + ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c" [[deps.TOML]] deps = ["Dates"] @@ -1219,6 +1457,12 @@ version = "0.16.0" [deps.TaylorSeries.weakdeps] IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -1235,16 +1479,28 @@ version = "0.12.6" [deps.Thermodynamics.weakdeps] ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c" +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TiledIteration]] +deps = ["OffsetArrays", "StaticArrayInterface"] +git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.5.0" + [[deps.TimerOutputs]] deps = ["ExprTools", "Printf"] -git-tree-sha1 = "f548a9e9c490030e545f72074a41edfd0e5bcdd7" +git-tree-sha1 = "5a13ae8a41237cff5ecf34f73eb1b8f42fff6531" uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.23" +version = "0.5.24" [[deps.TranscodingStreams]] -git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349" +git-tree-sha1 = "a947ea21087caba0a798c5e494d0bb78e3a1a3a0" uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.10.7" +version = "0.10.9" weakdeps = ["Random", "Test"] [deps.TranscodingStreams.extensions] @@ -1264,6 +1520,11 @@ version = "1.5.1" deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" @@ -1274,9 +1535,15 @@ version = "0.2.1" [[deps.UnsafeAtomicsLLVM]] deps = ["LLVM", "UnsafeAtomics"] -git-tree-sha1 = "323e3d0acf5e78a56dfae7bd8928c989b4f3083e" +git-tree-sha1 = "d9f5962fecd5ccece07db1ff006fb0b5271bdfdd" uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" -version = "0.1.3" +version = "0.1.4" + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "e863582a41c5731f51fd050563ae91eb33cf09be" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.68" [[deps.VersionParsing]] git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868" @@ -1285,9 +1552,15 @@ version = "1.3.0" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" +git-tree-sha1 = "52ff2af32e591541550bd753c0da8b9bc92bb9d9" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.6+0" +version = "2.12.7+0" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" [[deps.XZ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] @@ -1295,6 +1568,54 @@ git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" version = "5.4.6+0" +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.11+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.4+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+0" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.15.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.5.0+0" + [[deps.Zlib_jll]] deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" @@ -1312,16 +1633,40 @@ git-tree-sha1 = "46bf7be2917b59b761247be3f317ddf75e50e997" uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" version = "1.1.2+0" +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.9.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" version = "5.8.0+1" -[[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.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.43+1" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" [[deps.libzip_jll]] deps = ["Artifacts", "Bzip2_jll", "GnuTLS_jll", "JLLWrappers", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] @@ -1334,13 +1679,25 @@ deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" version = "1.52.0+1" +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2021.12.0+0" + [[deps.p7zip_jll]] 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" +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" diff --git a/Project.toml b/Project.toml index 32e35584..0a1f741f 100644 --- a/Project.toml +++ b/Project.toml @@ -12,7 +12,10 @@ CubicSplines = "9c784101-8907-5a6d-9be6-98f00873c89b" DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +FFMPEG = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +ImageMorphology = "787d08f9-d448-5407-9aad-5290dd7ab264" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" Oceananigans = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" @@ -32,7 +35,7 @@ Downloads = "1.6" JLD2 = "0.4" KernelAbstractions = "0.9" NCDatasets = "0.12, 0.13, 0.14" -Oceananigans = "0.90.10" +Oceananigans = "0.90, 0.91" SeawaterPolynomials = "0.3.4" Statistics = "1.9" julia = "1.9" diff --git a/docs/make.jl b/docs/make.jl index 9724e318..985a46e9 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -16,6 +16,9 @@ const OUTPUT_DIR = joinpath(@__DIR__, "src/literated") to_be_literated = [ "inspect_ecco2_data.jl", + "generate_surface_fluxes.jl", + "single_column_simulation.jl", + # "near_global_omip_simulation.jl" ] for file in to_be_literated diff --git a/docs/make_without_examples.jl b/docs/make_without_examples.jl new file mode 100644 index 00000000..9724e318 --- /dev/null +++ b/docs/make_without_examples.jl @@ -0,0 +1,85 @@ +pushfirst!(LOAD_PATH, joinpath(@__DIR__, "..")) # add ClimaOcean to environment stack + +using + Documenter, + Literate, + ClimaOcean + +ENV["DATADEPS_ALWAYS_ACCEPT"] = "true" + +##### +##### Generate examples +##### + +const EXAMPLES_DIR = joinpath(@__DIR__, "..", "examples") +const OUTPUT_DIR = joinpath(@__DIR__, "src/literated") + +to_be_literated = [ + "inspect_ecco2_data.jl", +] + +for file in to_be_literated + filepath = joinpath(EXAMPLES_DIR, file) + Literate.markdown(filepath, OUTPUT_DIR; flavor = Literate.DocumenterFlavor()) +end + +##### +##### Build and deploy docs +##### + +format = Documenter.HTML( + collapselevel = 2, + prettyurls = get(ENV, "CI", nothing) == "true", + canonical = "https://clima.github.io/ClimaOceanDocumentation/dev/", +) + +pages = [ + "Home" => "index.md", + + "Library" => [ + "Contents" => "library/outline.md", + "Public" => "library/public.md", + "Private" => "library/internals.md", + "Function index" => "library/function_index.md", + ], +] + +makedocs( + sitename = "ClimaOcean.jl", + modules = [ClimaOcean], + format = format, + pages = pages, + doctest = true, + clean = true, + warnonly = [:cross_references, :missing_docs], + checkdocs = :exports +) + +@info "Clean up temporary .jld2 and .nc output created by doctests or literated examples..." + +""" + recursive_find(directory, pattern) + +Return list of filepaths within `directory` that contains the `pattern::Regex`. +""" +recursive_find(directory, pattern) = + mapreduce(vcat, walkdir(directory)) do (root, dirs, files) + joinpath.(root, filter(contains(pattern), files)) + end + +files = [] +for pattern in [r"\.jld2", r"\.nc"] + global files = vcat(files, recursive_find(@__DIR__, pattern)) +end + +for file in files + rm(file) +end + +withenv("GITHUB_REPOSITORY" => "CliMA/ClimaOceanDocumentation") do + deploydocs( repo = "github.com/CliMA/ClimaOceanDocumentation.git", + versions = ["stable" => "v^", "v#.#.#", "dev" => "dev"], + forcepush = true, + devbranch = "main", + push_preview = true) +end diff --git a/examples/generate_bathymetry.jl b/examples/generate_bathymetry.jl index 0468499a..61767fae 100644 --- a/examples/generate_bathymetry.jl +++ b/examples/generate_bathymetry.jl @@ -56,7 +56,7 @@ interior(h_smooth)[land_smooth] .= NaN land_rough = interior(h_rough) .> 0 interior(h_rough)[land_rough] .= NaN -fig = Figure(size=(2400, 1200)) +fig = Figure(resolution=(2400, 800)) ax = Axis(fig[1, 1]) heatmap!(ax, λ, φ, interior(h_smooth, :, :, 1), nan_color=:white) #, colorrange=(-5000, 0)) ax = Axis(fig[1, 2]) diff --git a/examples/generate_surface_fluxes.jl b/examples/generate_surface_fluxes.jl new file mode 100644 index 00000000..859c4c6f --- /dev/null +++ b/examples/generate_surface_fluxes.jl @@ -0,0 +1,132 @@ +# Calculating surface fluxes with an ocean and an atmosphere +# +# ClimaOcean uses bulk formulae to estimate the surface exchange of momentum, +# heat, and water vapor between the atmosphere and the ocean. +# +# This script demonstrates an example of the turbulent surface flux calculations performed in ClimaOcean +# using ECCO2 data for the ocean and JRA55 data for the atmosphere. +# +# For this example, we need ClimaOcean with its DataWrangling modules: ECCO2 and JRA55. +# We also need Oceananigans for the ImmersedBoundaryGrid and Field utilities, and CairoMakie to plot. + +using ClimaOcean +using ClimaOcean.ECCO2 +using ClimaOcean.JRA55 +using ClimaOcean.OceanSimulations +using Oceananigans +using CairoMakie + +# We start by defining a grid. The ECCO2 grid is a good starting point. +# The ECCO2 grid is not "immersed" by default, but we can use the ECCO mask +# to define the "bathymetry" of the ECCO fields. +# `ecco2_center_mask` produces a field with `true` values where data is missing (i.e., in immersed cells). +# We can use this mask as an immersed boundary for our grid. +# Let's create the grid and visualize the mask. + +mask = ecco2_center_mask() +grid = mask.grid +grid = ImmersedBoundaryGrid(grid, GridFittedBoundary(mask)) + +fig = Figure() +ax = Axis(fig[1, 1]) +heatmap!(ax, interior(grid.immersed_boundary.mask, :, :, grid.Nz)) + +save("ecco_continents.png", fig) +nothing #hide + +# ![](ecco_continents.png) + +# Next, we construct our atmosphere and ocean. +# The atmosphere is prescribed, downloaded from the JRA55 dataset. +# It contains: +# - zonal wind `u` +# - meridional wind `v` +# - surface temperature `T` +# - surface relative humidity `q` +# - surface pressure `p` +# - downwelling shortwave radiation +# - downwelling longwave radiation +# +# We invoke the constructor with only the first two time indices, corresponding to +# January 1st (at 00:00 AM and 03:00 AM). +# By passing the ECCO grid, we automatically interpolate the atmospheric data onto the grid. +# Note that this is recommended only for small simulations (in terms of grid size). +# By omitting the grid, the interpolation will be done on the fly. +# +# We construct the ocean simulation without considering advection, closures, or Coriolis effects since +# we will not time-step the ocean but only use it to construct the fluxes. + +atmosphere = JRA55_prescribed_atmosphere(1:2; backend = InMemory(), grid = grid.underlying_grid) + +ocean = ocean_simulation(grid; momentum_advection = nothing, + tracer_advection = nothing, + closure = nothing, + coriolis = nothing) + +# Now that we have an atmosphere and a container for the ocean, we need to populate +# our ocean with initial conditions. To do this, we can use the ECCO2 dataset by +# `set!`ting the model with the `ECCO2Metadata`. If no date is specified, +# the fields corresponding to January 1st, 1992 (the first available date in +# ECCO2) are used. +# This command will download the fields to the local machine. + +set!(ocean.model; + T = ECCO2Metadata(:temperature), + S = ECCO2Metadata(:salinity)) + +# The final step is to construct a coupled model. +# The coupled model requires an ocean, which we have just constructed and initialized, +# an atmosphere, which we have downloaded from the JRA55 dataset, a sea ice model +# (in this case we do not account for sea ice by defining `sea_ice = nothing`), +# and a radiation model. The default radiation model assumes two spectral bands: +# a shortwave band modeling visible and UV light, and a longwave band that accounts for +# near, mid and far infrared (mostly far infrared given the low emission temperature). +# By constructing the coupled model, the `update_state!` function, which calculates the fluxes, +# will be triggered. + +radiation = Radiation() +sea_ice = nothing +coupled_model = OceanSeaIceModel(ocean, sea_ice; atmosphere, radiation) + +# Now that the surface fluxes are computed, we can extract and visualize them. +# The turbulent fluxes are stored in `coupled_model.fluxes.turbulent`. +# +# Qs = coupled_model.fluxes.turbulent.fields.sensible_heat : the sensible heat flux +# Ql = coupled_model.fluxes.turbulent.fields.latent_heat : the latent heat flux +# τx = coupled_model.fluxes.turbulent.fields.x_momentum : the zonal wind stress +# τy = coupled_model.fluxes.turbulent.fields.y_momentum : the meridional wind stress +# Mv = coupled_model.fluxes.turbulent.fields.water_vapor : evaporation +# +# They are 3D fields with one point in the vertical. To extract the data, we use the +# `interior` functionality from Oceananigans. + +turbulent_fluxes = coupled_model.fluxes.turbulent.fields + +Qs = interior(turbulent_fluxes.sensible_heat, :, :, 1) +Ql = interior(turbulent_fluxes.latent_heat, :, :, 1) +τx = interior(turbulent_fluxes.x_momentum, :, :, 1) +τy = interior(turbulent_fluxes.y_momentum, :, :, 1) +Mv = interior(turbulent_fluxes.water_vapor, :, :, 1) +nothing + +fig = Figure() + +ax = Axis(fig[1, 1], title = "Sensible heat flux") +heatmap!(ax, Qs; colormap = :bwr) + +ax = Axis(fig[1, 2], title = "Latent heat flux") +heatmap!(ax, Ql; colormap = :bwr) + +ax = Axis(fig[2, 1], title = "Zonal wind stress") +heatmap!(ax, τx; colormap = :bwr) + +ax = Axis(fig[2, 2], title = "Meridional wind stress") +heatmap!(ax, τy; colormap = :bwr) + +ax = Axis(fig[3, 1], title = "Evaporation") +heatmap!(ax, Mv; colormap = :bwr) + +save("turbulent_fluxes.png", fig) +nothing #hide + +# ![](turbulent_fluxes.png) diff --git a/examples/near_global_omip_simulation.jl b/examples/near_global_omip_simulation.jl new file mode 100644 index 00000000..3e7558ef --- /dev/null +++ b/examples/near_global_omip_simulation.jl @@ -0,0 +1,190 @@ +using Printf +using Oceananigans +using Oceananigans.Units +using Oceananigans: architecture +using ClimaOcean +using ClimaOcean.ECCO2 +using ClimaOcean.OceanSimulations +using ClimaOcean.OceanSeaIceModels + +##### +##### Near - Global Ocean at 1/4th of a degree +##### + +# 40 vertical levels +z_faces = exponential_z_faces(Nz=40, depth=6000) + +Nx = 1440 +Ny = 600 +Nz = length(z_faces) - 1 + +# Running on a GPU +arch = GPU() + +# A near-global grid from 75ᵒ S to 75ᵒ N +grid = LatitudeLongitudeGrid(arch; + size = (Nx, Ny, Nz), + halo = (7, 7, 7), + z = z_faces, + longitude = (0, 360), + latitude = (-75, 75)) + +# We retrieve the bathymetry from the ETOPO1 data by ensuring a +# minimum depth of 10 meters (everyhting shallower is considered land) +# and removing all connected regions (inland lakes) +bottom_height = retrieve_bathymetry(grid; + minimum_depth = 10, + dir = "./", + interpolation_passes = 20, + connected_regions_allowed = 0) + +# An immersed boundary using a staircase representation of bathymetry +grid = ImmersedBoundaryGrid(grid, GridFittedBottom(bottom_height)) + +##### +##### The Ocean component +##### + +# We retain all the defaults for the ocean model +ocean = ocean_simulation(grid) +model = ocean.model + +# We interpolate the initial conditions from the ECCO2 dataset +# (for the moment these are both 1st January 1992) +set!(model, + T = ECCO2Metadata(:temperature), + S = ECCO2Metadata(:salinity)) + +##### +##### The atmosphere +##### + +# The whole prescribed atmosphere is loaded in memory +# 4 snapshots at the time. +backend = JRA55NetCDFBackend(4) +atmosphere = JRA55_prescribed_atmosphere(arch; backend) + +# Tabulated ocean albedo from Payne (1982) +# ocean emissivity is the default 0.97 +radiation = Radiation(arch) + +##### +##### The atmospheric-forced coupled ocean-seaice model +##### + +# Simplistic sea ice that ensure "no-cooling-fluxes" where `T < T_minimum` +# to change with a thermodynamic sea-ice model +sea_ice = ClimaOcean.OceanSeaIceModels.MinimumTemperatureSeaIce() + +# The complete coupled model +coupled_model = OceanSeaIceModel(ocean, sea_ice; atmosphere, radiation) + +wall_time = [time_ns()] + +# We define a progress function that +# shows the maximum values of velocity and temperature +# to make sure everything proceedes as planned +function progress(sim) + u, v, w = sim.model.velocities + T = sim.model.tracers.T + + Tmax = maximum(interior(T)) + Tmin = minimum(interior(T)) + umax = maximum(interior(u)), maximum(interior(v)), maximum(interior(w)) + step_time = 1e-9 * (time_ns() - wall_time[1]) + + @info @sprintf("Time: %s, Iteration %d, Δt %s, max(vel): (%.2e, %.2e, %.2e), max(trac): %.2f, %.2f, wtime: %s \n", + prettytime(sim.model.clock.time), + sim.model.clock.iteration, + prettytime(sim.Δt), + umax..., Tmax, Tmin, prettytime(step_time)) + + wall_time[1] = time_ns() +end + +ocean.callbacks[:progress] = Callback(progress, IterationInterval(10)) + +fluxes = (u = model.velocities.u.boundary_conditions.top.condition, + v = model.velocities.v.boundary_conditions.top.condition, + T = model.tracers.T.boundary_conditions.top.condition, + S = model.tracers.S.boundary_conditions.top.condition) + + +output_kwargs = (; overwrite_existing = true, array_type = Array{Float32}) + +# We add a couple of outputs: the surface state every 12 hours, the surface fluxes +# every 12 hours, and the whole state every ten days +ocean.output_writers[:fluxes] = JLD2OutputWriter(model, fluxes; + schedule = TimeInterval(0.5days), + overwrite_existing = true, + filename = "surface_fluxes", + output_kwargs...) + +ocean.output_writers[:surface] = JLD2OutputWriter(model, merge(model.tracers, model.velocities); + schedule = TimeInterval(0.5days), + filename = "surface", + indices = (:, :, grid.Nz), + output_kwargs...) + +ocean.output_writers[:snapshots] = JLD2OutputWriter(model, merge(model.tracers, model.velocities); + schedule = TimeInterval(10days), + filename = "snapshots", + output_kwargs...) + +# Checkpointer for restarting purposes +ocean.output_writers[:checkpoint] = Checkpointer(model; + schedule = TimeInterval(60days), + overwrite_existing = true, + prefix = "checkpoint") + +##### +##### Run the simulation! +##### + +# warm up the simulation to ensure that the model adapts +# to the interpolated initial conditions without crashing +ocean.Δt = 10 +ocean.stop_iteration = 1 +wizard = TimeStepWizard(; cfl = 0.1, max_Δt = 90, max_change = 1.1) +ocean.callbacks[:wizard] = Callback(wizard, IterationInterval(1)) + +# Finally, the coupled simulation! +coupled_simulation = Simulation(coupled_model; Δt=1, stop_time = 20days) + +run!(coupled_simulation) + +##### +##### Visualization +##### + +using CairoMakie + +u, v, w = model.velocities +T, S, e = model.tracers + +using Oceananigans.Models.HydrostaticFreeSurfaceModel: VerticalVorticityField + +ζ = VerticalVorticityField(model) +s = Field(sqrt(u^2 + v^2)) + +compute!(ζ) +compute!(s) + +ζ = on_architecture(CPU(), ζ) +s = on_architecture(CPU(), s) +T = on_architecture(CPU(), T) +e = on_architecture(CPU(), e) + +fig = Figure(size = (1000, 800)) + +ax = Axis(fig[1, 1], title = "Vertical vorticity [s⁻¹]") +heatmap!(ax, interior(ζ, :, :, grid.Nz), colorrange = (-4e-5, 4e-5), colormap = :bwr) + +ax = Axis(fig[1, 2], title = "Surface speed [ms⁻¹]") +heatmap!(ax, interior(s, :, :, grid.Nz), colorrange = (0, 0.5), colormap = :deep) + +ax = Axis(fig[2, 1], title = "Surface Temperature [Cᵒ]") +heatmap!(ax, interior(T, :, :, grid.Nz), colorrange = (-1, 30), colormap = :magma) + +ax = Axis(fig[2, 1], title = "Turbulent Kinetic Energy [m²s⁻²]") +heatmap!(ax, interior(e, :, :, grid.Nz), colorrange = (0, 1e-3), colormap = :solar) \ No newline at end of file diff --git a/experiments/prototype_omip_simulation/single_column_omip_simulation.jl b/examples/single_column_simulation.jl similarity index 51% rename from experiments/prototype_omip_simulation/single_column_omip_simulation.jl rename to examples/single_column_simulation.jl index 093b9415..2e850592 100644 --- a/experiments/prototype_omip_simulation/single_column_omip_simulation.jl +++ b/examples/single_column_simulation.jl @@ -1,65 +1,87 @@ +# # Single column ocean simulation forced by JRA55 Reananlysis +# +# In this example, we simulate the evolution of an ocean water column +# forced by an atmosphere prescribed by the JRA55 Reananlysis data +# Specifically, the column is positioned at the location of the Ocean station +# Papa measurements (144.9ᵒ W and 50.1ᵒ N) +# +# ## Install dependencies +# +# First let's make sure we have all required packages installed. + +# ```julia +# using Pkg +# pkg"add Oceananigans, ClimaOcean, CairoMakie" +# ``` + using Oceananigans using Oceananigans.Units using Oceananigans.BuoyancyModels: buoyancy_frequency using Oceananigans.Units: Time using ClimaOcean -using ClimaOcean.DataWrangling.ECCO2: ecco2_column +using ClimaOcean.ECCO2: ECCO2Metadata +using ClimaOcean.OceanSimulations -using GLMakie +using CairoMakie using Printf -using Dates - -include("omip_components.jl") - -locations = ( - eastern_mediterranean = (λ = 30, φ = 32), - ocean_station_papa = (λ = 215, φ = 50), - north_atlantic = (λ = 325, φ = 50), - drake_passage = (λ = 300, φ = -60), - weddell_sea = (λ = 325, φ = -70), - tasman_southern_ocean = (λ = 145, φ = -55), -) - -location = :ocean_station_papa - -start_time = time_ns() - -epoch = Date(1992, 1, 1) -date = Date(1992, 10, 1) -start_seconds = Second(date - epoch).value -Tᵢ = ecco2_field(:temperature, date) -Sᵢ = ecco2_field(:salinity, date) - -elapsed = time_ns() - start_time -@info "Initial condition built. " * prettytime(elapsed * 1e-9) -start_time = time_ns() ##### ##### Construct the grid ##### -Nz = 80 -H = 400 +# Since it is a single column, and therefore computationally +# inexpensive, we can run the simulation entirely on the CPU arch = CPU() -λ★, φ★ = locations[location] -i★, j★, longitude, latitude = ecco2_column(λ★, φ★) -grid = LatitudeLongitudeGrid(arch; longitude, latitude, - size = (1, 1, Nz), - z = (-H, 0), - topology = (Periodic, Periodic, Bounded)) +Nz = 80 +H = 400 + +# Ocean station papa location +λ★, φ★ = 35.1, 50.1 +longitude = λ★ .+ (-0.25, 0.25) +latitude = φ★ .+ (-0.25, 0.25) + +# We use a SingleColumnGrid +grid = LatitudeLongitudeGrid(; size = (3, 3, Nz), + longitude, + latitude, + z = (-H, 0), + topology = (Periodic, Periodic, Bounded)) + +# Building the ocean simulation +momentum_advection = nothing +tracer_advection = nothing +coriolis = FPlane(latitude = φ★) + +ocean = ocean_simulation(grid; + coriolis, + tracer_advection, + momentum_advection, + bottom_drag_coefficient = 0) +model = ocean.model -ocean = omip_ocean_component(grid) +start_time = time_ns() -backend = JRA55NetCDFBackend(8 * 60) -atmosphere = JRA55_prescribed_atmosphere(:; longitude, latitude, backend) +# Initial conditions +set!(ocean.model, T = ECCO2Metadata(:temperature), + S = ECCO2Metadata(:salinity), + e = 1e-6) -ocean.model.clock.time = start_seconds +elapsed = time_ns() - start_time +@info "Initial condition built. " * prettytime(elapsed * 1e-9) +start_time = time_ns() + +# Retrieving the atmosphere +last_time = floor(Int, 31 * 24 / 3) # 31 days in hours divided by JRA55's frequency in hours +backend = InMemory() +atmosphere = JRA55_prescribed_atmosphere(time_indices = 1:last_time; + longitude, latitude, backend, + include_rivers_and_icebergs = false) + +ocean.model.clock.time = 0 ocean.model.clock.iteration = 0 -interpolate!(ocean.model.tracers.T, Tᵢ) -interpolate!(ocean.model.tracers.S, Sᵢ) -set!(ocean.model, e=1e-6) +ocean.Δt = 10minutes ua = atmosphere.velocities.u va = atmosphere.velocities.v @@ -79,10 +101,9 @@ lines!(axq, times ./ days, interior(qa, 1, 1, 1, :)) display(fig) -sea_ice = nothing radiation = Radiation() -coupled_model = OceanSeaIceModel(ocean, sea_ice; atmosphere, radiation) -coupled_simulation = Simulation(coupled_model, Δt=10minutes, stop_time=start_seconds + 30days) +coupled_model = OceanSeaIceModel(ocean; atmosphere, radiation) +coupled_simulation = Simulation(coupled_model, Δt=10minutes, stop_time=30days) elapsed = time_ns() - start_time @info "Coupled simulation built. " * prettytime(elapsed * 1e-9) @@ -91,7 +112,7 @@ start_time = time_ns() wall_clock = Ref(time_ns()) function progress(sim) - msg = string("(", location, ")") + msg = "Ocean Station Papa" msg *= string(", iter: ", iteration(sim), ", time: ", prettytime(sim)) elapsed = 1e-9 * (time_ns() - wall_clock[]) @@ -107,9 +128,10 @@ function progress(sim) τˣ = first(sim.model.fluxes.total.ocean.momentum.τˣ) τʸ = first(sim.model.fluxes.total.ocean.momentum.τʸ) - u★ = sqrt(sqrt(τˣ^2 + τʸ^2)) Q = first(sim.model.fluxes.total.ocean.heat) + u★ = sqrt(sqrt(τˣ^2 + τʸ^2)) + Nz = size(T, 3) msg *= @sprintf(", u★: %.2f m s⁻¹", u★) msg *= @sprintf(", Q: %.2f W m⁻²", Q) @@ -134,13 +156,13 @@ Qv = coupled_model.fluxes.turbulent.fields.latent_heat ρₒ = coupled_model.fluxes.ocean_reference_density cₚ = coupled_model.fluxes.ocean_heat_capacity -Q = ρₒ * cₚ * Jᵀ -τx = ρₒ * Jᵘ -τy = ρₒ * Jᵛ +Q = ρₒ * cₚ * JT +τx = ρₒ * Ju +τy = ρₒ * Jv N² = buoyancy_frequency(ocean.model) -κc = ocean.model.diffusivity_fields.κᶜ +κc = ocean.model.diffusivity_fields.κc -fluxes = (; τx, τy, E, Js, Q, Qc, Qc) +fluxes = (; τx, τy, E, Js, Qv, Qc) auxiliary_fields = (; N², κc) fields = merge(ocean.model.velocities, ocean.model.tracers, auxiliary_fields) @@ -148,82 +170,61 @@ fields = merge(ocean.model.velocities, ocean.model.tracers, auxiliary_fields) # Slice fields at the surface outputs = merge(fields, fluxes) -output_attributes = Dict{String, Any}( - "κc" => Dict("long_name" => "Tracer diffusivity", "units" => "m^2 / s"), - "Q" => Dict("long_name" => "Net heat flux", "units" => "W / m^2", "convention" => "positive upwards"), - "Qv" => Dict("long_name" => "Latent heat flux", "units" => "W / m^2", "convention" => "positive upwards"), - "Qc" => Dict("long_name" => "Sensible heat flux", "units" => "W / m^2", "convention" => "positive upwards"), - "Js" => Dict("long_name" => "Salt flux", "units" => "g kg⁻¹ m s⁻¹", "convention" => "positive upwards"), - "E" => Dict("long_name" => "Freshwater evaporation flux", "units" => "m s⁻¹", "convention" => "positive upwards"), - "e" => Dict("long_name" => "Turbulent kinetic energy", "units" => "m^2 / s^2"), - "τx" => Dict("long_name" => "Zonal momentum flux", "units" => "m^2 / s^2"), - "τx" => Dict("long_name" => "Meridional momentum flux", "units" => "m^2 / s^2"), -) - filename = "single_column_omip_$location" coupled_simulation.output_writers[:jld2] = JLD2OutputWriter(ocean.model, outputs; filename, schedule = TimeInterval(3hours), overwrite_existing = true) -#= -coupled_simulation.output_writers[:nc] = NetCDFOutputWriter(ocean.model, outputs; filename, - schedule = AveragedTimeInterval(1days), - output_attributes, - overwrite_existing = true) -=# - run!(coupled_simulation) -#= filename *= ".jld2" -ut = FieldTimeSeries(filename, "u") -vt = FieldTimeSeries(filename, "v") -Tt = FieldTimeSeries(filename, "T") -St = FieldTimeSeries(filename, "S") -et = FieldTimeSeries(filename, "e") -N²t = FieldTimeSeries(filename, "N²") -κt = FieldTimeSeries(filename, "κᶜ") - -Qt = FieldTimeSeries(filename, "Q") -Qset = FieldTimeSeries(filename, "Qse") -Qlat = FieldTimeSeries(filename, "Qla") -Jˢt = FieldTimeSeries(filename, "Jˢ") -Et = FieldTimeSeries(filename, "E") -τˣt = FieldTimeSeries(filename, "τˣ") -τʸt = FieldTimeSeries(filename, "τʸ") - -Nz = size(Tt, 3) -times = Qt.times - -ua = atmosphere.velocities.u -va = atmosphere.velocities.v -Ta = atmosphere.tracers.T -qa = atmosphere.tracers.q +u = FieldTimeSeries(filename, "u") +v = FieldTimeSeries(filename, "v") +T = FieldTimeSeries(filename, "T") +S = FieldTimeSeries(filename, "S") +e = FieldTimeSeries(filename, "e") +N² = FieldTimeSeries(filename, "N²") +κ = FieldTimeSeries(filename, "κc") + +Qv = FieldTimeSeries(filename, "Qv") +Qc = FieldTimeSeries(filename, "Qc") +Js = FieldTimeSeries(filename, "Js") +Ev = FieldTimeSeries(filename, "E") +τˣ = FieldTimeSeries(filename, "τx") +τʸ = FieldTimeSeries(filename, "τy") + +Nz = size(T, 3) +times = Qc.times + +ua = atmosphere.velocities.u +va = atmosphere.velocities.v +Ta = atmosphere.tracers.T +qa = atmosphere.tracers.q Qlw = atmosphere.downwelling_radiation.longwave Qsw = atmosphere.downwelling_radiation.shortwave -Pr = atmosphere.freshwater_flux.rain -Ps = atmosphere.freshwater_flux.snow - -Nt = length(times) -uat = zeros(Nt) -vat = zeros(Nt) -Tat = zeros(Nt) -qat = zeros(Nt) +Pr = atmosphere.freshwater_flux.rain +Ps = atmosphere.freshwater_flux.snow + +Nt = length(times) +uat = zeros(Nt) +vat = zeros(Nt) +Tat = zeros(Nt) +qat = zeros(Nt) Qswt = zeros(Nt) Qlwt = zeros(Nt) -Pt = zeros(Nt) +Pt = zeros(Nt) for n = 1:Nt t = times[n] - uat[n] = ua[1, 1, 1, Time(t)] - vat[n] = va[1, 1, 1, Time(t)] - Tat[n] = Ta[1, 1, 1, Time(t)] - qat[n] = qa[1, 1, 1, Time(t)] + uat[n] = ua[1, 1, 1, Time(t)] + vat[n] = va[1, 1, 1, Time(t)] + Tat[n] = Ta[1, 1, 1, Time(t)] + qat[n] = qa[1, 1, 1, Time(t)] Qswt[n] = Qsw[1, 1, 1, Time(t)] Qlwt[n] = Qlw[1, 1, 1, Time(t)] - Pt[n] = Pr[1, 1, 1, Time(t)] + Ps[1, 1, 1, Time(t)] + Pt[n] = Pr[1, 1, 1, Time(t)] + Ps[1, 1, 1, Time(t)] end set_theme!(Theme(linewidth=3)) @@ -251,60 +252,57 @@ slider = Slider(fig[4, 1:6], range=1:Nt, startvalue=1) n = slider.value times = (times .- times[1]) ./days +Nt = length(times) tn = @lift times[$n] colors = Makie.wong_colors() -#lines!(axu, times, uat, color=colors[1]) -#lines!(axu, times, vat, color=colors[2]) - ρₒ = coupled_model.fluxes.ocean_reference_density -Jᵘt = interior(τˣt, 1, 1, 1, :) ./ ρₒ -Jᵛt = interior(τʸt, 1, 1, 1, :) ./ ρₒ -u★ = @. (Jᵘt^2 + Jᵛt^2)^(1/4) +Jᵘ = interior(τˣ, 1, 1, 1, :) ./ ρₒ +Jᵛ = interior(τʸ, 1, 1, 1, :) ./ ρₒ +u★ = @. (Jᵘ^2 + Jᵛ^2)^(1/4) -lines!(axu, times, interior(ut, 1, 1, Nz, :), color=colors[1], label="Zonal") -lines!(axu, times, interior(vt, 1, 1, Nz, :), color=colors[2], label="Meridional") +lines!(axu, times, interior(u, 1, 1, Nz, :), color=colors[1], label="Zonal") +lines!(axu, times, interior(v, 1, 1, Nz, :), color=colors[2], label="Meridional") lines!(axu, times, u★, color=colors[3], label="Ocean-side u★") vlines!(axu, tn, linewidth=4, color=(:black, 0.5)) axislegend(axu) -lines!(axτ, times, interior(τˣt, 1, 1, 1, :), label="Zonal") -lines!(axτ, times, interior(τʸt, 1, 1, 1, :), label="Meridional") +lines!(axτ, times, interior(τˣ, 1, 1, 1, :), label="Zonal") +lines!(axτ, times, interior(τʸ, 1, 1, 1, :), label="Meridional") vlines!(axτ, tn, linewidth=4, color=(:black, 0.5)) axislegend(axτ) -lines!(axT, times, Tat .- 273.15, color=colors[1], linewidth=2, linestyle=:dash, label="Atmosphere temperature") -lines!(axT, times, interior(Tt, 1, 1, Nz, :), color=colors[2], linewidth=4, label="Ocean surface temperature") +lines!(axT, times, Tat[1:Nt] .- 273.15, color=colors[1], linewidth=2, linestyle=:dash, label="Atmosphere temperature") +lines!(axT, times, interior(T, 1, 1, Nz, :), color=colors[2], linewidth=4, label="Ocean surface temperature") vlines!(axT, tn, linewidth=4, color=(:black, 0.5)) axislegend(axT) -lines!(axQ, times, interior(Qt, 1, 1, 1, :), color=colors[1], label="Total", linewidth=6) -lines!(axQ, times, interior(Qset, 1, 1, 1, :), color=colors[2], label="Sensible", linewidth=2) -lines!(axQ, times, interior(Qlat, 1, 1, 1, :), color=colors[3], label="Latent", linewidth=2) -lines!(axQ, times, - Qswt, color=colors[4], label="Shortwave", linewidth=2) -lines!(axQ, times, - Qlwt, color=colors[5], label="Longwave", linewidth=2) +lines!(axQ, times, interior(Qv, 1, 1, 1, 1:Nt), color=colors[2], label="Sensible", linewidth=2) +lines!(axQ, times, interior(Qc, 1, 1, 1, 1:Nt), color=colors[3], label="Latent", linewidth=2) +lines!(axQ, times, - interior(Qsw, 1, 1, 1, 1:Nt), color=colors[4], label="Shortwave", linewidth=2) +lines!(axQ, times, - interior(Qlw, 1, 1, 1, 1:Nt), color=colors[5], label="Longwave", linewidth=2) vlines!(axQ, tn, linewidth=4, color=(:black, 0.5)) axislegend(axQ) #lines!(axF, times, interior(Jˢt, 1, 1, 1, :), label="Net freshwater flux") -lines!(axF, times, Pt, label="Prescribed freshwater flux") -lines!(axF, times, - interior(Et, 1, 1, 1, :), label="Evaporation") +lines!(axF, times, Pt[1:Nt], label="Prescribed freshwater flux") +lines!(axF, times, - interior(Ev, 1, 1, 1, 1:Nt), label="Evaporation") vlines!(axF, tn, linewidth=4, color=(:black, 0.5)) axislegend(axF) -lines!(axS, times, interior(St, 1, 1, Nz, :)) +lines!(axS, times, interior(S, 1, 1, Nz, :)) vlines!(axS, tn, linewidth=4, color=(:black, 0.5)) -zc = znodes(Tt) -zf = znodes(κt) -un = @lift interior(ut[$n], 1, 1, :) -vn = @lift interior(vt[$n], 1, 1, :) -Tn = @lift interior(Tt[$n], 1, 1, :) -Sn = @lift interior(St[$n], 1, 1, :) -κn = @lift interior(κt[$n], 1, 1, :) -en = @lift max.(1e-6, interior(et[$n], 1, 1, :)) -N²n = @lift interior(N²t[$n], 1, 1, :) +zc = znodes(T) +zf = znodes(κ) +un = @lift interior(u[$n], 1, 1, :) +vn = @lift interior(v[$n], 1, 1, :) +Tn = @lift interior(T[$n], 1, 1, :) +Sn = @lift interior(S[$n], 1, 1, :) +κn = @lift interior(κ[$n], 1, 1, :) +en = @lift interior(e[$n], 1, 1, :) +N²n = @lift interior(N²[$n], 1, 1, :) scatterlines!(axuz, un, zc, label="u") scatterlines!(axuz, vn, zc, label="v") @@ -316,20 +314,20 @@ scatterlines!(axκz, κn, zf) axislegend(axuz) -Tmax = maximum(interior(Tt)) -Tmin = minimum(interior(Tt)) +Tmax = maximum(interior(T)) +Tmin = minimum(interior(T)) xlims!(axTz, Tmin - 0.1, Tmax + 0.1) -Nmax = maximum(interior(N²t)) -Nmin = minimum(interior(N²t)) +Nmax = maximum(interior(N²)) +Nmin = minimum(interior(N²)) xlims!(axNz, Nmin / 2, Nmin * 1.1) -emax = maximum(interior(et)) +emax = maximum(interior(e)) xlims!(axez, 8e-7, emax * 1.1) xlims!(axκz, 1e-7, 10) -Smax = maximum(interior(St)) -Smin = minimum(interior(St)) +Smax = maximum(interior(S)) +Smin = minimum(interior(S)) xlims!(axSz, Smin - 0.2, Smax + 0.2) display(fig) @@ -337,6 +335,4 @@ display(fig) record(fig, "$(location)_single_column_simulation.mp4", 1:Nt, framerate=24) do nn @info "Drawing frame $nn of $Nt..." n[] = nn -# end end -=# diff --git a/experiments/prototype_omip_simulation/freely_decaying_regional_simulation.jl b/experiments/freely_decaying_regional_simulation.jl similarity index 100% rename from experiments/prototype_omip_simulation/freely_decaying_regional_simulation.jl rename to experiments/freely_decaying_regional_simulation.jl diff --git a/experiments/prototype_omip_simulation/omip_components.jl b/experiments/omip_components.jl similarity index 100% rename from experiments/prototype_omip_simulation/omip_components.jl rename to experiments/omip_components.jl diff --git a/experiments/prototype_omip_simulation/plot_freely_decaying_simulation.jl b/experiments/plot_freely_decaying_simulation.jl similarity index 100% rename from experiments/prototype_omip_simulation/plot_freely_decaying_simulation.jl rename to experiments/plot_freely_decaying_simulation.jl diff --git a/experiments/prototype_omip_simulation/Manifest.toml b/experiments/prototype_omip_simulation/Manifest.toml deleted file mode 100644 index 230b6f71..00000000 --- a/experiments/prototype_omip_simulation/Manifest.toml +++ /dev/null @@ -1,2359 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.10.2" -manifest_format = "2.0" -project_hash = "d8dbe9035fba3af9077b6e3c6495e511c55cd6e3" - -[[deps.AbstractFFTs]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.5.0" -weakdeps = ["ChainRulesCore", "Test"] - - [deps.AbstractFFTs.extensions] - AbstractFFTsChainRulesCoreExt = "ChainRulesCore" - AbstractFFTsTestExt = "Test" - -[[deps.AbstractLattices]] -git-tree-sha1 = "222ee9e50b98f51b5d78feb93dd928880df35f06" -uuid = "398f06c4-4d28-53ec-89ca-5b2656b7603d" -version = "0.3.0" - -[[deps.AbstractTrees]] -git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.4.5" - -[[deps.Accessors]] -deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"] -git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425" -uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" -version = "0.1.36" - - [deps.Accessors.extensions] - AccessorsAxisKeysExt = "AxisKeys" - AccessorsIntervalSetsExt = "IntervalSets" - AccessorsStaticArraysExt = "StaticArrays" - AccessorsStructArraysExt = "StructArrays" - AccessorsUnitfulExt = "Unitful" - - [deps.Accessors.weakdeps] - AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" - IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" - Requires = "ae029012-a4dd-5104-9daa-d747884805df" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.4" -weakdeps = ["StaticArrays"] - - [deps.Adapt.extensions] - AdaptStaticArraysExt = "StaticArrays" - -[[deps.Animations]] -deps = ["Colors"] -git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d" -uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" -version = "0.4.1" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.1" - -[[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "44691067188f6bd1b2289552a23e4b7572f4528d" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.9.0" - - [deps.ArrayInterface.extensions] - ArrayInterfaceBandedMatricesExt = "BandedMatrices" - ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" - ArrayInterfaceCUDAExt = "CUDA" - ArrayInterfaceChainRulesExt = "ChainRules" - ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" - ArrayInterfaceReverseDiffExt = "ReverseDiff" - ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" - ArrayInterfaceTrackerExt = "Tracker" - - [deps.ArrayInterface.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[deps.Atomix]] -deps = ["UnsafeAtomics"] -git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" -uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" -version = "0.1.0" - -[[deps.Automa]] -deps = ["PrecompileTools", "TranscodingStreams"] -git-tree-sha1 = "588e0d680ad1d7201d4c6a804dcb1cd9cba79fbb" -uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" -version = "1.0.3" - -[[deps.AxisAlgorithms]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] -git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" -uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" -version = "1.1.0" - -[[deps.AxisArrays]] -deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" -uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.4.7" - -[[deps.BFloat16s]] -deps = ["LinearAlgebra", "Printf", "Random", "Test"] -git-tree-sha1 = "2c7cc21e8678eff479978a0a2ef5ce2f51b63dff" -uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" -version = "0.5.0" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[deps.BitFlags]] -git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" -uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" -version = "0.1.8" - -[[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"] -git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+1" - -[[deps.CEnum]] -git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.5.0" - -[[deps.CFTime]] -deps = ["Dates", "Printf"] -git-tree-sha1 = "5afb5c5ba2688ca43a9ad2e5a91cbb93921ccfa1" -uuid = "179af706-886a-5703-950a-314cd64e0468" -version = "0.1.3" - -[[deps.CRC32c]] -uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" - -[[deps.CRlibm]] -deps = ["CRlibm_jll"] -git-tree-sha1 = "32abd86e3c2025db5172aa182b982debed519834" -uuid = "96374032-68de-5a5b-8d9e-752f78720389" -version = "1.0.1" - -[[deps.CRlibm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" -uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" -version = "1.0.1+0" - -[[deps.CUDA]] -deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "StaticArrays", "Statistics"] -git-tree-sha1 = "baa8ea7a1ea63316fa3feb454635215773c9c845" -uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "5.2.0" -weakdeps = ["ChainRulesCore", "SpecialFunctions"] - - [deps.CUDA.extensions] - ChainRulesCoreExt = "ChainRulesCore" - SpecialFunctionsExt = "SpecialFunctions" - -[[deps.CUDA_Driver_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "d01bfc999768f0a31ed36f5d22a76161fc63079c" -uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" -version = "0.7.0+1" - -[[deps.CUDA_Runtime_Discovery]] -deps = ["Libdl"] -git-tree-sha1 = "2cb12f6b2209f40a4b8967697689a47c50485490" -uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" -version = "0.2.3" - -[[deps.CUDA_Runtime_jll]] -deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "8e25c009d2bf16c2c31a70a6e9e8939f7325cc84" -uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" -version = "0.11.1+0" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.0+1" - -[[deps.Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.23.0" -weakdeps = ["SparseArrays"] - - [deps.ChainRulesCore.extensions] - ChainRulesCoreSparseArraysExt = "SparseArrays" - -[[deps.ClimaOcean]] -deps = ["Adapt", "CUDA", "ClimaSeaIce", "CubicSplines", "DataDeps", "Dates", "Downloads", "JLD2", "KernelAbstractions", "NCDatasets", "Oceananigans", "Printf", "SeawaterPolynomials", "StaticArrays", "Statistics", "SurfaceFluxes", "Thermodynamics"] -git-tree-sha1 = "2cd02219dd1feb66fa43bab0f3d80a9c04a2af4e" -repo-rev = "glw-ss/ice-ocean-model" -repo-url = "../.." -uuid = "0376089a-ecfe-4b0e-a64f-9c555d74d754" -version = "0.2.0" - -[[deps.ClimaSeaIce]] -deps = ["Adapt", "KernelAbstractions", "Oceananigans", "RootSolvers", "Roots", "SeawaterPolynomials"] -git-tree-sha1 = "6afd99a2cb2495792aaed92dc895ba78a3b82870" -repo-rev = "main" -repo-url = "https://github.com/CliMA/ClimaSeaIce.jl.git" -uuid = "6ba0ff68-24e6-4315-936c-2e99227c95a4" -version = "0.1.0" - -[[deps.CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.4" - -[[deps.ColorBrewer]] -deps = ["Colors", "JSON", "Test"] -git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4" -uuid = "a2cac450-b92f-5266-8821-25eda20663c8" -version = "0.4.0" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.24.0" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.4" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" -weakdeps = ["SpecialFunctions"] - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.10" - -[[deps.Combinatorics]] -git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" -uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" -version = "1.0.2" - -[[deps.CommonDataModel]] -deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] -git-tree-sha1 = "d7d7b58e149f19c322840a50d1bc20e8c23addb4" -uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" -version = "0.3.5" - -[[deps.CommonSolve]] -git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" -uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.4" - -[[deps.CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[deps.Compat]] -deps = ["TOML", "UUIDs"] -git-tree-sha1 = "c955881e3c981181362ae4088b35995446298b80" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.14.0" -weakdeps = ["Dates", "LinearAlgebra"] - - [deps.Compat.extensions] - CompatLinearAlgebraExt = "LinearAlgebra" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.0+0" - -[[deps.CompositionsBase]] -git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" -uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" -version = "0.1.2" -weakdeps = ["InverseFunctions"] - - [deps.CompositionsBase.extensions] - CompositionsBaseInverseFunctionsExt = "InverseFunctions" - -[[deps.ConcurrentUtilities]] -deps = ["Serialization", "Sockets"] -git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" -uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.4.1" - -[[deps.ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.5" -weakdeps = ["IntervalSets", "StaticArrays"] - - [deps.ConstructionBase.extensions] - ConstructionBaseIntervalSetsExt = "IntervalSets" - ConstructionBaseStaticArraysExt = "StaticArrays" - -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" - -[[deps.Crayons]] -git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" -uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" -version = "4.1.1" - -[[deps.CubedSphere]] -deps = ["Elliptic", "FFTW", "Printf", "ProgressBars", "SpecialFunctions", "TaylorSeries", "Test"] -git-tree-sha1 = "10134667d7d3569b191a65801514271b8a93b292" -uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" -version = "0.2.5" - -[[deps.CubicSplines]] -deps = ["Random", "Test"] -git-tree-sha1 = "4875023d456ea37c581f406b8b1bc35bea95ae67" -uuid = "9c784101-8907-5a6d-9be6-98f00873c89b" -version = "0.2.1" - -[[deps.DataAPI]] -git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.16.0" - -[[deps.DataDeps]] -deps = ["HTTP", "Libdl", "Reexport", "SHA", "Scratch", "p7zip_jll"] -git-tree-sha1 = "8ae085b71c462c2cb1cfedcb10c3c877ec6cf03f" -uuid = "124859b0-ceae-595e-8997-d05f6a7a8dfe" -version = "0.7.13" - -[[deps.DataFrames]] -deps = ["Compat", "DataAPI", "DataStructures", "Future", "InlineStrings", "InvertedIndices", "IteratorInterfaceExtensions", "LinearAlgebra", "Markdown", "Missings", "PooledArrays", "PrecompileTools", "PrettyTables", "Printf", "REPL", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] -git-tree-sha1 = "04c738083f29f86e62c8afc341f0967d8717bdb8" -uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" -version = "1.6.1" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "0f4b5d62a88d8f59003e43c25a8a90de9eb76317" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.18" - -[[deps.DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[deps.DelaunayTriangulation]] -deps = ["DataStructures", "EnumX", "ExactPredicates", "Random", "SimpleGraphs"] -git-tree-sha1 = "d4e9dc4c6106b8d44e40cd4faf8261a678552c7c" -uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "0.8.12" - -[[deps.DiffResults]] -deps = ["StaticArraysCore"] -git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.1.0" - -[[deps.DiffRules]] -deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.15.1" - -[[deps.DiskArrays]] -deps = ["LRUCache", "OffsetArrays"] -git-tree-sha1 = "ef25c513cad08d7ebbed158c91768ae32f308336" -uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3" -version = "0.3.23" - -[[deps.Distances]] -deps = ["LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.11" -weakdeps = ["ChainRulesCore", "SparseArrays"] - - [deps.Distances.extensions] - DistancesChainRulesCoreExt = "ChainRulesCore" - DistancesSparseArraysExt = "SparseArrays" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[deps.Distributions]] -deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "7c302d7a5fec5214eb8a5a4c466dcf7a51fcf169" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.107" - - [deps.Distributions.extensions] - DistributionsChainRulesCoreExt = "ChainRulesCore" - DistributionsDensityInterfaceExt = "DensityInterface" - DistributionsTestExt = "Test" - - [deps.Distributions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" - Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.3" - -[[deps.Downloads]] -deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" - -[[deps.DualNumbers]] -deps = ["Calculus", "NaNMath", "SpecialFunctions"] -git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" -uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" -version = "0.6.8" - -[[deps.EarCut_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" -uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" -version = "2.2.4+0" - -[[deps.Elliptic]] -git-tree-sha1 = "71c79e77221ab3a29918aaf6db4f217b89138608" -uuid = "b305315f-e792-5b7a-8f41-49f472929428" -version = "1.0.1" - -[[deps.EnumX]] -git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" -uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.4" - -[[deps.ErrorfreeArithmetic]] -git-tree-sha1 = "d6863c556f1142a061532e79f611aa46be201686" -uuid = "90fa49ef-747e-5e6f-a989-263ba693cf1a" -version = "0.5.2" - -[[deps.ExactPredicates]] -deps = ["IntervalArithmetic", "Random", "StaticArraysCore", "Test"] -git-tree-sha1 = "276e83bc8b21589b79303b9985c321024ffdf59c" -uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" -version = "2.2.5" - -[[deps.ExceptionUnwrapping]] -deps = ["Test"] -git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" -uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" -version = "0.1.10" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.5.0+0" - -[[deps.ExprTools]] -git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" -uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.10" - -[[deps.Extents]] -git-tree-sha1 = "2140cd04483da90b2da7f99b2add0750504fc39c" -uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" -version = "0.1.2" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "ab3f7e1819dba9434a3a5126510c8fda3a4e7000" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "6.1.1+0" - -[[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" -uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.8.0" - -[[deps.FFTW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" -uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.10+0" - -[[deps.FastRounding]] -deps = ["ErrorfreeArithmetic", "LinearAlgebra"] -git-tree-sha1 = "6344aa18f654196be82e62816935225b3b9abe44" -uuid = "fa42c844-2597-5d31-933b-ebd51ab2693f" -version = "0.3.1" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.16.3" - -[[deps.FilePaths]] -deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] -git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" -uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" -version = "0.8.3" - -[[deps.FilePathsBase]] -deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] -git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa" -uuid = "48062228-2e41-5def-b9a4-89aafe57970f" -version = "0.9.21" - -[[deps.FileWatching]] -uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" - -[[deps.FillArrays]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.10.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] - - [deps.FillArrays.extensions] - FillArraysPDMatsExt = "PDMats" - FillArraysSparseArraysExt = "SparseArrays" - FillArraysStatisticsExt = "Statistics" - -[[deps.FiniteDiff]] -deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "bc0c5092d6caaea112d3c8e3b238d61563c58d5f" -uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.23.0" - - [deps.FiniteDiff.extensions] - FiniteDiffBandedMatricesExt = "BandedMatrices" - FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" - FiniteDiffStaticArraysExt = "StaticArrays" - - [deps.FiniteDiff.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.93+0" - -[[deps.Format]] -git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" -uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" -version = "1.3.7" - -[[deps.ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.36" -weakdeps = ["StaticArrays"] - - [deps.ForwardDiff.extensions] - ForwardDiffStaticArraysExt = "StaticArrays" - -[[deps.FreeType]] -deps = ["CEnum", "FreeType2_jll"] -git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" -uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" -version = "4.1.1" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.1+0" - -[[deps.FreeTypeAbstraction]] -deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] -git-tree-sha1 = "055626e1a35f6771fe99060e835b72ca61a52621" -uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" -version = "0.10.1" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.10+0" - -[[deps.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[deps.GLFW]] -deps = ["GLFW_jll"] -git-tree-sha1 = "35dbc482f0967d8dceaa7ce007d16f9064072166" -uuid = "f7f18e0c-5ee9-5ccd-a5bf-e8befd85ed98" -version = "3.4.1" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] -git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.3.9+0" - -[[deps.GLMakie]] -deps = ["ColorTypes", "Colors", "FileIO", "FixedPointNumbers", "FreeTypeAbstraction", "GLFW", "GeometryBasics", "LinearAlgebra", "Makie", "Markdown", "MeshIO", "ModernGL", "Observables", "PrecompileTools", "Printf", "ShaderAbstractions", "StaticArrays"] -git-tree-sha1 = "b99a999cdcc7467769c7ea8cdc0978a5f059aa7b" -uuid = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" -version = "0.9.10" - -[[deps.GMP_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d" -version = "6.2.1+6" - -[[deps.GPUArrays]] -deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] -git-tree-sha1 = "47e4686ec18a9620850bad110b79966132f14283" -uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "10.0.2" - -[[deps.GPUArraysCore]] -deps = ["Adapt"] -git-tree-sha1 = "ec632f177c0d990e64d955ccc1b8c04c485a0950" -uuid = "46192b85-c4d5-4398-a991-12ede77f4527" -version = "0.1.6" - -[[deps.GPUCompiler]] -deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "a846f297ce9d09ccba02ead0cae70690e072a119" -uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.25.0" - -[[deps.GeoInterface]] -deps = ["Extents"] -git-tree-sha1 = "d4f85701f569584f2cff7ba67a137d03f0cfb7d0" -uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" -version = "1.3.3" - -[[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "5694b56ccf9d15addedc35e9a4ba9c317721b788" -uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.10" - -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "359a1ba2e320790ddbe4ee8b4d54a305c0ea2aff" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.80.0+0" - -[[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.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.14+0" - -[[deps.GridLayoutBase]] -deps = ["GeometryBasics", "InteractiveUtils", "Observables"] -git-tree-sha1 = "6f93a83ca11346771a93bbde2bdad2f65b61498f" -uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" -version = "0.10.2" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HDF5_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] -git-tree-sha1 = "38c8874692d48d5440d5752d6c74b0c6b0b60739" -uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" -version = "1.14.2+1" - -[[deps.HTTP]] -deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "8e59b47b9dc525b70550ca082ce85bcd7f5477cd" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.5" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] -git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "2.8.1+1" - -[[deps.Hwloc_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114" -uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.10.0+0" - -[[deps.HypergeometricFunctions]] -deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.23" - -[[deps.IfElse]] -git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" -uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" -version = "0.1.1" - -[[deps.ImageAxes]] -deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] -git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" -uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" -version = "0.6.11" - -[[deps.ImageBase]] -deps = ["ImageCore", "Reexport"] -git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" -uuid = "c817782e-172a-44cc-b673-b171935fbb9e" -version = "0.1.7" - -[[deps.ImageCore]] -deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] -git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" -uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.10.2" - -[[deps.ImageIO]] -deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] -git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" -uuid = "82e4d734-157c-48bb-816b-45c225c6df19" -version = "0.6.7" - -[[deps.ImageMetadata]] -deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] -git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" -uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" -version = "0.9.9" - -[[deps.Imath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" -uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.1.7+0" - -[[deps.IncompleteLU]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "6c676e79f98abb6d33fa28122cad099f1e464afe" -uuid = "40713840-3770-5561-ab4c-a76e7d0d7895" -version = "0.2.1" - -[[deps.IndirectArrays]] -git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" -uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" -version = "1.0.0" - -[[deps.Inflate]] -git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.4" - -[[deps.InlineStrings]] -deps = ["Parsers"] -git-tree-sha1 = "9cc2baf75c6d09f9da536ddf58eb2f29dedaf461" -uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" -version = "1.4.0" - -[[deps.IntegerMathUtils]] -git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" -uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" -version = "0.1.2" - -[[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "5fdf2fe6724d8caabf43b557b84ce53f3b7e2f6b" -uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2024.0.2+0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" -uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.15.1" - - [deps.Interpolations.extensions] - InterpolationsUnitfulExt = "Unitful" - - [deps.Interpolations.weakdeps] - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.IntervalArithmetic]] -deps = ["CRlibm", "FastRounding", "LinearAlgebra", "Markdown", "Random", "RecipesBase", "RoundingEmulator", "SetRounding", "StaticArrays"] -git-tree-sha1 = "5ab7744289be503d76a944784bac3f2df7b809af" -uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "0.20.9" - -[[deps.IntervalSets]] -git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.10" -weakdeps = ["Random", "RecipesBase", "Statistics"] - - [deps.IntervalSets.extensions] - IntervalSetsRandomExt = "Random" - IntervalSetsRecipesBaseExt = "RecipesBase" - IntervalSetsStatisticsExt = "Statistics" - -[[deps.InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "896385798a8d49a255c398bd49162062e4a4c435" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.13" -weakdeps = ["Dates"] - - [deps.InverseFunctions.extensions] - DatesExt = "Dates" - -[[deps.InvertedIndices]] -git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" -uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" -version = "1.3.0" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.2" - -[[deps.Isoband]] -deps = ["isoband_jll"] -git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" -uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" -version = "0.1.1" - -[[deps.IterTools]] -git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.10.0" - -[[deps.IterativeSolvers]] -deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] -git-tree-sha1 = "59545b0a2b27208b0650df0a46b8e3019f85055b" -uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" -version = "0.9.4" - -[[deps.IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[deps.JLD2]] -deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "PrecompileTools", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] -git-tree-sha1 = "5ea6acdd53a51d897672edb694e3cc2912f3f8a7" -uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.4.46" - -[[deps.JLLWrappers]] -deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" - -[[deps.JSON3]] -deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] -git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b" -uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" -version = "1.14.0" - - [deps.JSON3.extensions] - JSON3ArrowExt = ["ArrowTypes"] - - [deps.JSON3.weakdeps] - ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" - -[[deps.JpegTurbo]] -deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] -git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" -uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" -version = "0.1.5" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3336abae9a713d2210bb57ab484b1e065edd7d23" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.0.2+0" - -[[deps.JuliaNVTXCallbacks_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "af433a10f3942e882d3c671aacb203e006a5808f" -uuid = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e" -version = "0.2.1+0" - -[[deps.KernelAbstractions]] -deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "PrecompileTools", "Requires", "SparseArrays", "StaticArrays", "UUIDs", "UnsafeAtomics", "UnsafeAtomicsLLVM"] -git-tree-sha1 = "ed7167240f40e62d97c1f5f7735dea6de3cc5c49" -uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.9.18" - - [deps.KernelAbstractions.extensions] - EnzymeExt = "EnzymeCore" - - [deps.KernelAbstractions.weakdeps] - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - -[[deps.KernelDensity]] -deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "fee018a29b60733876eb557804b5b109dd3dd8a7" -uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.8" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.1+0" - -[[deps.LLVM]] -deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Requires", "Unicode"] -git-tree-sha1 = "839c82932db86740ae729779e610f07a1640be9a" -uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "6.6.3" -weakdeps = ["BFloat16s"] - - [deps.LLVM.extensions] - BFloat16sExt = "BFloat16s" - -[[deps.LLVMExtra_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "88b916503aac4fb7f701bb625cd84ca5dd1677bc" -uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.29+0" - -[[deps.LLVMLoopInfo]] -git-tree-sha1 = "2e5c102cfc41f48ae4740c7eca7743cc7e7b75ea" -uuid = "8b046642-f1f6-4319-8d3c-209ddc03c586" -version = "1.0.0" - -[[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" -uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "15.0.7+0" - -[[deps.LRUCache]] -git-tree-sha1 = "b3cc6698599b10e652832c2f23db3cab99d51b59" -uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" -version = "1.6.1" -weakdeps = ["Serialization"] - - [deps.LRUCache.extensions] - SerializationExt = ["Serialization"] - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.1+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.1" - -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" - -[[deps.LazyModules]] -git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" -uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" -version = "0.3.1" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.4.0+0" - -[[deps.LibGit2]] -deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] -uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.6.4+0" - -[[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.0+1" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.2+1" - -[[deps.Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] -git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.7+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.6.0+0" - -[[deps.Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.42.0+0" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.17.0+0" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "dae976433497a2f841baadea93d27e68f1a12a97" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.39.3+0" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0a04a1318df1bf510beb2562cf90fb0c386f58c4" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.39.3+1" - -[[deps.LightXML]] -deps = ["Libdl", "XML2_jll"] -git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" -uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" -version = "0.9.1" - -[[deps.LineSearches]] -deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] -git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" -uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" -version = "7.2.0" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[deps.LinearAlgebraX]] -deps = ["LinearAlgebra", "Mods", "Primes", "SimplePolynomials"] -git-tree-sha1 = "d76cec8007ec123c2b681269d40f94b053473fcf" -uuid = "9b3f67b0-2d00-526e-9884-9e4938f8fb88" -version = "0.2.7" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.27" - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - - [deps.LogExpFunctions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[deps.LoggingExtras]] -deps = ["Dates", "Logging"] -git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" -uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.0.3" - -[[deps.Lz4_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6c26c5e8a4203d43b5497be3ec5d4e0c3cde240a" -uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" -version = "1.9.4+0" - -[[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "72dc3cf284559eb8f53aa593fe62cb33f83ed0c0" -uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2024.0.0+0" - -[[deps.MPI]] -deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] -git-tree-sha1 = "b4d8707e42b693720b54f0b3434abee6dd4d947a" -uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" -version = "0.20.16" - - [deps.MPI.extensions] - AMDGPUExt = "AMDGPU" - CUDAExt = "CUDA" - - [deps.MPI.weakdeps] - AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - -[[deps.MPICH_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "656036b9ed6f942d35e536e249600bc31d0f9df8" -uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" -version = "4.2.0+0" - -[[deps.MPIPreferences]] -deps = ["Libdl", "Preferences"] -git-tree-sha1 = "8f6af051b9e8ec597fa09d8885ed79fd582f33c9" -uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" -version = "0.1.10" - -[[deps.MPItrampoline_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "77c3bd69fdb024d75af38713e883d0f249ce19c2" -uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" -version = "5.3.2+0" - -[[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.13" - -[[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun"] -git-tree-sha1 = "46ca613be7a1358fb93529726ea2fc28050d3ae0" -uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.20.9" - -[[deps.MakieCore]] -deps = ["Observables", "REPL"] -git-tree-sha1 = "248b7a4be0f92b497f7a331aed02c1e9a878f46b" -uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.7.3" - -[[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" -uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[deps.MathTeXEngine]] -deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] -git-tree-sha1 = "96ca8a313eb6437db5ffe946c457a401bbb8ce1d" -uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" -version = "0.5.7" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] -git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.9" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+1" - -[[deps.MeshIO]] -deps = ["ColorTypes", "FileIO", "GeometryBasics", "Printf"] -git-tree-sha1 = "8c26ab950860dfca6767f2bbd90fdf1e8ddc678b" -uuid = "7269a6da-0436-5bbc-96c2-40638cbb6118" -version = "0.4.11" - -[[deps.MicrosoftMPI_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f12a29c4400ba812841c6ace3f4efbb6dbb3ba01" -uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" -version = "10.1.4+2" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.1.0" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[deps.ModernGL]] -deps = ["Libdl"] -git-tree-sha1 = "b76ea40b5c0f45790ae09492712dd326208c28b2" -uuid = "66fc600b-dfda-50eb-8b99-91cfa97b1301" -version = "1.1.7" - -[[deps.Mods]] -git-tree-sha1 = "924f962b524a71eef7a21dae1e6853817f9b658f" -uuid = "7475f97c-0381-53b1-977b-4c60186c8d62" -version = "2.2.4" - -[[deps.MosaicViews]] -deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] -git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" -uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" -version = "0.3.4" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.1.10" - -[[deps.Multisets]] -git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" -uuid = "3b2b4ff1-bcff-5658-a3ee-dbcf1ce5ac09" -version = "0.4.4" - -[[deps.NCDatasets]] -deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] -git-tree-sha1 = "d40d24d12f710c39d3a66be99c567ce0032f28a7" -uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -version = "0.14.3" - -[[deps.NLSolversBase]] -deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] -git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" -uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" -version = "7.8.3" - -[[deps.NVTX]] -deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] -git-tree-sha1 = "53046f0483375e3ed78e49190f1154fa0a4083a1" -uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" -version = "0.3.4" - -[[deps.NVTX_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ce3269ed42816bf18d500c9f63418d4b0d9f5a3b" -uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" -version = "3.1.0+2" - -[[deps.NaNMath]] -deps = ["OpenLibm_jll"] -git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.0.2" - -[[deps.NetCDF_jll]] -deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "OpenMPI_jll", "XML2_jll", "Zlib_jll", "Zstd_jll", "libzip_jll"] -git-tree-sha1 = "a8af1798e4eb9ff768ce7fdefc0e957097793f15" -uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" -version = "400.902.209+0" - -[[deps.Netpbm]] -deps = ["FileIO", "ImageCore", "ImageMetadata"] -git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" -uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" -version = "1.1.1" - -[[deps.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.Observables]] -git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" -uuid = "510215fc-4207-5dde-b226-833fc4488ee2" -version = "0.5.5" - -[[deps.Oceananigans]] -deps = ["Adapt", "CUDA", "Crayons", "CubedSphere", "Dates", "Distances", "DocStringExtensions", "FFTW", "Glob", "IncompleteLU", "InteractiveUtils", "IterativeSolvers", "JLD2", "KernelAbstractions", "LinearAlgebra", "Logging", "MPI", "NCDatasets", "OffsetArrays", "OrderedCollections", "PencilArrays", "PencilFFTs", "Pkg", "Printf", "Random", "Rotations", "SeawaterPolynomials", "SparseArrays", "Statistics", "StructArrays"] -git-tree-sha1 = "4672af7242405313743af45168bfce3d87b84b2c" -uuid = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" -version = "0.90.11" - - [deps.Oceananigans.extensions] - OceananigansEnzymeExt = "Enzyme" - - [deps.Oceananigans.weakdeps] - Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" - -[[deps.OffsetArrays]] -git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.13.0" -weakdeps = ["Adapt"] - - [deps.OffsetArrays.extensions] - OffsetArraysAdaptExt = "Adapt" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+4" - -[[deps.OpenEXR]] -deps = ["Colors", "FileIO", "OpenEXR_jll"] -git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" -uuid = "52e1d378-f018-4a11-a4be-720524705ac7" -version = "0.3.2" - -[[deps.OpenEXR_jll]] -deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" -uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.1.4+0" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+2" - -[[deps.OpenMPI_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "PMIx_jll", "TOML", "Zlib_jll", "libevent_jll", "prrte_jll"] -git-tree-sha1 = "f46caf663e069027a06942d00dced37f1eb3d8ad" -uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "5.0.2+0" - -[[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "af81a32750ebc831ee28bdaaba6e1067decef51e" -uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.4.2" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.13+1" - -[[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.5+0" - -[[deps.Optim]] -deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] -git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89" -uuid = "429524aa-4258-5aef-a3af-852621145aeb" -version = "1.9.4" - - [deps.Optim.extensions] - OptimMOIExt = "MathOptInterface" - - [deps.Optim.weakdeps] - MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" - -[[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "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.PCRE2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+1" - -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.31" - -[[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.PNGFiles]] -deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] -git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" -uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" -version = "0.4.3" - -[[deps.PackageExtensionCompat]] -git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" -uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" -version = "1.0.2" -weakdeps = ["Requires", "TOML"] - -[[deps.Packing]] -deps = ["GeometryBasics"] -git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501" -uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" -version = "0.5.0" - -[[deps.PaddedViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" -uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" -version = "0.5.12" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" - -[[deps.Parsers]] -deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.1" - -[[deps.PencilArrays]] -deps = ["Adapt", "JSON3", "LinearAlgebra", "MPI", "OffsetArrays", "Random", "Reexport", "StaticArrayInterface", "StaticArrays", "StaticPermutations", "Strided", "TimerOutputs", "VersionParsing"] -git-tree-sha1 = "6510e851700a851944f7ffa5cd990cced4802ad2" -uuid = "0e08944d-e94e-41b1-9406-dcf66b6a9d2e" -version = "0.19.3" - - [deps.PencilArrays.extensions] - PencilArraysDiffEqExt = ["DiffEqBase"] - PencilArraysHDF5Ext = ["HDF5"] - - [deps.PencilArrays.weakdeps] - DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e" - HDF5 = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" - -[[deps.PencilFFTs]] -deps = ["AbstractFFTs", "FFTW", "LinearAlgebra", "MPI", "PencilArrays", "Reexport", "TimerOutputs"] -git-tree-sha1 = "bd69f3f0ee248cfb4241800aefb705b5ded592ff" -uuid = "4a48f351-57a6-4416-9ec4-c37015456aae" -version = "0.15.1" - -[[deps.Permutations]] -deps = ["Combinatorics", "LinearAlgebra", "Random"] -git-tree-sha1 = "eb3f9df2457819bf0a9019bd93cc451697a0751e" -uuid = "2ae35dd2-176d-5d53-8349-f30d82d94d4f" -version = "0.4.20" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.42.2+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.10.0" - -[[deps.PkgVersion]] -deps = ["Pkg"] -git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" -uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" -version = "0.3.3" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.1" - -[[deps.PolygonOps]] -git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" -uuid = "647866c9-e3ac-4575-94e7-e3d426903924" -version = "0.1.2" - -[[deps.Polynomials]] -deps = ["LinearAlgebra", "RecipesBase", "Setfield", "SparseArrays"] -git-tree-sha1 = "a9c7a523d5ed375be3983db190f6a5874ae9286d" -uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" -version = "4.0.6" - - [deps.Polynomials.extensions] - PolynomialsChainRulesCoreExt = "ChainRulesCore" - PolynomialsFFTWExt = "FFTW" - PolynomialsMakieCoreExt = "MakieCore" - PolynomialsMutableArithmeticsExt = "MutableArithmetics" - - [deps.Polynomials.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" - MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" - MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" - -[[deps.PooledArrays]] -deps = ["DataAPI", "Future"] -git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" -uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" -version = "1.4.3" - -[[deps.PositiveFactorizations]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" -uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" -version = "0.2.4" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.1" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.3" - -[[deps.PrettyTables]] -deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "Reexport", "StringManipulation", "Tables"] -git-tree-sha1 = "88b895d13d53b5577fd53379d913b9ab9ac82660" -uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" -version = "2.3.1" - -[[deps.Primes]] -deps = ["IntegerMathUtils"] -git-tree-sha1 = "cb420f77dc474d23ee47ca8d14c90810cafe69e7" -uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" -version = "0.5.6" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.ProgressBars]] -deps = ["Printf"] -git-tree-sha1 = "b437cdb0385ed38312d91d9c00c20f3798b30256" -uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" -version = "1.5.1" - -[[deps.ProgressMeter]] -deps = ["Distributed", "Printf"] -git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" -uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.10.0" - -[[deps.QOI]] -deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] -git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" -uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.0" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.9.4" - -[[deps.Quaternions]] -deps = ["LinearAlgebra", "Random", "RealDot"] -git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" -uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" -version = "0.7.6" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[deps.Random]] -deps = ["SHA"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[deps.Random123]] -deps = ["Random", "RandomNumbers"] -git-tree-sha1 = "4743b43e5a9c4a2ede372de7061eed81795b12e7" -uuid = "74087812-796a-5b5d-8853-05524746bad3" -version = "1.7.0" - -[[deps.RandomNumbers]] -deps = ["Random", "Requires"] -git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" -uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" -version = "1.5.3" - -[[deps.RangeArrays]] -git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" -uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" -version = "0.3.2" - -[[deps.Ratios]] -deps = ["Requires"] -git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" -uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" -version = "0.4.5" -weakdeps = ["FixedPointNumbers"] - - [deps.Ratios.extensions] - RatiosFixedPointNumbersExt = "FixedPointNumbers" - -[[deps.RealDot]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" -uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" -version = "0.1.0" - -[[deps.RecipesBase]] -deps = ["PrecompileTools"] -git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.3.4" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.0" - -[[deps.RingLists]] -deps = ["Random"] -git-tree-sha1 = "f39da63aa6d2d88e0c1bd20ed6a3ff9ea7171ada" -uuid = "286e9d63-9694-5540-9e3c-4e6708fa07b2" -version = "0.2.8" - -[[deps.Rmath]] -deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.7.1" - -[[deps.Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.4.0+0" - -[[deps.RootSolvers]] -deps = ["ForwardDiff"] -git-tree-sha1 = "a87fd671f7a298de98f2f3c5a9cd9890714eb9dd" -uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" -version = "0.4.2" - -[[deps.Roots]] -deps = ["Accessors", "ChainRulesCore", "CommonSolve", "Printf"] -git-tree-sha1 = "1ab580704784260ee5f45bffac810b152922747b" -uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" -version = "2.1.5" - - [deps.Roots.extensions] - RootsForwardDiffExt = "ForwardDiff" - RootsIntervalRootFindingExt = "IntervalRootFinding" - RootsSymPyExt = "SymPy" - RootsSymPyPythonCallExt = "SymPyPythonCall" - - [deps.Roots.weakdeps] - ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" - IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" - SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" - SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" - -[[deps.Rotations]] -deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] -git-tree-sha1 = "2a0a5d8569f481ff8840e3b7c84bbf188db6a3fe" -uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.7.0" -weakdeps = ["RecipesBase"] - - [deps.Rotations.extensions] - RotationsRecipesBaseExt = "RecipesBase" - -[[deps.RoundingEmulator]] -git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" -uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" -version = "0.2.1" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.2.1" - -[[deps.SeawaterPolynomials]] -git-tree-sha1 = "6d85acd6de472f8e6da81c61c7c5b6280a55e0bc" -uuid = "d496a93d-167e-4197-9f49-d3af4ff8fe40" -version = "0.3.4" - -[[deps.SentinelArrays]] -deps = ["Dates", "Random"] -git-tree-sha1 = "0e7508ff27ba32f26cd459474ca2ede1bc10991f" -uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" -version = "1.4.1" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[deps.SetRounding]] -git-tree-sha1 = "d7a25e439d07a17b7cdf97eecee504c50fedf5f6" -uuid = "3cc68bcd-71a2-5612-b932-767ffbe40ab0" -version = "0.2.1" - -[[deps.Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] -git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "1.1.1" - -[[deps.ShaderAbstractions]] -deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" -uuid = "65257c39-d410-5151-9873-9b3e5be5013e" -version = "0.4.1" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SignedDistanceFields]] -deps = ["Random", "Statistics", "Test"] -git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" -uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.0" - -[[deps.SimpleBufferStream]] -git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" -uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.1.0" - -[[deps.SimpleGraphs]] -deps = ["AbstractLattices", "Combinatorics", "DataStructures", "IterTools", "LightXML", "LinearAlgebra", "LinearAlgebraX", "Optim", "Primes", "Random", "RingLists", "SimplePartitions", "SimplePolynomials", "SimpleRandom", "SparseArrays", "Statistics"] -git-tree-sha1 = "f65caa24a622f985cc341de81d3f9744435d0d0f" -uuid = "55797a34-41de-5266-9ec1-32ac4eb504d3" -version = "0.8.6" - -[[deps.SimplePartitions]] -deps = ["AbstractLattices", "DataStructures", "Permutations"] -git-tree-sha1 = "e182b9e5afb194142d4668536345a365ea19363a" -uuid = "ec83eff0-a5b5-5643-ae32-5cbf6eedec9d" -version = "0.3.2" - -[[deps.SimplePolynomials]] -deps = ["Mods", "Multisets", "Polynomials", "Primes"] -git-tree-sha1 = "7063828369cafa93f3187b3d0159f05582011405" -uuid = "cc47b68c-3164-5771-a705-2bc0097375a0" -version = "0.2.17" - -[[deps.SimpleRandom]] -deps = ["Distributions", "LinearAlgebra", "Random"] -git-tree-sha1 = "3a6fb395e37afab81aeea85bae48a4db5cd7244a" -uuid = "a6525b86-64cd-54fa-8f65-62fc48bdc0e8" -version = "0.3.1" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" - -[[deps.Sixel]] -deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] -git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" -uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" -version = "0.1.3" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.1" - -[[deps.SparseArrays]] -deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.10.0" - -[[deps.SpecialFunctions]] -deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "e2cfc4012a19088254b3950b85c3c1d8882d864d" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.3.1" -weakdeps = ["ChainRulesCore"] - - [deps.SpecialFunctions.extensions] - SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" - -[[deps.StackViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" -uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" -version = "0.1.1" - -[[deps.Static]] -deps = ["IfElse"] -git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" -uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.8.10" - -[[deps.StaticArrayInterface]] -deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] -git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" -uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" -version = "1.5.0" -weakdeps = ["OffsetArrays", "StaticArrays"] - - [deps.StaticArrayInterface.extensions] - StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" - StaticArrayInterfaceStaticArraysExt = "StaticArrays" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.3" -weakdeps = ["ChainRulesCore", "Statistics"] - - [deps.StaticArrays.extensions] - StaticArraysChainRulesCoreExt = "ChainRulesCore" - StaticArraysStatisticsExt = "Statistics" - -[[deps.StaticArraysCore]] -git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" -uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.2" - -[[deps.StaticPermutations]] -git-tree-sha1 = "193c3daa18ff3e55c1dae66acb6a762c4a3bdb0b" -uuid = "15972242-4b8f-49a0-b8a1-9ac0e7a1a45d" -version = "0.3.0" - -[[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.10.0" - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.0" - -[[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.3" - -[[deps.StatsFuns]] -deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.3.1" -weakdeps = ["ChainRulesCore", "InverseFunctions"] - - [deps.StatsFuns.extensions] - StatsFunsChainRulesCoreExt = "ChainRulesCore" - StatsFunsInverseFunctionsExt = "InverseFunctions" - -[[deps.Strided]] -deps = ["LinearAlgebra", "StridedViews", "TupleTools"] -git-tree-sha1 = "40c69be0e1b72ee2f42923b7d1ff13e0b04e675c" -uuid = "5e0ebb24-38b0-5f93-81fe-25c709ecae67" -version = "2.0.4" - -[[deps.StridedViews]] -deps = ["LinearAlgebra", "PackageExtensionCompat"] -git-tree-sha1 = "5b765c4e401693ab08981989f74a36a010aa1d8e" -uuid = "4db3bf67-4bd7-4b4e-b153-31dc3fb37143" -version = "0.2.2" -weakdeps = ["CUDA"] - - [deps.StridedViews.extensions] - StridedViewsCUDAExt = "CUDA" - -[[deps.StringManipulation]] -deps = ["PrecompileTools"] -git-tree-sha1 = "a04cabe79c5f01f4d723cc6704070ada0b9d46d5" -uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" -version = "0.3.4" - -[[deps.StructArrays]] -deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.18" -weakdeps = ["Adapt", "GPUArraysCore", "SparseArrays", "StaticArrays"] - - [deps.StructArrays.extensions] - StructArraysAdaptExt = "Adapt" - StructArraysGPUArraysCoreExt = "GPUArraysCore" - StructArraysSparseArraysExt = "SparseArrays" - StructArraysStaticArraysExt = "StaticArrays" - -[[deps.StructTypes]] -deps = ["Dates", "UUIDs"] -git-tree-sha1 = "ca4bccb03acf9faaf4137a9abc1881ed1841aa70" -uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" -version = "1.10.0" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.2.1+1" - -[[deps.SurfaceFluxes]] -deps = ["DocStringExtensions", "RootSolvers", "Thermodynamics"] -git-tree-sha1 = "c2c43206af0d861e018f746286d1af036aa7bc3a" -repo-rev = "glw/generalize-parameters" -repo-url = "https://github.com/glwagner/SurfaceFluxes.jl.git" -uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" -version = "0.9.2" - - [deps.SurfaceFluxes.extensions] - CreateParametersExt = "CLIMAParameters" - - [deps.SurfaceFluxes.weakdeps] - CLIMAParameters = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[deps.TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[deps.Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.11.1" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.0" - -[[deps.TaylorSeries]] -deps = ["LinearAlgebra", "Markdown", "Requires", "SparseArrays"] -git-tree-sha1 = "1c7170668366821b0c4c4fe03ee78f8d6cf36e2c" -uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" -version = "0.16.0" -weakdeps = ["IntervalArithmetic"] - - [deps.TaylorSeries.extensions] - TaylorSeriesIAExt = "IntervalArithmetic" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.Thermodynamics]] -deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"] -git-tree-sha1 = "deac04ad36638b10fde82470d5f128419f627e9a" -uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" -version = "0.12.6" - - [deps.Thermodynamics.extensions] - CreateParametersExt = "ClimaParams" - - [deps.Thermodynamics.weakdeps] - ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c" - -[[deps.TiffImages]] -deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] -git-tree-sha1 = "34cc045dd0aaa59b8bbe86c644679bc57f1d5bd0" -uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" -version = "0.6.8" - -[[deps.TimerOutputs]] -deps = ["ExprTools", "Printf"] -git-tree-sha1 = "f548a9e9c490030e545f72074a41edfd0e5bcdd7" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.23" - -[[deps.TranscodingStreams]] -git-tree-sha1 = "71509f04d045ec714c4748c785a59045c3736349" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.10.7" -weakdeps = ["Random", "Test"] - - [deps.TranscodingStreams.extensions] - TestExt = ["Test", "Random"] - -[[deps.TriplotBase]] -git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" -uuid = "981d1d27-644d-49a2-9326-4793e63143c3" -version = "0.1.0" - -[[deps.TupleTools]] -git-tree-sha1 = "41d61b1c545b06279871ef1a4b5fcb2cac2191cd" -uuid = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" -version = "1.5.0" - -[[deps.URIs]] -git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.5.1" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[deps.UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.UnsafeAtomics]] -git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" -uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" -version = "0.2.1" - -[[deps.UnsafeAtomicsLLVM]] -deps = ["LLVM", "UnsafeAtomics"] -git-tree-sha1 = "323e3d0acf5e78a56dfae7bd8928c989b4f3083e" -uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" -version = "0.1.3" - -[[deps.VersionParsing]] -git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868" -uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" -version = "1.3.0" - -[[deps.WoodburyMatrices]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" -uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.12.6+0" - -[[deps.XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.34+0" - -[[deps.XZ_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" -uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.4.6+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.6+0" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.11+0" - -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.0+4" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.4+0" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.4+4" - -[[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "5.0.3+4" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.7.10+4" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] -git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.4+4" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.2+4" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.10+4" - -[[deps.Xorg_libpthread_stubs_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" -uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" -version = "0.1.1+0" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.15.0+0" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.5.0+0" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+1" - -[[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.6+0" - -[[deps.isoband_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" -uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" -version = "0.2.3+0" - -[[deps.libaec_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "46bf7be2917b59b761247be3f317ddf75e50e997" -uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" -version = "1.1.2+0" - -[[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" -uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.4.0+0" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.1+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" - -[[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.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.2+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.43+1" - -[[deps.libsixel_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] -git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" -uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" -version = "1.10.3+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+1" - -[[deps.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"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.52.0+1" - -[[deps.p7zip_jll]] -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" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" diff --git a/experiments/prototype_omip_simulation/Project.toml b/experiments/prototype_omip_simulation/Project.toml deleted file mode 100644 index 7744d52a..00000000 --- a/experiments/prototype_omip_simulation/Project.toml +++ /dev/null @@ -1,19 +0,0 @@ -[deps] -CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" -ClimaOcean = "0376089a-ecfe-4b0e-a64f-9c555d74d754" -ClimaSeaIce = "6ba0ff68-24e6-4315-936c-2e99227c95a4" -Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" -Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -GLMakie = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a" -JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" -Oceananigans = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" -SeawaterPolynomials = "d496a93d-167e-4197-9f49-d3af4ff8fe40" -Thermodynamics = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" - -[compat] -GLMakie = "0.9" -Oceananigans = "0.90.10" -SeawaterPolynomials = "0.3.4" -Thermodynamics = "0.12.6" diff --git a/experiments/prototype_omip_simulation/regional_omip_simulation.jl b/experiments/prototype_omip_simulation/regional_omip_simulation.jl deleted file mode 100644 index bf9bce40..00000000 --- a/experiments/prototype_omip_simulation/regional_omip_simulation.jl +++ /dev/null @@ -1,174 +0,0 @@ -using Oceananigans -using Oceananigans.Architectures: arch_array -using Oceananigans.Units -using Oceananigans.BuoyancyModels: buoyancy_frequency -using Oceananigans.Units: Time - -using ClimaOcean -using ClimaOcean.OceanSeaIceModels: Radiation, FreezingLimitedOceanTemperature -using ClimaOcean.DataWrangling.JRA55: JRA55_prescribed_atmosphere, JRA55NetCDFBackend -using ClimaOcean.DataWrangling.ECCO2: ecco2_field - -using ClimaSeaIce: LinearLiquidus - -# using GLMakie -using Printf -using Dates - -start_time = time_ns() - -include("omip_components.jl") - -arch = CPU() - -##### -##### Construct initial conditions + grid -##### - -epoch = Date(1992, 1, 1) -date = Date(1992, 1, 2) -start_seconds = Second(date - epoch).value -Te = ecco2_field(:temperature, date, architecture=arch) - -latitude = (-75, -70) -grid, Tᵢ = regional_omip_grid(arch, Te; latitude) - -backend = JRA55NetCDFBackend(8) # InMemory(8) -atmosphere = JRA55_prescribed_atmosphere(arch, 1:56; backend) -radiation = Radiation() - -#closure = RiBasedVerticalDiffusivity(maximum_diffusivity=1e2, maximum_viscosity=1e2) -#closure = RiBasedVerticalDiffusivity() -closure = :default -ocean = omip_ocean_component(grid; closure) -@show size(Tᵢ) ocean.model.grid -set!(ocean.model, T=Tᵢ) #, S=Sᵢ) - -Se = ecco2_field(:salinity, date, architecture=arch) -interpolate!(ocean.model.tracers.S, Se) - -if :e ∈ keys(ocean.model.tracers) - set!(ocean.model, e=1e-6) -end - -sea_ice = FreezingLimitedOceanTemperature(LinearLiquidus(eltype(grid))) - -coupled_model = OceanSeaIceModel(ocean, sea_ice; atmosphere, radiation) -coupled_model.clock.time = start_seconds -stop_time = start_seconds + 30days -coupled_simulation = Simulation(coupled_model, Δt=5minutes, stop_time=stop_time) - -elapsed = 1e-9 * (time_ns() - start_time) -@info string("Coupled simulation built ", prettytime(elapsed), ".") -start_time = time_ns() - -wall_clock = Ref(time_ns()) - -# Hm... - -function clip_diffusivity(coupled_simulation) - ocean_model = coupled_simulation.model.ocean.model - κᶜ = parent(ocean_model.diffusivity_fields.κᶜ) - κᵘ = parent(ocean_model.diffusivity_fields.κᵘ) - @. κᶜ = min(κᶜ, 100) - @. κᵘ = min(κᵘ, 100) - return nothing -end - -coupled_simulation.callbacks[:clip] = Callback(clip_diffusivity) - -##### -##### Progress -##### - -Jᵘ = coupled_model.fluxes.total.ocean.momentum.u -Jᵛ = coupled_model.fluxes.total.ocean.momentum.v -Jᵀ = coupled_model.fluxes.total.ocean.tracers.T -Jˢ = coupled_model.fluxes.total.ocean.tracers.S -Fv = coupled_model.fluxes.turbulent.fields.water_vapor -Qc = coupled_model.fluxes.turbulent.fields.sensible_heat -Qv = coupled_model.fluxes.turbulent.fields.latent_heat -ρₒ = coupled_model.fluxes.ocean_reference_density -cₚ = coupled_model.fluxes.ocean_heat_capacity - -import Oceananigans.Fields: reduced_dimensions -reduced_dimensions(::Oceananigans.AbstractOperations.BinaryOperation) = tuple(3) - -ΣQ = ρₒ * cₚ * Jᵀ -τˣ = ρₒ * Jᵘ -τʸ = ρₒ * Jᵛ -N² = buoyancy_frequency(ocean.model) -κᶜ = ocean.model.diffusivity_fields.κᶜ - -function progress(sim) - msg = string("Iter: ", iteration(sim), ", time: ", prettytime(sim)) - - elapsed = 1e-9 * (time_ns() - wall_clock[]) - msg *= string(", wall time: ", prettytime(elapsed)) - wall_clock[] = time_ns() - - u, v, w = sim.model.ocean.model.velocities - msg *= @sprintf(", max|u|: (%.2e, %.2e)", maximum(abs, u), maximum(abs, v)) - - T = sim.model.ocean.model.tracers.T - S = sim.model.ocean.model.tracers.S - - msg *= @sprintf(", extrema(T): (%.2f, %.2f) ᵒC", minimum(T), maximum(T)) - msg *= @sprintf(", extrema(S): (%.2f, %.2f) g kg⁻¹", minimum(S), maximum(S)) - msg *= @sprintf(", max|τ|: (%.2e, %.2e) N m⁻²", maximum(τˣ), maximum(τʸ)) - msg *= @sprintf(", max|Qv|: %.2e W m⁻²", maximum(Qv)) - msg *= @sprintf(", max|Qc|: %.2e W m⁻²", maximum(Qc)) - msg *= @sprintf(", extrema(ΣQ): (%.2e, %.2e) W m⁻²", minimum(ΣQ), maximum(ΣQ)) - msg *= @sprintf(", extrema(Fv): (%.2e, %.2e) kg s⁻¹ m⁻²", minimum(Fv), maximum(Fv)) - msg *= @sprintf(", extrema(κᶜ): (%.2e, %.2e) m² s⁻¹", minimum(κᶜ), maximum(κᶜ)) - - #e = sim.model.ocean.model.tracers.e - #msg *= @sprintf(", extrema(e): (%.2f, %.2f) m² s⁻²", minimum(e), maximum(e)) - - @info msg -end - -coupled_simulation.callbacks[:progress] = Callback(progress, IterationInterval(10)) - -run!(coupled_simulation) - -#= -# Build flux outputs -Jᵘ = coupled_model.fluxes.total.ocean.momentum.u -Jᵛ = coupled_model.fluxes.total.ocean.momentum.v -Jᵀ = coupled_model.fluxes.total.ocean.tracers.T -Jˢ = coupled_model.fluxes.total.ocean.tracers.S -Fv = coupled_model.fluxes.turbulent.fields.freshwater -Qc = coupled_model.fluxes.turbulent.fields.sensible_heat -Qv = coupled_model.fluxes.turbulent.fields.latent_heat -ρₒ = coupled_model.fluxes.ocean_reference_density -cₚ = coupled_model.fluxes.ocean_heat_capacity - -ΣQ = ρₒ * cₚ * Jᵀ -τˣ = ρₒ * Jᵘ -τʸ = ρₒ * Jᵛ -N² = buoyancy_frequency(ocean.model) -κᶜ = ocean.model.diffusivity_fields.κᶜ - -fluxes = (; τˣ, τʸ, Fv, Jˢ, ΣQ, Qc, Qv) - -auxiliary_fields = (; N², κᶜ) -fields = merge(ocean.model.velocities, ocean.model.tracers, auxiliary_fields) - -# Slice fields at the surface -outputs = merge(fields, fluxes) - -filename = "regional_omip_simulation" - -coupled_simulation.output_writers[:fluxes] = JLD2OutputWriter(ocean.model, fluxes; - filename = filename * "_fluxes", - schedule = TimeInterval(1days), - overwrite_existing = true) - -coupled_simulation.output_writers[:fields] = JLD2OutputWriter(ocean.model, fields; - filename = filename * "_fields", - indices = (:, :, Nz), - schedule = TimeInterval(1days), - overwrite_existing = true) - -=# diff --git a/docs/Manifest.toml b/prototype_omip_simulation/Manifest.toml similarity index 66% rename from docs/Manifest.toml rename to prototype_omip_simulation/Manifest.toml index 60dfad2c..2c4f18be 100644 --- a/docs/Manifest.toml +++ b/prototype_omip_simulation/Manifest.toml @@ -1,8 +1,8 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.2" +julia_version = "1.10.3" manifest_format = "2.0" -project_hash = "2b1abab6f384a62f893ca939d86c6775549fc57e" +project_hash = "ad94f0873a50599743724c16c7dfb94779a2964d" [[deps.ANSIColoredPrinters]] git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" @@ -20,16 +20,32 @@ weakdeps = ["ChainRulesCore", "Test"] AbstractFFTsChainRulesCoreExt = "ChainRulesCore" AbstractFFTsTestExt = "Test" -[[deps.AbstractLattices]] -git-tree-sha1 = "222ee9e50b98f51b5d78feb93dd928880df35f06" -uuid = "398f06c4-4d28-53ec-89ca-5b2656b7603d" -version = "0.3.0" - [[deps.AbstractTrees]] git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" version = "0.4.5" +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown", "Test"] +git-tree-sha1 = "c0d491ef0b135fd7d63cbc6404286bc633329425" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.36" + + [deps.Accessors.extensions] + AccessorsAxisKeysExt = "AxisKeys" + AccessorsIntervalSetsExt = "IntervalSets" + AccessorsStaticArraysExt = "StaticArrays" + AccessorsStructArraysExt = "StructArrays" + AccessorsUnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + [[deps.Adapt]] deps = ["LinearAlgebra", "Requires"] git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" @@ -40,26 +56,21 @@ weakdeps = ["StaticArrays"] [deps.Adapt.extensions] AdaptStaticArraysExt = "StaticArrays" -[[deps.Animations]] -deps = ["Colors"] -git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d" -uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" -version = "0.4.1" - [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" version = "1.1.1" [[deps.ArrayInterface]] deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "44691067188f6bd1b2289552a23e4b7572f4528d" +git-tree-sha1 = "133a240faec6e074e07c31ee75619c90544179cf" uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.9.0" +version = "7.10.0" [deps.ArrayInterface.extensions] ArrayInterfaceBandedMatricesExt = "BandedMatrices" ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = "CUDSS" ArrayInterfaceChainRulesExt = "ChainRules" ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" ArrayInterfaceReverseDiffExt = "ReverseDiff" @@ -70,6 +81,7 @@ 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" @@ -85,24 +97,6 @@ git-tree-sha1 = "c06a868224ecba914baa6942988e2f2aade419be" uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" version = "0.1.0" -[[deps.Automa]] -deps = ["PrecompileTools", "TranscodingStreams"] -git-tree-sha1 = "588e0d680ad1d7201d4c6a804dcb1cd9cba79fbb" -uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" -version = "1.0.3" - -[[deps.AxisAlgorithms]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] -git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" -uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" -version = "1.1.0" - -[[deps.AxisArrays]] -deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" -uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.4.7" - [[deps.BFloat16s]] deps = ["LinearAlgebra", "Printf", "Random", "Test"] git-tree-sha1 = "2c7cc21e8678eff479978a0a2ef5ce2f51b63dff" @@ -117,6 +111,12 @@ git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" version = "0.1.8" +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.5" + [[deps.Blosc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] git-tree-sha1 = "19b98ee7e3db3b4eff74c5c9c72bf32144e24f10" @@ -140,26 +140,17 @@ git-tree-sha1 = "5afb5c5ba2688ca43a9ad2e5a91cbb93921ccfa1" uuid = "179af706-886a-5703-950a-314cd64e0468" version = "0.1.3" -[[deps.CRC32c]] -uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" - -[[deps.CRlibm]] -deps = ["CRlibm_jll"] -git-tree-sha1 = "32abd86e3c2025db5172aa182b982debed519834" -uuid = "96374032-68de-5a5b-8d9e-752f78720389" -version = "1.0.1" - -[[deps.CRlibm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" -uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" -version = "1.0.1+0" +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] +git-tree-sha1 = "601f7e7b3d36f18790e2caf83a882d88e9b71ff1" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.4" [[deps.CUDA]] deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "DataFrames", "ExprTools", "GPUArrays", "GPUCompiler", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "StaticArrays", "Statistics"] -git-tree-sha1 = "baa8ea7a1ea63316fa3feb454635215773c9c845" +git-tree-sha1 = "dd1c682b372b6791b69f6823afe364fc92a0146c" uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "5.2.0" +version = "5.3.1" weakdeps = ["ChainRulesCore", "SpecialFunctions"] [deps.CUDA.extensions] @@ -168,33 +159,21 @@ weakdeps = ["ChainRulesCore", "SpecialFunctions"] [[deps.CUDA_Driver_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "d01bfc999768f0a31ed36f5d22a76161fc63079c" +git-tree-sha1 = "dc172b558adbf17952001e15cf0d6364e6d78c2f" uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" -version = "0.7.0+1" +version = "0.8.1+0" [[deps.CUDA_Runtime_Discovery]] deps = ["Libdl"] -git-tree-sha1 = "2cb12f6b2209f40a4b8967697689a47c50485490" +git-tree-sha1 = "38f830504358e9972d2a0c3e5d51cb865e0733df" uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" -version = "0.2.3" +version = "0.2.4" [[deps.CUDA_Runtime_jll]] deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "8e25c009d2bf16c2c31a70a6e9e8939f7325cc84" +git-tree-sha1 = "4ca7d6d92075906c2ce871ea8bba971fff20d00c" uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" -version = "0.11.1+0" - -[[deps.Cairo]] -deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] -git-tree-sha1 = "d0b3f8b4ad16cb0a2988c6788646a5e6a17b6b1b" -uuid = "159f3aea-2a34-519c-b102-8c37f9878175" -version = "1.0.5" - -[[deps.CairoMakie]] -deps = ["Base64", "Cairo", "Colors", "FFTW", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools", "SHA"] -git-tree-sha1 = "5e21a254d82c64b1a4ed9dbdc7e87c5d9cf4a686" -uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.10.12" +version = "0.12.1+0" [[deps.Cairo_jll]] deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] @@ -202,12 +181,6 @@ git-tree-sha1 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf" uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" version = "1.18.0+1" -[[deps.Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" @@ -218,29 +191,37 @@ weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] ChainRulesCoreSparseArraysExt = "SparseArrays" +[[deps.ClimaOcean]] +deps = ["Adapt", "CUDA", "ClimaSeaIce", "CubicSplines", "DataDeps", "Dates", "Downloads", "FFMPEG", "ImageMorphology", "JLD2", "JSON3", "KernelAbstractions", "NCDatasets", "Oceananigans", "Printf", "SeawaterPolynomials", "StaticArrays", "Statistics", "SurfaceFluxes", "Thermodynamics"] +path = ".." +uuid = "0376089a-ecfe-4b0e-a64f-9c555d74d754" +version = "0.2.0" + +[[deps.ClimaSeaIce]] +deps = ["Adapt", "KernelAbstractions", "Oceananigans", "RootSolvers", "Roots", "SeawaterPolynomials"] +git-tree-sha1 = "e25e43451edd449c3dcc899bd447983d7b76a59f" +repo-rev = "main" +repo-url = "https://github.com/CliMA/ClimaSeaIce.jl.git" +uuid = "6ba0ff68-24e6-4315-936c-2e99227c95a4" +version = "0.1.0" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.12" + [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" version = "0.7.4" -[[deps.ColorBrewer]] -deps = ["Colors", "JSON", "Test"] -git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4" -uuid = "a2cac450-b92f-5266-8821-25eda20663c8" -version = "0.4.0" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "67c1f244b991cad9b0aa4b7540fb758c2488b129" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.24.0" - [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "eb7f0f8307f71fac7c606984ea5fb2817275d6e4" +git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.4" +version = "0.11.5" [[deps.ColorVectorSpace]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] @@ -258,17 +239,17 @@ git-tree-sha1 = "fc08e5930ee9a4e03f84bfb5211cb54e7769758a" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" version = "0.12.10" -[[deps.Combinatorics]] -git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" -uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" -version = "1.0.2" - [[deps.CommonDataModel]] deps = ["CFTime", "DataStructures", "Dates", "Preferences", "Printf", "Statistics"] git-tree-sha1 = "d7d7b58e149f19c322840a50d1bc20e8c23addb4" uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" version = "0.3.5" +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + [[deps.CommonSubexpressions]] deps = ["MacroTools", "Test"] git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" @@ -288,7 +269,16 @@ 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.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" [[deps.ConcurrentUtilities]] deps = ["Serialization", "Sockets"] @@ -301,16 +291,20 @@ deps = ["LinearAlgebra"] git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" version = "1.5.5" -weakdeps = ["IntervalSets", "StaticArrays"] [deps.ConstructionBase.extensions] ConstructionBaseIntervalSetsExt = "IntervalSets" ConstructionBaseStaticArraysExt = "StaticArrays" -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" [[deps.Crayons]] git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" @@ -323,6 +317,12 @@ git-tree-sha1 = "10134667d7d3569b191a65801514271b8a93b292" uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" version = "0.2.5" +[[deps.CubicSplines]] +deps = ["Random", "Test"] +git-tree-sha1 = "4875023d456ea37c581f406b8b1bc35bea95ae67" +uuid = "9c784101-8907-5a6d-9be6-98f00873c89b" +version = "0.2.1" + [[deps.DataAPI]] git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" @@ -342,9 +342,9 @@ version = "1.6.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.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -355,12 +355,6 @@ version = "1.0.0" deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -[[deps.DelaunayTriangulation]] -deps = ["DataStructures", "EnumX", "ExactPredicates", "Random", "SimpleGraphs"] -git-tree-sha1 = "d4e9dc4c6106b8d44e40cd4faf8261a678552c7c" -uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "0.8.12" - [[deps.DiffResults]] deps = ["StaticArraysCore"] git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" @@ -394,72 +388,34 @@ weakdeps = ["ChainRulesCore", "SparseArrays"] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" -[[deps.Distributions]] -deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "7c302d7a5fec5214eb8a5a4c466dcf7a51fcf169" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.107" - - [deps.Distributions.extensions] - DistributionsChainRulesCoreExt = "ChainRulesCore" - DistributionsDensityInterfaceExt = "DensityInterface" - DistributionsTestExt = "Test" - - [deps.Distributions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" - Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - [[deps.DocStringExtensions]] deps = ["LibGit2"] -git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" +git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.3" +version = "0.8.6" [[deps.Documenter]] deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "CodecZlib", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "TOML", "Test", "Unicode"] -git-tree-sha1 = "4a40af50e8b24333b9ec6892546d9ca5724228eb" +git-tree-sha1 = "f15a91e6e3919055efa4f206f942a73fedf5dfe6" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "1.3.0" +version = "1.4.0" + +[[deps.DocumenterTools]] +deps = ["Base64", "DocStringExtensions", "LibGit2"] +git-tree-sha1 = "58db9d1c626de92318ee35cbaf466739f4b5a09a" +uuid = "35a29f4d-8980-5a13-9543-d66fff28ecb8" +version = "0.1.2" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" version = "1.6.0" -[[deps.DualNumbers]] -deps = ["Calculus", "NaNMath", "SpecialFunctions"] -git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" -uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" -version = "0.6.8" - -[[deps.EarCut_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" -uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" -version = "2.2.4+0" - [[deps.Elliptic]] git-tree-sha1 = "71c79e77221ab3a29918aaf6db4f217b89138608" uuid = "b305315f-e792-5b7a-8f41-49f472929428" version = "1.0.1" -[[deps.EnumX]] -git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" -uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.4" - -[[deps.ErrorfreeArithmetic]] -git-tree-sha1 = "d6863c556f1142a061532e79f611aa46be201686" -uuid = "90fa49ef-747e-5e6f-a989-263ba693cf1a" -version = "0.5.2" - -[[deps.ExactPredicates]] -deps = ["IntervalArithmetic", "Random", "StaticArraysCore", "Test"] -git-tree-sha1 = "276e83bc8b21589b79303b9985c321024ffdf59c" -uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" -version = "2.2.5" - [[deps.ExceptionUnwrapping]] deps = ["Test"] git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" @@ -477,16 +433,17 @@ git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" version = "0.1.10" -[[deps.Extents]] -git-tree-sha1 = "2140cd04483da90b2da7f99b2add0750504fc39c" -uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" -version = "0.1.2" +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" [[deps.FFMPEG_jll]] deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "ab3f7e1819dba9434a3a5126510c8fda3a4e7000" +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "6.1.1+0" +version = "4.4.4+1" [[deps.FFTW]] deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] @@ -500,12 +457,6 @@ git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" version = "3.3.10+0" -[[deps.FastRounding]] -deps = ["ErrorfreeArithmetic", "LinearAlgebra"] -git-tree-sha1 = "6344aa18f654196be82e62816935225b3b9abe44" -uuid = "fa42c844-2597-5d31-933b-ebd51ab2693f" -version = "0.3.1" - [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322" @@ -515,34 +466,6 @@ version = "1.16.3" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" -[[deps.FillArrays]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "bfe82a708416cf00b73a3198db0859c82f741558" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.10.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] - - [deps.FillArrays.extensions] - FillArraysPDMatsExt = "PDMats" - FillArraysSparseArraysExt = "SparseArrays" - FillArraysStatisticsExt = "Statistics" - -[[deps.FiniteDiff]] -deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "bc0c5092d6caaea112d3c8e3b238d61563c58d5f" -uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.23.0" - - [deps.FiniteDiff.extensions] - FiniteDiffBandedMatricesExt = "BandedMatrices" - FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" - FiniteDiffStaticArraysExt = "StaticArrays" - - [deps.FiniteDiff.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - [[deps.FixedPointNumbers]] deps = ["Statistics"] git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" @@ -555,12 +478,6 @@ git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" version = "2.13.93+0" -[[deps.Formatting]] -deps = ["Logging", "Printf"] -git-tree-sha1 = "fb409abab2caf118986fc597ba84b50cbaf00b87" -uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" -version = "0.4.3" - [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" @@ -571,24 +488,12 @@ weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] ForwardDiffStaticArraysExt = "StaticArrays" -[[deps.FreeType]] -deps = ["CEnum", "FreeType2_jll"] -git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" -uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" -version = "4.1.1" - [[deps.FreeType2_jll]] deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" version = "2.13.1+0" -[[deps.FreeTypeAbstraction]] -deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] -git-tree-sha1 = "055626e1a35f6771fe99060e835b72ca61a52621" -uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" -version = "0.10.1" - [[deps.FriBidi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" @@ -606,9 +511,9 @@ version = "6.2.1+6" [[deps.GPUArrays]] deps = ["Adapt", "GPUArraysCore", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "Serialization", "Statistics"] -git-tree-sha1 = "47e4686ec18a9620850bad110b79966132f14283" +git-tree-sha1 = "68e8ff56a4a355a85d2784b94614491f8c900cde" uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "10.0.2" +version = "10.1.0" [[deps.GPUArraysCore]] deps = ["Adapt"] @@ -618,21 +523,9 @@ version = "0.1.6" [[deps.GPUCompiler]] deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "Scratch", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "a846f297ce9d09ccba02ead0cae70690e072a119" +git-tree-sha1 = "1600477fba37c9fc067b9be21f5e8101f24a8865" uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.25.0" - -[[deps.GeoInterface]] -deps = ["Extents"] -git-tree-sha1 = "d4f85701f569584f2cff7ba67a137d03f0cfb7d0" -uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" -version = "1.3.3" - -[[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "5694b56ccf9d15addedc35e9a4ba9c317721b788" -uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.10" +version = "0.26.4" [[deps.Gettext_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] @@ -669,29 +562,12 @@ git-tree-sha1 = "383db7d3f900f4c1f47a8a04115b053c095e48d3" uuid = "0951126a-58fd-58f1-b5b3-b08c7c4a876d" version = "3.8.4+0" -[[deps.Graphics]] -deps = ["Colors", "LinearAlgebra", "NaNMath"] -git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" -uuid = "a2bd30eb-e257-5431-a919-1863eab51364" -version = "1.1.2" - [[deps.Graphite2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" version = "1.3.14+0" -[[deps.GridLayoutBase]] -deps = ["GeometryBasics", "InteractiveUtils", "Observables"] -git-tree-sha1 = "f57a64794b336d4990d90f80b147474b869b1bc4" -uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" -version = "0.9.2" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - [[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" @@ -710,18 +586,18 @@ git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" version = "2.8.1+1" +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] +git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.16" + [[deps.Hwloc_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "ca0f6bf568b4bfc807e7537f081c81e35ceca114" uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" version = "2.10.0+0" -[[deps.HypergeometricFunctions]] -deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.23" - [[deps.IOCapture]] deps = ["Logging", "Random"] git-tree-sha1 = "8b72179abc660bfab5e28472e019392b97d0985c" @@ -733,41 +609,17 @@ git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" version = "0.1.1" -[[deps.ImageAxes]] -deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] -git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" -uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" -version = "0.6.11" - -[[deps.ImageBase]] -deps = ["ImageCore", "Reexport"] -git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" -uuid = "c817782e-172a-44cc-b673-b171935fbb9e" -version = "0.1.7" - [[deps.ImageCore]] deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" version = "0.10.2" -[[deps.ImageIO]] -deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] -git-tree-sha1 = "bca20b2f5d00c4fbc192c3212da8fa79f4688009" -uuid = "82e4d734-157c-48bb-816b-45c225c6df19" -version = "0.6.7" - -[[deps.ImageMetadata]] -deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] -git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" -uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" -version = "0.9.9" - -[[deps.Imath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3d09a9f60edf77f8a4d99f9e015e8fbf9989605d" -uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.1.7+0" +[[deps.ImageMorphology]] +deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] +git-tree-sha1 = "6f0a801136cb9c229aebea0df296cdcd471dbcd1" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.4.5" [[deps.IncompleteLU]] deps = ["LinearAlgebra", "SparseArrays"] @@ -775,27 +627,12 @@ git-tree-sha1 = "6c676e79f98abb6d33fa28122cad099f1e464afe" uuid = "40713840-3770-5561-ab4c-a76e7d0d7895" version = "0.2.1" -[[deps.IndirectArrays]] -git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" -uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" -version = "1.0.0" - -[[deps.Inflate]] -git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.4" - [[deps.InlineStrings]] deps = ["Parsers"] git-tree-sha1 = "9cc2baf75c6d09f9da536ddf58eb2f29dedaf461" uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" version = "1.4.0" -[[deps.IntegerMathUtils]] -git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" -uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" -version = "0.1.2" - [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "5fdf2fe6724d8caabf43b557b84ce53f3b7e2f6b" @@ -806,34 +643,15 @@ version = "2024.0.2+0" deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -[[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" -uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.15.1" - - [deps.Interpolations.extensions] - InterpolationsUnitfulExt = "Unitful" - - [deps.Interpolations.weakdeps] - Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" - -[[deps.IntervalArithmetic]] -deps = ["CRlibm", "FastRounding", "LinearAlgebra", "Markdown", "Random", "RecipesBase", "RoundingEmulator", "SetRounding", "StaticArrays"] -git-tree-sha1 = "5ab7744289be503d76a944784bac3f2df7b809af" -uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "0.20.9" - -[[deps.IntervalSets]] -git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.10" -weakdeps = ["Random", "RecipesBase", "Statistics"] +[[deps.InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "896385798a8d49a255c398bd49162062e4a4c435" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.13" +weakdeps = ["Dates"] - [deps.IntervalSets.extensions] - IntervalSetsRandomExt = "Random" - IntervalSetsRecipesBaseExt = "RecipesBase" - IntervalSetsStatisticsExt = "Statistics" + [deps.InverseFunctions.extensions] + DatesExt = "Dates" [[deps.InvertedIndices]] git-tree-sha1 = "0dc7b50b8d436461be01300fd8cd45aa0274b038" @@ -845,17 +663,6 @@ git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" version = "0.2.2" -[[deps.Isoband]] -deps = ["isoband_jll"] -git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" -uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" -version = "0.1.1" - -[[deps.IterTools]] -git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.10.0" - [[deps.IterativeSolvers]] deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] git-tree-sha1 = "59545b0a2b27208b0650df0a46b8e3019f85055b" @@ -887,27 +694,9 @@ version = "0.21.4" [[deps.JSON3]] deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] -git-tree-sha1 = "eb3edce0ed4fa32f75a0a11217433c31d56bd48b" +git-tree-sha1 = "95220473901735a0f4df9d1ca5b171b568b2daa3" uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" -version = "1.14.0" - - [deps.JSON3.extensions] - JSON3ArrowExt = ["ArrowTypes"] - - [deps.JSON3.weakdeps] - ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" - -[[deps.JpegTurbo]] -deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] -git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" -uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" -version = "0.1.5" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3336abae9a713d2210bb57ab484b1e065edd7d23" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.0.2+0" +version = "1.13.2" [[deps.JuliaNVTXCallbacks_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -927,12 +716,6 @@ version = "0.9.18" [deps.KernelAbstractions.weakdeps] EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" -[[deps.KernelDensity]] -deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "fee018a29b60733876eb557804b5b109dd3dd8a7" -uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.8" - [[deps.LAME_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" @@ -986,6 +769,12 @@ git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" version = "1.3.1" +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.15" + [[deps.LazilyInitializedFields]] git-tree-sha1 = "8f7f3cabab0fd1800699663533b6d5cb3fc0e612" uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" @@ -995,11 +784,6 @@ version = "1.2.2" deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" -[[deps.LazyModules]] -git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" -uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" -version = "0.3.1" - [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" @@ -1063,34 +847,10 @@ git-tree-sha1 = "0a04a1318df1bf510beb2562cf90fb0c386f58c4" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" version = "2.39.3+1" -[[deps.LightXML]] -deps = ["Libdl", "XML2_jll"] -git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" -uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" -version = "0.9.1" - -[[deps.LineSearches]] -deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] -git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" -uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" -version = "7.2.0" - [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -[[deps.LinearAlgebraX]] -deps = ["LinearAlgebra", "Mods", "Primes", "SimplePolynomials"] -git-tree-sha1 = "d76cec8007ec123c2b681269d40f94b053473fcf" -uuid = "9b3f67b0-2d00-526e-9884-9e4938f8fb88" -version = "0.2.7" - -[[deps.Literate]] -deps = ["Base64", "IOCapture", "JSON", "REPL"] -git-tree-sha1 = "bad26f1ccd99c553886ec0725e99a509589dcd11" -uuid = "98b081ad-f1c9-55d3-8b20-4c87d4299306" -version = "2.16.1" - [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" @@ -1116,6 +876,17 @@ git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" 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" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.169" +weakdeps = ["ChainRulesCore", "ForwardDiff", "SpecialFunctions"] + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + SpecialFunctionsExt = "SpecialFunctions" + [[deps.Lz4_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "6c26c5e8a4203d43b5497be3ec5d4e0c3cde240a" @@ -1166,17 +937,10 @@ git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.13" -[[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FixedPointNumbers", "Formatting", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Setfield", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "StableHashTraits", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun"] -git-tree-sha1 = "35fa3c150cd96fd77417a23965b7037b90d6ffc9" -uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.19.12" - -[[deps.MakieCore]] -deps = ["Observables", "REPL"] -git-tree-sha1 = "9b11acd07f21c4d035bd4156e789532e8ee2cc70" -uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.6.9" +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" [[deps.MappedArrays]] git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" @@ -1193,12 +957,6 @@ git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" version = "0.1.2" -[[deps.MathTeXEngine]] -deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] -git-tree-sha1 = "96ca8a313eb6437db5ffe946c457a401bbb8ce1d" -uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" -version = "0.5.7" - [[deps.MbedTLS]] deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" @@ -1218,18 +976,13 @@ version = "10.1.4+2" [[deps.Missings]] deps = ["DataAPI"] -git-tree-sha1 = "f66bdc5de519e8f8ae43bdc598782d35a25b1272" +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.1.0" +version = "1.2.0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" -[[deps.Mods]] -git-tree-sha1 = "924f962b524a71eef7a21dae1e6853817f9b658f" -uuid = "7475f97c-0381-53b1-977b-4c60186c8d62" -version = "2.2.4" - [[deps.MosaicViews]] deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" @@ -1240,23 +993,12 @@ version = "0.3.4" uuid = "14a3606d-f60d-562e-9121-12d972cd8159" version = "2023.1.10" -[[deps.Multisets]] -git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" -uuid = "3b2b4ff1-bcff-5658-a3ee-dbcf1ce5ac09" -version = "0.4.4" - [[deps.NCDatasets]] deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] git-tree-sha1 = "d40d24d12f710c39d3a66be99c567ce0032f28a7" uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" version = "0.14.3" -[[deps.NLSolversBase]] -deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] -git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" -uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" -version = "7.8.3" - [[deps.NVTX]] deps = ["Colors", "JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] git-tree-sha1 = "53046f0483375e3ed78e49190f1154fa0a4083a1" @@ -1281,12 +1023,6 @@ git-tree-sha1 = "a8af1798e4eb9ff768ce7fdefc0e957097793f15" uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" version = "400.902.209+0" -[[deps.Netpbm]] -deps = ["FileIO", "ImageCore", "ImageMetadata"] -git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" -uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" -version = "1.1.1" - [[deps.Nettle_jll]] deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "eca63e3847dad608cfa6a3329b95ef674c7160b4" @@ -1297,16 +1033,13 @@ version = "3.7.2+0" uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" -[[deps.Observables]] -git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" -uuid = "510215fc-4207-5dde-b226-833fc4488ee2" -version = "0.5.5" - [[deps.Oceananigans]] deps = ["Adapt", "CUDA", "Crayons", "CubedSphere", "Dates", "Distances", "DocStringExtensions", "FFTW", "Glob", "IncompleteLU", "InteractiveUtils", "IterativeSolvers", "JLD2", "KernelAbstractions", "LinearAlgebra", "Logging", "MPI", "NCDatasets", "OffsetArrays", "OrderedCollections", "PencilArrays", "PencilFFTs", "Pkg", "Printf", "Random", "Rotations", "SeawaterPolynomials", "SparseArrays", "Statistics", "StructArrays"] -git-tree-sha1 = "4672af7242405313743af45168bfce3d87b84b2c" +git-tree-sha1 = "82eddd14528a13419be8b75da9daa23fb2a14363" +repo-rev = "main" +repo-url = "https://github.com/CliMA/Oceananigans.jl.git" uuid = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" -version = "0.90.11" +version = "0.90.12" [deps.Oceananigans.extensions] OceananigansEnzymeExt = "Enzyme" @@ -1315,9 +1048,9 @@ version = "0.90.11" Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" [[deps.OffsetArrays]] -git-tree-sha1 = "6a731f2b5c03157418a20c12195eb4b74c8f8621" +git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.13.0" +version = "1.14.0" weakdeps = ["Adapt"] [deps.OffsetArrays.extensions] @@ -1334,18 +1067,6 @@ deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" version = "0.3.23+4" -[[deps.OpenEXR]] -deps = ["Colors", "FileIO", "OpenEXR_jll"] -git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" -uuid = "52e1d378-f018-4a11-a4be-720524705ac7" -version = "0.3.2" - -[[deps.OpenEXR_jll]] -deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "a4ca623df1ae99d09bc9868b008262d0c0ac1e4f" -uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.1.4+0" - [[deps.OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" @@ -1375,18 +1096,6 @@ git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.5+0" -[[deps.Optim]] -deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] -git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89" -uuid = "429524aa-4258-5aef-a3af-852621145aeb" -version = "1.9.4" - - [deps.Optim.extensions] - OptimMOIExt = "MathOptInterface" - - [deps.Optim.weakdeps] - MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" - [[deps.Opus_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" @@ -1398,6 +1107,14 @@ git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.6.3" +[[deps.OrthogonalSphericalShellGrids]] +deps = ["CUDA", "Documenter", "DocumenterTools", "FFMPEG", "JLD2", "JSON3", "KernelAbstractions", "Oceananigans", "OffsetArrays", "Printf"] +git-tree-sha1 = "ad2ad883a638e387818d0e2b270c67fd4dcea89f" +repo-rev = "main" +repo-url = "https://github.com/simone-silvestri/OrthogonalSphericalShellGrids.jl" +uuid = "c2be9673-fb75-4747-82dc-aa2bb9f4aed0" +version = "0.1.0" + [[deps.P11Kit_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "2cd396108e178f3ae8dedbd8e938a18726ab2fbf" @@ -1409,23 +1126,11 @@ deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" version = "10.42.0+1" -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.31" - [[deps.PMIx_jll]] deps = ["Artifacts", "Hwloc_jll", "JLLWrappers", "Libdl", "Zlib_jll", "libevent_jll"] -git-tree-sha1 = "8b3b19351fa24791f94d7ae85faf845ca1362541" +git-tree-sha1 = "360f48126b5f2c2f0c833be960097f7c62705976" uuid = "32165bc3-0280-59bc-8c0b-c33b6203efab" -version = "4.2.7+0" - -[[deps.PNGFiles]] -deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] -git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" -uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" -version = "0.4.3" +version = "4.2.9+0" [[deps.PackageExtensionCompat]] git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" @@ -1433,30 +1138,12 @@ uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" version = "1.0.2" weakdeps = ["Requires", "TOML"] -[[deps.Packing]] -deps = ["GeometryBasics"] -git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501" -uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" -version = "0.5.0" - [[deps.PaddedViews]] deps = ["OffsetArrays"] git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" version = "0.5.12" -[[deps.Pango_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "526f5a03792669e4187e584e8ec9d534248ca765" -uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.52.1+0" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" - [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" @@ -1483,18 +1170,6 @@ git-tree-sha1 = "bd69f3f0ee248cfb4241800aefb705b5ded592ff" uuid = "4a48f351-57a6-4416-9ec4-c37015456aae" version = "0.15.1" -[[deps.Permutations]] -deps = ["Combinatorics", "LinearAlgebra", "Random"] -git-tree-sha1 = "eb3f9df2457819bf0a9019bd93cc451697a0751e" -uuid = "2ae35dd2-176d-5d53-8349-f30d82d94d4f" -version = "0.4.20" - -[[deps.PikaParser]] -deps = ["DocStringExtensions"] -git-tree-sha1 = "d6ff87de27ff3082131f31a714d25ab6d0a88abf" -uuid = "3bbf5609-3e7b-44cd-8549-7c69f321e792" -version = "0.6.1" - [[deps.Pixman_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] git-tree-sha1 = "64779bc4c9784fee475689a1752ef4d5747c5e87" @@ -1512,34 +1187,11 @@ git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" version = "0.3.3" -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.1" - -[[deps.PolygonOps]] -git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" -uuid = "647866c9-e3ac-4575-94e7-e3d426903924" -version = "0.1.2" - -[[deps.Polynomials]] -deps = ["LinearAlgebra", "RecipesBase", "Setfield", "SparseArrays"] -git-tree-sha1 = "a9c7a523d5ed375be3983db190f6a5874ae9286d" -uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" -version = "4.0.6" - - [deps.Polynomials.extensions] - PolynomialsChainRulesCoreExt = "ChainRulesCore" - PolynomialsFFTWExt = "FFTW" - PolynomialsMakieCoreExt = "MakieCore" - PolynomialsMutableArithmeticsExt = "MutableArithmetics" - - [deps.Polynomials.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" - MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" - MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.1" [[deps.PooledArrays]] deps = ["DataAPI", "Future"] @@ -1547,12 +1199,6 @@ git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" version = "1.4.3" -[[deps.PositiveFactorizations]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" -uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" -version = "0.2.4" - [[deps.PrecompileTools]] deps = ["Preferences"] git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" @@ -1571,12 +1217,6 @@ git-tree-sha1 = "88b895d13d53b5577fd53379d913b9ab9ac82660" uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" version = "2.3.1" -[[deps.Primes]] -deps = ["IntegerMathUtils"] -git-tree-sha1 = "cb420f77dc474d23ee47ca8d14c90810cafe69e7" -uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" -version = "0.5.6" - [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" @@ -1587,24 +1227,6 @@ git-tree-sha1 = "b437cdb0385ed38312d91d9c00c20f3798b30256" uuid = "49802e3a-d2f1-5c88-81d8-b72133a6f568" version = "1.5.1" -[[deps.ProgressMeter]] -deps = ["Distributed", "Printf"] -git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" -uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.10.0" - -[[deps.QOI]] -deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] -git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" -uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.0" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.9.4" - [[deps.Quaternions]] deps = ["LinearAlgebra", "Random", "RealDot"] git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9" @@ -1631,21 +1253,6 @@ git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" version = "1.5.3" -[[deps.RangeArrays]] -git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" -uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" -version = "0.3.2" - -[[deps.Ratios]] -deps = ["Requires"] -git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" -uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" -version = "0.4.5" -weakdeps = ["FixedPointNumbers"] - - [deps.Ratios.extensions] - RatiosFixedPointNumbersExt = "FixedPointNumbers" - [[deps.RealDot]] deps = ["LinearAlgebra"] git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" @@ -1669,35 +1276,35 @@ git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" version = "0.1.0" -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - [[deps.Requires]] deps = ["UUIDs"] git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.0" -[[deps.RingLists]] -deps = ["Random"] -git-tree-sha1 = "f39da63aa6d2d88e0c1bd20ed6a3ff9ea7171ada" -uuid = "286e9d63-9694-5540-9e3c-4e6708fa07b2" -version = "0.2.8" +[[deps.RootSolvers]] +deps = ["ForwardDiff"] +git-tree-sha1 = "a87fd671f7a298de98f2f3c5a9cd9890714eb9dd" +uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" +version = "0.4.2" -[[deps.Rmath]] -deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.7.1" +[[deps.Roots]] +deps = ["Accessors", "ChainRulesCore", "CommonSolve", "Printf"] +git-tree-sha1 = "1ab580704784260ee5f45bffac810b152922747b" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "2.1.5" -[[deps.Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.4.0+0" + [deps.Roots.extensions] + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + + [deps.Roots.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" [[deps.Rotations]] deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] @@ -1709,15 +1316,21 @@ weakdeps = ["RecipesBase"] [deps.Rotations.extensions] RotationsRecipesBaseExt = "RecipesBase" -[[deps.RoundingEmulator]] -git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" -uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" -version = "0.2.1" - [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" version = "0.7.0" +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SLEEFPirates]] +deps = ["IfElse", "Static", "VectorizationBase"] +git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.42" + [[deps.Scratch]] deps = ["Dates"] git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" @@ -1738,80 +1351,11 @@ version = "1.4.1" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -[[deps.SetRounding]] -git-tree-sha1 = "d7a25e439d07a17b7cdf97eecee504c50fedf5f6" -uuid = "3cc68bcd-71a2-5612-b932-767ffbe40ab0" -version = "0.2.1" - -[[deps.Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] -git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "1.1.1" - -[[deps.ShaderAbstractions]] -deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" -uuid = "65257c39-d410-5151-9873-9b3e5be5013e" -version = "0.4.1" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SignedDistanceFields]] -deps = ["Random", "Statistics", "Test"] -git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" -uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.0" - [[deps.SimpleBufferStream]] git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" version = "1.1.0" -[[deps.SimpleGraphs]] -deps = ["AbstractLattices", "Combinatorics", "DataStructures", "IterTools", "LightXML", "LinearAlgebra", "LinearAlgebraX", "Optim", "Primes", "Random", "RingLists", "SimplePartitions", "SimplePolynomials", "SimpleRandom", "SparseArrays", "Statistics"] -git-tree-sha1 = "f65caa24a622f985cc341de81d3f9744435d0d0f" -uuid = "55797a34-41de-5266-9ec1-32ac4eb504d3" -version = "0.8.6" - -[[deps.SimplePartitions]] -deps = ["AbstractLattices", "DataStructures", "Permutations"] -git-tree-sha1 = "e182b9e5afb194142d4668536345a365ea19363a" -uuid = "ec83eff0-a5b5-5643-ae32-5cbf6eedec9d" -version = "0.3.2" - -[[deps.SimplePolynomials]] -deps = ["Mods", "Multisets", "Polynomials", "Primes"] -git-tree-sha1 = "7063828369cafa93f3187b3d0159f05582011405" -uuid = "cc47b68c-3164-5771-a705-2bc0097375a0" -version = "0.2.17" - -[[deps.SimpleRandom]] -deps = ["Distributions", "LinearAlgebra", "Random"] -git-tree-sha1 = "3a6fb395e37afab81aeea85bae48a4db5cd7244a" -uuid = "a6525b86-64cd-54fa-8f65-62fc48bdc0e8" -version = "0.3.1" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" - -[[deps.Sixel]] -deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] -git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" -uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" -version = "0.1.3" - [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" @@ -1836,12 +1380,6 @@ weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" -[[deps.StableHashTraits]] -deps = ["Compat", "PikaParser", "SHA", "Tables", "TupleTools"] -git-tree-sha1 = "10dc702932fe05a0e09b8e5955f00794ea1e8b12" -uuid = "c5dd0088-6c3f-4803-b00e-f31a60c170fa" -version = "1.1.8" - [[deps.StackViews]] deps = ["OffsetArrays"] git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" @@ -1897,26 +1435,6 @@ git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" version = "1.7.0" -[[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.3" - -[[deps.StatsFuns]] -deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.3.1" - - [deps.StatsFuns.extensions] - StatsFunsChainRulesCoreExt = "ChainRulesCore" - StatsFunsInverseFunctionsExt = "InverseFunctions" - - [deps.StatsFuns.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - [[deps.Strided]] deps = ["LinearAlgebra", "StridedViews", "TupleTools"] git-tree-sha1 = "40c69be0e1b72ee2f42923b7d1ff13e0b04e675c" @@ -1967,6 +1485,20 @@ deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" version = "7.2.1+1" +[[deps.SurfaceFluxes]] +deps = ["DocStringExtensions", "RootSolvers", "Thermodynamics"] +git-tree-sha1 = "c2c43206af0d861e018f746286d1af036aa7bc3a" +repo-rev = "glw/generalize-parameters" +repo-url = "https://github.com/glwagner/SurfaceFluxes.jl.git" +uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" +version = "0.9.2" + + [deps.SurfaceFluxes.extensions] + CreateParametersExt = "CLIMAParameters" + + [deps.SurfaceFluxes.weakdeps] + CLIMAParameters = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" + [[deps.TOML]] deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" @@ -1994,11 +1526,13 @@ deps = ["LinearAlgebra", "Markdown", "Requires", "SparseArrays"] git-tree-sha1 = "1c7170668366821b0c4c4fe03ee78f8d6cf36e2c" uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" version = "0.16.0" -weakdeps = ["IntervalArithmetic"] [deps.TaylorSeries.extensions] TaylorSeriesIAExt = "IntervalArithmetic" + [deps.TaylorSeries.weakdeps] + IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" + [[deps.TensorCore]] deps = ["LinearAlgebra"] git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" @@ -2009,11 +1543,31 @@ version = "0.1.1" deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -[[deps.TiffImages]] -deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "UUIDs"] -git-tree-sha1 = "34cc045dd0aaa59b8bbe86c644679bc57f1d5bd0" -uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" -version = "0.6.8" +[[deps.Thermodynamics]] +deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"] +git-tree-sha1 = "48098ebfee40374b8415b602163e02aa7c43d32b" +repo-rev = "glw/density-example" +repo-url = "https://github.com/glwagner/Thermodynamics.jl.git" +uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" +version = "0.12.5" + + [deps.Thermodynamics.extensions] + CreateParametersExt = "ClimaParams" + + [deps.Thermodynamics.weakdeps] + ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.2" + +[[deps.TiledIteration]] +deps = ["OffsetArrays", "StaticArrayInterface"] +git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.5.0" [[deps.TimerOutputs]] deps = ["ExprTools", "Printf"] @@ -2030,11 +1584,6 @@ weakdeps = ["Random", "Test"] [deps.TranscodingStreams.extensions] TestExt = ["Test", "Random"] -[[deps.TriplotBase]] -git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" -uuid = "981d1d27-644d-49a2-9326-4793e63143c3" -version = "0.1.0" - [[deps.TupleTools]] git-tree-sha1 = "41d61b1c545b06279871ef1a4b5fcb2cac2191cd" uuid = "9d95972d-f1c8-5527-a6e0-b4b365fa01f6" @@ -2057,12 +1606,6 @@ version = "1.0.2" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - [[deps.UnsafeAtomics]] git-tree-sha1 = "6331ac3440856ea1988316b46045303bef658278" uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" @@ -2074,17 +1617,17 @@ git-tree-sha1 = "323e3d0acf5e78a56dfae7bd8928c989b4f3083e" uuid = "d80eeb9a-aca5-4d75-85e5-170c8b632249" version = "0.1.3" +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "ac377f0a248753a1b1d58bbc92a64f5a726dfb71" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.66" + [[deps.VersionParsing]] git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868" uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" version = "1.3.0" -[[deps.WoodburyMatrices]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" -uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" - [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" @@ -2162,12 +1705,6 @@ git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" version = "1.5.6+0" -[[deps.isoband_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" -uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" -version = "0.2.3+0" - [[deps.libaec_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "46bf7be2917b59b761247be3f317ddf75e50e997" @@ -2209,12 +1746,6 @@ git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" version = "1.6.43+1" -[[deps.libsixel_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] -git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" -uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" -version = "1.10.3+0" - [[deps.libvorbis_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" diff --git a/prototype_omip_simulation/Project.toml b/prototype_omip_simulation/Project.toml new file mode 100644 index 00000000..a12db012 --- /dev/null +++ b/prototype_omip_simulation/Project.toml @@ -0,0 +1,9 @@ +[deps] +ClimaOcean = "0376089a-ecfe-4b0e-a64f-9c555d74d754" +ClimaSeaIce = "6ba0ff68-24e6-4315-936c-2e99227c95a4" +JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +Oceananigans = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" +OrthogonalSphericalShellGrids = "c2be9673-fb75-4747-82dc-aa2bb9f4aed0" +SeawaterPolynomials = "d496a93d-167e-4197-9f49-d3af4ff8fe40" +SurfaceFluxes = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" +Thermodynamics = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" diff --git a/prototype_omip_simulation/comparison_coare.jl b/prototype_omip_simulation/comparison_coare.jl new file mode 100644 index 00000000..9db067f1 --- /dev/null +++ b/prototype_omip_simulation/comparison_coare.jl @@ -0,0 +1,118 @@ +using Printf +using Oceananigans.Units +using ClimaOcean +using Oceananigans +using Oceananigans.Operators +using ClimaOcean.ECCO2 +using ClimaOcean.OceanSimulations +using Oceananigans.Units +using ClimaOcean.JRA55: JRA55_prescribed_atmosphere +using ClimaOcean.OceanSeaIceModels: Radiation + +# Upload ECCO2 fields +T = ECCO2.ecco2_field(:temperature) +S = ECCO2.ecco2_field(:salinity) +u = ECCO2.ecco2_field(:u_velocity) +v = ECCO2.ecco2_field(:v_velocity) + +include("ecco2_immersed_grid.jl") +grid = ecco2_immersed_grid() + +atmosphere = JRA55_prescribed_atmosphere(1:2; grid = grid.underlying_grid) + +ocean = ocean_simulation(grid; momentum_advection = nothing, + tracer_advection = nothing) + +ocean_model = ocean.model + +# setting ecco variables in the model +set!(ocean_model, T = T, S = S, u = u, v = v) + +coupled_model = OceanSeaIceModel(ocean; atmosphere, radiation = Radiation()) + +function centered_surface_u_velocity(u) + 𝒰ᶜᶜᶜ = KernelFunctionOperation{Center, Center, Center}(ℑxᶜᵃᵃ, grid, u) + uᶜᶜᶜ = Field(𝒰ᶜᶜᶜ) + compute!(uᶜᶜᶜ) + + Nz = size(uᶜᶜᶜ.grid, 3) + + return Array(interior(uᶜᶜᶜ, :, :, Nz)) +end + +function centered_surface_v_velocity(v) + 𝒱ᶜᶜᶜ = KernelFunctionOperation{Center, Center, Center}(ℑyᵃᶜᵃ, grid, v) + vᶜᶜᶜ = Field(𝒱ᶜᶜᶜ) + compute!(vᶜᶜᶜ) + + Nz = size(vᶜᶜᶜ.grid, 3) + + return Array(interior(vᶜᶜᶜ, :, :, Nz)) +end + +# Write down variables to be read by MATLAB! +using MAT + +matfile = matopen("surface_fluxes.mat", "w") + +# Ocean variables +uo = centered_surface_u_velocity(ocean_model.velocities.u) +vo = centered_surface_v_velocity(ocean_model.velocities.v) +To = Array(interior(ocean_model.tracers.T, :, :, grid.Nz)) +So = Array(interior(ocean_model.tracers.S, :, :, grid.Nz)) +write(matfile, "uo", uo) +write(matfile, "vo", vo) +write(matfile, "To", To) +write(matfile, "So", So) + +# Atmospheric variables +ua = Array(interior(atmosphere.velocities.u[1], :, :, 1)) +va = Array(interior(atmosphere.velocities.v[1], :, :, 1)) +Ta = Array(interior(atmosphere.tracers.T[1], :, :, 1)) +qa = Array(interior(atmosphere.tracers.q[1], :, :, 1)) +ra = Array(interior(atmosphere.tracers.r[1], :, :, 1)) +pa = Array(interior(atmosphere.pressure[1], :, :, 1)) +Rs = Array(interior(atmosphere.downwelling_radiation.shortwave[1], :, :, 1)) +Rl = Array(interior(atmosphere.downwelling_radiation.longwave[1], :, :, 1)) +write(matfile, "ua", ua) +write(matfile, "va", va) +write(matfile, "Ta", Ta) +write(matfile, "qa", qa) +write(matfile, "ra", ra) +write(matfile, "pa", pa) +write(matfile, "Rs", Rs) +write(matfile, "Rl", Rl) + +import ClimaOcean.OceanSeaIceModels.CrossRealmFluxes: net_downwelling_radiation + +@inline net_downwelling_radiation(i::Int, j::Int, k::Int, grid, time, Qs::Field, Ql::Field, args...) = + net_downwelling_radiation(i, j, grid, time, Qs[i, j, k], Ql[i, j, k], args...) + +Rad = KernelFunctionOperation{Center, Center, Center}(net_downwelling_radiation, + grid, + Time(0), + atmosphere.downwelling_radiation.shortwave[1], + atmosphere.downwelling_radiation.longwave[1], + coupled_model.fluxes.radiation) + +Rin = compute!(Field(Rad)) +Rin = Array(interior(Rin, :, :, 1)) +Rou = 0.97 * 5.67e-8 .* (Array(interior(ocean.model.tracers.T, :, :, 50)) .+ 273.15) .^ 4 + +# Turbulent fluxes +Ql = Array(interior(coupled_model.fluxes.turbulent.fields.latent_heat, :, :, 1)) +Qs = Array(interior(coupled_model.fluxes.turbulent.fields.sensible_heat, :, :, 1)) +Mv = Array(interior(coupled_model.fluxes.turbulent.fields.water_vapor, :, :, 1)) +tx = Array(interior(coupled_model.fluxes.turbulent.fields.x_momentum, :, :, 1)) +ty = Array(interior(coupled_model.fluxes.turbulent.fields.y_momentum, :, :, 1)) +Tf = Array(interior(ocean.model.tracers.T.boundary_conditions.top.condition, :, :, 1)) +write(matfile, "Ql", Ql) +write(matfile, "Qs", Qs) +write(matfile, "Mv", Mv) +write(matfile, "tx", tx) +write(matfile, "ty", ty) +write(matfile, "Tf", Tf) +write(matfile, "Ri", Rin) +write(matfile, "Ro", Rou) + +close(matfile) diff --git a/prototype_omip_simulation/prototype_omip_simulation.jl b/prototype_omip_simulation/prototype_omip_simulation.jl new file mode 100644 index 00000000..e38c4238 --- /dev/null +++ b/prototype_omip_simulation/prototype_omip_simulation.jl @@ -0,0 +1,159 @@ +using Printf +using Oceananigans +using Oceananigans.Units +using ClimaOcean +using OrthogonalSphericalShellGrids +using Oceananigans +using Oceananigans: architecture +using ClimaOcean +using ClimaOcean.ECCO2 +using Oceananigans.TurbulenceClosures.CATKEVerticalDiffusivities: CATKEVerticalDiffusivity +using Oceananigans.Coriolis: ActiveCellEnstrophyConserving +using Oceananigans.Units +using ClimaOcean.OceanSimulations +using ClimaOcean.OceanSeaIceModels +using ClimaOcean.OceanSeaIceModels.CrossRealmFluxes: Radiation +using ClimaOcean.VerticalGrids: exponential_z_faces +using ClimaOcean.JRA55 +using ClimaOcean.JRA55: JRA55NetCDFBackend, JRA55_prescribed_atmosphere +using ClimaOcean.Bathymetry + +include("tripolar_specific_methods.jl") + +##### +##### Global Ocean at 1/6th of a degree +##### + +bathymetry_file = nothing # "bathymetry_tmp.jld2" + +# 60 vertical levels +z_faces = exponential_z_faces(Nz=60, depth=6500) + +Nx = 2160 +Ny = 1100 +Nz = length(z_faces) - 1 + +arch = CPU() #Distributed(GPU(), partition = Partition(2)) + +grid = TripolarGrid(arch; + size = (Nx, Ny, Nz), + halo = (7, 7, 7), + z = z_faces, + north_poles_latitude = 60, + first_pole_longitude = 75) + +bottom_height = retrieve_bathymetry(grid, bathymetry_file; + minimum_depth = 10, + dir = "./", + interpolation_passes = 20, + connected_regions_allowed = 0) + +grid = ImmersedBoundaryGrid(grid, GridFittedBottom(bottom_height)) #; active_cells_map = true) + +##### +##### The Ocean component +##### + +const Lz = grid.Lz +const h = Nz / 4.5 + +@inline exponential_profile(z; Lz, h) = (exp(z / h) - exp( - Lz / h)) / (1 - exp( - Lz / h)) +@inline νz(x, y, z, t) = 1e-4 + (5e-3 - 1e-4) * exponential_profile(z; Lz, h) + +free_surface = SplitExplicitFreeSurface(grid; cfl=0.7, fixed_Δt = 20minutes) +vertical_diffusivity = VerticalScalarDiffusivity(VerticallyImplicitTimeDiscretization(), κ = 5e-5, ν = νz) + +closure = (RiBasedVerticalDiffusivity(), vertical_diffusivity) + +ocean = ocean_simulation(grid; free_surface, closure) +model = ocean.model + +set!(model, + T = ECCO2Metadata(:temperature), + S = ECCO2Metadata(:salinity)) + +##### +##### The atmosphere +##### + +backend = JRA55NetCDFBackend(4) +atmosphere = JRA55_prescribed_atmosphere(arch; backend) +radiation = Radiation(arch) + +sea_ice = ClimaOcean.OceanSeaIceModels.MinimumTemperatureSeaIce() + +coupled_model = OceanSeaIceModel(ocean, sea_ice; atmosphere, radiation) + +wall_time = [time_ns()] + +function progress(sim) + u, v, w = sim.model.velocities + T, S = sim.model.tracers + + Tmax = maximum(interior(T)) + Tmin = minimum(interior(T)) + umax = maximum(interior(u)), maximum(interior(v)), maximum(interior(w)) + step_time = 1e-9 * (time_ns() - wall_time[1]) + + @info @sprintf("Time: %s, Iteration %d, Δt %s, max(vel): (%.2e, %.2e, %.2e), max(trac): %.2f, %.2f, wtime: %s \n", + prettytime(sim.model.clock.time), + sim.model.clock.iteration, + prettytime(sim.Δt), + umax..., Tmax, Tmin, prettytime(step_time)) + + wall_time[1] = time_ns() +end + +ocean.callbacks[:progress] = Callback(progress, IterationInterval(10)) + +fluxes = (u = model.velocities.u.boundary_conditions.top.condition, + v = model.velocities.v.boundary_conditions.top.condition, + T = model.tracers.T.boundary_conditions.top.condition, + S = model.tracers.S.boundary_conditions.top.condition) + +ocean.output_writers[:fluxes] = JLD2OutputWriter(model, fluxes, + schedule = TimeInterval(0.5days), + overwrite_existing = true, + array_type = Array{Float32}, + filename = "surface_fluxes") + +ocean.output_writers[:surface] = JLD2OutputWriter(model, merge(model.tracers, model.velocities), + schedule = TimeInterval(0.5days), + overwrite_existing = true, + array_type = Array{Float32}, + filename = "surface", + indices = (:, :, grid.Nz)) + +ocean.output_writers[:snapshots] = JLD2OutputWriter(model, merge(model.tracers, model.velocities), + schedule = TimeInterval(10days), + overwrite_existing = true, + array_type = Array{Float32}, + filename = "snapshots") + +ocean.output_writers[:checkpoint] = Checkpointer(model, + schedule = TimeInterval(60days), + overwrite_existing = true, + prefix = "checkpoint") + +# Simulation warm up! +ocean.Δt = 10 +ocean.stop_iteration = 1 +wizard = TimeStepWizard(; cfl = 0.1, max_Δt = 90, max_change = 1.1) +ocean.callbacks[:wizard] = Callback(wizard, IterationInterval(1)) + +stop_time = 30days + +coupled_simulation = Simulation(coupled_model; Δt=1, stop_time) + +run!(coupled_simulation) + +wizard = TimeStepWizard(; cfl = 0.4, max_Δt = 540, max_change = 1.1) +ocean.callbacks[:wizard] = Callback(wizard, IterationInterval(10)) + +# Let's reset the maximum number of iterations +coupled_model.ocean.stop_time = 7200days +coupled_simulation.stop_time = 7200days +coupled_model.ocean.stop_iteration = Inf +coupled_simulation.stop_iteration = Inf + +run!(coupled_simulation) diff --git a/prototype_omip_simulation/tripolar_specific_methods.jl b/prototype_omip_simulation/tripolar_specific_methods.jl new file mode 100644 index 00000000..76a436a6 --- /dev/null +++ b/prototype_omip_simulation/tripolar_specific_methods.jl @@ -0,0 +1,46 @@ +using ClimaOcean +import ClimaOcean.InitialConditions: interpolate! + +using Oceananigans +using Oceananigans.BoundaryConditions +using Oceananigans.Fields: OneField +using Oceananigans.Grids: peripheral_node +using Oceananigans.Utils: launch! +using Oceananigans.Fields: instantiated_location, interior, CenterField +using Oceananigans.Architectures: architecture, device, GPU, child_architecture + +# Implementation of 3-dimensional regridding +# TODO: move all the following to Oceananigans! + +using Oceananigans.Fields: regrid!, interpolate! +using Oceananigans.Grids: cpu_face_constructor_x, + cpu_face_constructor_y, + cpu_face_constructor_z, + topology, + λnode, φnode + +using OrthogonalSphericalShellGrids: TRG + +@inline hack_cosd(φ) = cos(π * φ / 180) +@inline hack_sind(φ) = sin(π * φ / 180) + +import ClimaOcean.OceanSeaIceModels.CrossRealmFluxes: convert_to_latlon_frame, convert_to_native_frame + +# Here we assume that the tripolar grid is locally orthogonal +@inline function convert_to_latlon_frame(i, j, grid::TRG, uₒ, vₒ) + φ₁ = φnode(i, j, 1, grid, Face(), Center(), Center()) + φ₂ = φnode(i+1, j, 1, grid, Face(), Center(), Center()) + + θ = φ₂ - φ₁ + + return uₒ * hack_cosd(θ) + vₒ * hack_sind(θ), uₒ * hack_sind(θ) + vₒ * hack_cosd(θ) +end + +@inline function convert_to_native_frame(i, j, grid::TRG, uₒ, vₒ) + φ₁ = φnode(i, j, 1, grid, Face(), Center(), Center()) + φ₂ = φnode(i, j+1, 1, grid, Face(), Center(), Center()) + + θ = φ₂ - φ₁ + + return uₒ * hack_cosd(θ) + vₒ * hack_sind(θ), uₒ * hack_sind(θ) + vₒ * hack_cosd(θ) +end diff --git a/src/Bathymetry.jl b/src/Bathymetry.jl index b38470a3..9aa1af6d 100644 --- a/src/Bathymetry.jl +++ b/src/Bathymetry.jl @@ -1,7 +1,8 @@ module Bathymetry -export regrid_bathymetry +export regrid_bathymetry, retrieve_bathymetry +using ImageMorphology using ..DataWrangling: download_progress using Oceananigans @@ -13,6 +14,7 @@ using Oceananigans.Utils: pretty_filesize, launch! using Oceananigans.Fields: interpolate! using Oceananigans.BoundaryConditions using KernelAbstractions: @kernel, @index +using JLD2 using NCDatasets using Downloads @@ -40,7 +42,8 @@ Keyword Arguments: - height_above_water: limits the maximum height of above-water topography (where h > 0). If `nothing` the original topography is retained -- minimum_depth: minimum depth for the shallow regions. `h > minimum_depth` will be considered land +- minimum_depth: minimum depth for the shallow regions, defined as a positive value. + `h > - minimum_depth` will be considered land - dir: directory of the bathymetry-containing file @@ -61,6 +64,11 @@ Keyword Arguments: applying a smoothing filter, with more passes increasing the strength of the filter. If _refining_ the original grid, additional passes will not help and no intermediate steps will be performed. + +- connected_regions_allowed: number of ``connected regions'' allowed in the bathymetry. Connected regions are fluid + regions that are fully encompassed by land (for example the ocean is one connected region). + Default is `Inf`. If a value < `Inf` is specified, connected regions will be preserved in order + of how many active cells they contain. """ function regrid_bathymetry(target_grid; height_above_water = nothing, @@ -68,7 +76,8 @@ function regrid_bathymetry(target_grid; dir = joinpath(@__DIR__, "..", "data"), url = "https://www.ngdc.noaa.gov/thredds/fileServer/global/ETOPO2022/60s/60s_surface_elev_netcdf", filename = "ETOPO_2022_v1_60s_N90W180_surface.nc", - interpolation_passes = 1) + interpolation_passes = 1, + connected_regions_allowed = Inf) # Allow an `Inf` number of ``lakes'' filepath = joinpath(dir, filename) @@ -93,6 +102,11 @@ function regrid_bathymetry(target_grid; λ_data = dataset["lon"][:] h_data = convert.(FT, dataset["z"][:, :]) + # Convert longitude to 0 - 360? + λ_data .+= 180 + nhx = size(h_data, 1) + h_data = circshift(h_data, (nhx ÷ 2, 1)) + close(dataset) # Diagnose target grid information @@ -140,11 +154,6 @@ function regrid_bathymetry(target_grid; h_data[land] .= height_above_water end - if minimum_depth > 0 - shallow_ocean = h_data .> minimum_depth - h_data[shallow_ocean] .= height_above_water - end - # Build the "native" grid of the bathymetry and make a bathymetry field. Nxn = length(λ_data) Nyn = length(φ_data) @@ -160,13 +169,19 @@ function regrid_bathymetry(target_grid; native_h = Field{Center, Center, Nothing}(native_grid) set!(native_h, h_data) - target_h = interpolate_bathymetry_in_passes(native_h, target_grid; passes = interpolation_passes) + target_h = interpolate_bathymetry_in_passes(native_h, target_grid; + passes = interpolation_passes, + connected_regions_allowed, + minimum_depth) return target_h end # Here we can either use `regrid!` (three dimensional version) or `interpolate` -function interpolate_bathymetry_in_passes(native_h, target_grid; passes = 10) +function interpolate_bathymetry_in_passes(native_h, target_grid; + passes = 10, + connected_regions_allowed = 3, + minimum_depth = 0) Nλt, Nφt = Nt = size(target_grid) Nλn, Nφn = Nn = size(native_h) @@ -211,8 +226,132 @@ function interpolate_bathymetry_in_passes(native_h, target_grid; passes = 10) target_h = Field{Center, Center, Nothing}(target_grid) interpolate!(target_h, old_h) + h_data = Array(interior(target_h, :, :, 1)) + + if minimum_depth > 0 + shallow_ocean = h_data .> - minimum_depth + h_data[shallow_ocean] .= 0 + end + + h_data = remove_lakes!(h_data; connected_regions_allowed) + set!(target_h, h_data) + fill_halo_regions!(target_h) + return target_h end +""" + remove_lakes!(h_data; connected_regions_allowed = Inf) + +Remove lakes from the bathymetry data stored in `h_data`, by identifying connected regions below sea level +and removing all but the specified number of largest connected regions (which represent the ocean and +other possibly disconnected regions like the Mediterranean and the Bering sea). + +# Arguments +============ + +- `h_data`: A 2D array representing the bathymetry data. +- `connected_regions_allowed`: The maximum number of connected regions to keep. + Default is `Inf`, which means all connected regions are kept. + +""" +function remove_lakes!(h_data::Field; kw...) + data = Array(interior(h_data, :, :, 1)) + data = remove_lakes!(data; kw...) + + set!(h_data, data) + + return h_data +end + +function remove_lakes!(h_data; connected_regions_allowed = Inf) + + if connected_regions_allowed == Inf + @info "we are not removing lakes" + return h_data + end + + bathtmp = deepcopy(h_data) + batneg = zeros(Bool, size(bathtmp)...) + + batneg[bathtmp.<0] .= true + + connectivity = ImageMorphology.strel(batneg) + labels = ImageMorphology.label_components(connectivity) + + total_elements = zeros(maximum(labels)) + label_elements = zeros(maximum(labels)) + + for i in 1:lastindex(total_elements) + total_elements[i] = length(labels[labels .== i]) + label_elements[i] = i + end + + all_idx = [] + ocean_idx = findfirst(x -> x == maximum(total_elements), total_elements) + push!(all_idx, label_elements[ocean_idx]) + total_elements = filter((x) -> x != total_elements[ocean_idx], total_elements) + label_elements = filter((x) -> x != label_elements[ocean_idx], label_elements) + + for _ in 1:connected_regions_allowed + next_maximum = findfirst(x -> x == maximum(total_elements), total_elements) + push!(all_idx, label_elements[next_maximum]) + total_elements = filter((x) -> x != total_elements[next_maximum], total_elements) + label_elements = filter((x) -> x != label_elements[next_maximum], label_elements) + end + + labels = Float64.(labels) + + for i in 1:maximum(labels) + remove_lake = (&).(Tuple(i != idx for idx in all_idx)...) + if remove_lake + labels[labels .== i] .= 1e10 # Fictitious super large number + end + end + + # Removing land? + labels[labels .< 1e10] .= 0 + labels[labels .== 1e10] .= NaN + + bathtmp .+= labels + bathtmp[isnan.(bathtmp)] .= 0 + + return bathtmp +end + +""" + retrieve_bathymetry(grid, filename; kw...) + +Retrieve the bathymetry data from a file or generate it using a grid and save it to a file. + +# Arguments +============ + +- `grid`: The grid used to generate the bathymetry data. +- `filename`: The name of the file to read or save the bathymetry data. +- `kw...`: Additional keyword arguments. + +# Returns +=========== +- `bottom_height`: The retrieved or generated bathymetry data. + +If the specified file exists, the function reads the bathymetry data from the file. +Otherwise, it generates the bathymetry data using the provided grid and saves it to the file before returning it. +""" +function retrieve_bathymetry(grid, filename; kw...) + + if isfile(filename) + bottom_height = jldopen(filename)["bathymetry"] + else + bottom_height = regrid_bathymetry(grid; kw...) + jldsave(filename, bathymetry = Array(interior(bottom_height))) + end + + return bottom_height +end + +retrieve_bathymetry(grid, ::Nothing; kw...) = regrid_bathymetry(grid; kw...) +retrieve_bathymetry(grid; kw...) = regrid_bathymetry(grid; kw...) + end # module diff --git a/src/ClimaOcean.jl b/src/ClimaOcean.jl index 37114adc..f4aa943b 100644 --- a/src/ClimaOcean.jl +++ b/src/ClimaOcean.jl @@ -2,15 +2,19 @@ module ClimaOcean export OceanSeaIceModel, - FreezingLimitedOceanTemperature, + MinimumTemperatureSeaIce, Radiation, + SimilarityTheoryTurbulentFluxes, JRA55_prescribed_atmosphere, JRA55NetCDFBackend, ecco2_field, regrid_bathymetry, + retrieve_bathymetry, stretched_vertical_faces, + exponential_z_faces, PowerLawStretching, LinearStretching, jra55_field_time_series, + ocean_simulation, ecco2_field, ECCO2Metadata, initialize! @@ -18,29 +22,25 @@ using Oceananigans using Oceananigans.Operators: ℑxyᶠᶜᵃ, ℑxyᶜᶠᵃ using DataDeps -@inline ϕ²(i, j, k, grid, ϕ) = @inbounds ϕ[i, j, k]^2 -@inline spᶠᶜᶜ(i, j, k, grid, Φ) = @inbounds sqrt(Φ.u[i, j, k]^2 + ℑxyᶠᶜᵃ(i, j, k, grid, ϕ², Φ.v)) -@inline spᶜᶠᶜ(i, j, k, grid, Φ) = @inbounds sqrt(Φ.v[i, j, k]^2 + ℑxyᶜᶠᵃ(i, j, k, grid, ϕ², Φ.u)) - -@inline u_bottom_drag(i, j, grid, c, Φ, μ) = @inbounds - μ * Φ.u[i, j, 1] * spᶠᶜᶜ(i, j, 1, grid, Φ) -@inline v_bottom_drag(i, j, grid, c, Φ, μ) = @inbounds - μ * Φ.v[i, j, 1] * spᶜᶠᶜ(i, j, 1, grid, Φ) - -@inline u_immersed_bottom_drag(i, j, k, grid, c, Φ, μ) = @inbounds - μ * Φ.u[i, j, k] * spᶠᶜᶜ(i, j, k, grid, Φ) -@inline v_immersed_bottom_drag(i, j, k, grid, c, Φ, μ) = @inbounds - μ * Φ.v[i, j, k] * spᶜᶠᶜ(i, j, k, grid, Φ) - include("OceanSeaIceModels/OceanSeaIceModels.jl") include("VerticalGrids.jl") include("InitialConditions/InitialConditions.jl") include("DataWrangling/DataWrangling.jl") include("Bathymetry.jl") include("Diagnostics.jl") +include("OceanSimulations/OceanSimulations.jl") using .VerticalGrids using .Bathymetry using .DataWrangling: JRA55 using .DataWrangling: ECCO2 using .InitialConditions +using .OceanSeaIceModels: OceanSeaIceModel +using .OceanSimulations using .DataWrangling: JRA55, ECCO2 +using ClimaOcean.DataWrangling.JRA55: JRA55_prescribed_atmosphere, JRA55NetCDFBackend +using ClimaOcean.DataWrangling.ECCO2: ecco2_field + using .OceanSeaIceModels: OceanSeaIceModel, Radiation end # module diff --git a/src/DataWrangling/ECCO2.jl b/src/DataWrangling/ECCO2.jl index e4ac88b7..c1b88abe 100644 --- a/src/DataWrangling/ECCO2.jl +++ b/src/DataWrangling/ECCO2.jl @@ -3,11 +3,12 @@ module ECCO2 export ECCO2Metadata, ecco2_field, ecco2_center_mask, adjusted_ecco_tracers, initialize! using ClimaOcean.DataWrangling: inpaint_mask! -using ClimaOcean.InitialConditions: three_dimensional_regrid! +using ClimaOcean.InitialConditions: three_dimensional_regrid!, interpolate! using Oceananigans -using Oceananigans: architecture +using Oceananigans.Architectures: architecture, child_architecture using Oceananigans.BoundaryConditions +using Oceananigans.DistributedComputations: DistributedField, all_reduce, barrier! using Oceananigans.Utils using KernelAbstractions: @kernel, @index using NCDatasets @@ -23,11 +24,6 @@ struct ECCO2Metadata day :: Int end -# We only have 1992 at the moment -ECCO2Metadata(name::Symbol) = ECCO2Metadata(name, 1992, 1, 2) - -filename(data::ECCO2Metadata) = "ecco2_" * string(data.name) * "_$(data.year)$(data.month)$(data.day).nc" - const ECCO2_Nx = 1440 const ECCO2_Ny = 720 const ECCO2_Nz = 50 @@ -87,6 +83,11 @@ const ECCO2_z = [ 0.0, ] +# We only have 1992 at the moment +ECCO2Metadata(name::Symbol) = ECCO2Metadata(name, 1992, 1, 2) + +filename(data::ECCO2Metadata) = "ecco2_" * string(data.name) * "_$(data.year)$(data.month)$(data.day).nc" + ecco2_file_names = Dict( :temperature => "THETA.1440x720x50.19920102.nc", :salinity => "SALT.1440x720x50.19920102.nc", @@ -123,11 +124,6 @@ ecco2_location = Dict( :v_velocity => (Center, Face, Center), ) -ecco2_depth_names = Dict( - :temperature => "DEPTH_T", - :salinity => "DEPTH_T", -) - ecco2_urls = Dict( :temperature => "https://www.dropbox.com/scl/fi/01h96yo2fhnnvt2zkmu0d/THETA.1440x720x50.19920102.nc?rlkey=ycso2v09gc6v2qb5j0lff0tjs", :salinity => "https://www.dropbox.com/scl/fi/t068we10j5skphd461zg8/SALT.1440x720x50.19920102.nc?rlkey=r5each0ytdtzh5icedvzpe7bw", @@ -137,30 +133,8 @@ ecco2_urls = Dict( :v_velocity => "https://www.dropbox.com/scl/fi/buic35gssyeyfqohenkeo/VVEL.1440x720x50.19920102.nc?rlkey=fau48w4t5ruop4s6gm8t7z0a0", ) - -shortnames = Dict( - :temperature => "THETA", - :salinity => "SALT", - :sea_ice_thickness => "SIheff", - :sea_ice_area_fraction => "SIarea", - :u_velocity => "UVEL", - :v_velocity => "VVEL", -) - surface_variable(variable_name) = variable_name == :sea_ice_thickness -""" - construct_vertical_interfaces(ds, depth_name) - -Constructs vertical interfaces for a given dataset `ds` and depth variable `depth_name`. - -# Arguments -- `ds`: The dataset containing the depth variable. -- `depth_name`: The name of the depth variable in the dataset. - -# Returns -- `zf`: An array of interface depths. -""" function construct_vertical_interfaces(ds, depth_name) # Construct vertical coordinate depth = ds[depth_name][:] @@ -178,7 +152,7 @@ end function empty_ecco2_field(data::ECCO2Metadata; architecture = CPU(), - horizontal_halo = (1, 1)) + horizontal_halo = (5, 5)) variable_name = data.name @@ -188,24 +162,19 @@ function empty_ecco2_field(data::ECCO2Metadata; latitude = (-90, 90) TX, TY = (Periodic, Bounded) - filename = ecco2_file_names[variable_name] - - ds = Dataset(filename) - if variable_is_three_dimensional[variable_name] - depth_name = ecco2_depth_names[variable_name] - z = construct_vertical_interfaces(ds, depth_name) + z = ECCO2_z # add vertical halo for 3D fields - halo = (horizontal_halo..., 1) + halo = (horizontal_halo..., 3) LZ = Center TZ = Bounded - N = (1440, 720, 50) + N = (ECCO2_Nx, ECCO2_Ny, ECCO2_Nz) else z = nothing halo = horizontal_halo LZ = Nothing TZ = Flat - N = (1440, 720) + N = (ECCO2_Nx, ECCO2_Ny) end # Flat in z if the variable is two-dimensional @@ -232,7 +201,7 @@ The data is either: """ function ecco2_field(variable_name; architecture = CPU(), - horizontal_halo = (1, 1), + horizontal_halo = (5, 5), user_data = nothing, year = 1992, month = 1, @@ -247,7 +216,6 @@ function ecco2_field(variable_name; if user_data isa Nothing ds = Dataset(filename) - if variable_is_three_dimensional[variable_name] data = ds[short_name][:, :, :, 1] # The surface layer in three-dimensional ECCO fields is at `k = 1` @@ -261,7 +229,13 @@ function ecco2_field(variable_name; field = empty_ecco2_field(ecco2_data; architecture, horizontal_halo) FT = eltype(field) - data = convert.(FT, data) + data = if location(field)[2] == Face + new_data = zeros(FT, size(field)) + new_data[:, 1:end-1, :] .= data + new_data + else + convert.(FT, data) + end set!(field, data) fill_halo_regions!(field) @@ -277,13 +251,13 @@ end """ ecco2_center_mask(architecture = CPU(); minimum_value = Float32(-1e5)) -A boolean field where `false` represents a missing value in the ECCO2 :temperature dataset. +A boolean field where `true` represents a missing value in the ECCO2 :temperature dataset. """ function ecco2_center_mask(architecture = CPU(); minimum_value = Float32(-1e5)) Tᵢ = ecco2_field(:temperature; architecture) mask = CenterField(Tᵢ.grid, Bool) - # Set the mask with ones where T is defined + # Set the mask with ones where T is missing launch!(architecture, Tᵢ.grid, :xyz, _set_ecco2_mask!, mask, Tᵢ, minimum_value) return mask @@ -316,7 +290,7 @@ Keyword Arguments: """ function inpainted_ecco2_field(variable_name; architecture = CPU(), - filename = "./inpainted_ecco2_fields.nc", + filename = "./inpainted_ecco2_$(variable_name).nc", mask = ecco2_center_mask(architecture), kw...) @@ -324,9 +298,11 @@ function inpainted_ecco2_field(variable_name; f = ecco2_field(variable_name; architecture) # Make sure all values are extended properly - @info "In-painting ecco field $variable_name and saving it in $filename" + @info "In-painting ecco $variable_name and saving it in $filename" inpaint_mask!(f, mask; kw...) + fill_halo_regions!(f) + ds = Dataset(filename, "c") defVar(ds, string(variable_name), Array(interior(f)), ("lat", "lon", "z")) @@ -337,11 +313,13 @@ function inpainted_ecco2_field(variable_name; if haskey(ds, string(variable_name)) data = ds[variable_name][:, :, :] f = ecco2_field(variable_name; architecture, user_data = data) + fill_halo_regions!(f) else f = ecco2_field(variable_name; architecture) # Make sure all values are inpainted properly - @info "In-painting ecco field $variable_name and saving it in $filename" + @info "In-painting ecco $variable_name and saving it in $filename" inpaint_mask!(f, mask; kw...) + fill_halo_regions!(f) defVar(ds, string(variable_name), Array(interior(f)), ("lat", "lon", "z")) end @@ -352,7 +330,39 @@ function inpainted_ecco2_field(variable_name; return f end -function set!(field::Field, ecco2_metadata::ECCO2Metadata; filename="./inpainted_ecco2_fields.nc", kw...) +function set!(field::DistributedField, ecco2_metadata::ECCO2Metadata; + filename="./inpainted_ecco2_$(ecco2_metadata.name).nc", kw...) + + # Fields initialized from ECCO2 + grid = field.grid + arch = architecture(grid) + child_arch = child_architecture(arch) + name = ecco2_metadata.name + + f_ecco = if arch.local_rank == 0 # Make sure we read/write the file using only one core + mask = ecco2_center_mask(child_arch) + + inpainted_ecco2_field(name; filename, mask, + architecture = child_arch, + kw...) + else + empty_ecco2_field(ecco2_metadata; architecture = child_arch) + end + + barrier!(arch) + + # Distribute ecco field to all workers + parent(f_ecco) .= all_reduce(+, parent(f_ecco), arch) + + f_grid = Field(ecco2_location[name], grid) + interpolate!(f_grid, f_ecco) + set!(field, f_grid) + + return field +end + +function set!(field::Field, ecco2_metadata::ECCO2Metadata; + filename="./inpainted_ecco2_$(ecco2_metadata.name).nc", kw...) # Fields initialized from ECCO2 grid = field.grid @@ -365,29 +375,13 @@ function set!(field::Field, ecco2_metadata::ECCO2Metadata; filename="./inpainted kw...) f_grid = Field(ecco2_location[name], grid) - three_dimensional_regrid!(f_grid, f) + interpolate!(f_grid, f) set!(field, f_grid) return field end -function ecco2_column(λ★, φ★) - Δ = 1/4 # resolution in degrees - φ₁ = -90 + Δ/2 - φ₂ = +90 - Δ/2 - λ₁ = 0 + Δ/2 - λ₂ = 360 - Δ/2 - φe = φ₁:Δ:φ₂ - λe = λ₁:Δ:λ₂ - - i★ = searchsortedfirst(λe, λ★) - j★ = searchsortedfirst(φe, φ★) - - longitude = (λe[i★] - Δ/2, λe[i★] + Δ/2) - latitude = (φe[j★] - Δ/2, φe[j★] + Δ/2) +end # module - return i★, j★, longitude, latitude -end -end # module diff --git a/src/DataWrangling/JRA55.jl b/src/DataWrangling/JRA55.jl index b83637be..fe8dbfd5 100644 --- a/src/DataWrangling/JRA55.jl +++ b/src/DataWrangling/JRA55.jl @@ -13,7 +13,7 @@ using Oceananigans.OutputReaders: Cyclical, TotallyInMemory, AbstractInMemoryBac using ClimaOcean.OceanSeaIceModels: PrescribedAtmosphere, - TwoStreamDownwellingRadiation + TwoBandDownwellingRadiation using CUDA: @allowscalar @@ -436,9 +436,12 @@ function JRA55_field_time_series(variable_name; Nrx, Nry, Nt = size(data) close(ds) + N = (Nrx, Nry) + H = min.(N, (3, 3)) + JRA55_native_grid = LatitudeLongitudeGrid(native_fts_architecture, Float32; - halo = (3, 3), - size = (Nrx, Nry), + halo = H, + size = N, longitude = λr, latitude = φr, topology = (TX, Bounded, Flat)) @@ -559,8 +562,6 @@ function JRA55_field_time_series(variable_name; m = 1 # reset end - @show fts[m] - set!(on_disk_fts, fts[m], n, fts.times[m]) n += 1 @@ -590,7 +591,8 @@ JRA55_prescribed_atmosphere(arch::Distributed, time_indices=Colon(); kw...) = function JRA55_prescribed_atmosphere(architecture::AA, time_indices=Colon(); backend = nothing, time_indexing = Cyclical(), - reference_height = 2, # meters + reference_height = 10, # meters + include_rivers_and_icebergs = true, # rivers and icebergs are not needed in single column simulations other_kw...) if isnothing(backend) # apply a default @@ -616,11 +618,23 @@ function JRA55_prescribed_atmosphere(architecture::AA, time_indices=Colon(); pa = JRA55_field_time_series(:sea_level_pressure; kw...) Fra = JRA55_field_time_series(:rain_freshwater_flux; kw...) Fsn = JRA55_field_time_series(:snow_freshwater_flux; kw...) - Fri = JRA55_field_time_series(:river_freshwater_flux; kw...) - Fic = JRA55_field_time_series(:iceberg_freshwater_flux; kw...) Ql = JRA55_field_time_series(:downwelling_longwave_radiation; kw...) Qs = JRA55_field_time_series(:downwelling_shortwave_radiation; kw...) + freshwater_flux = (rain = Fra, + snow = Fsn) + + # Remember that rivers and icebergs are on a different grid and have + # a different frequency than the rest of the JRA55 data + if include_rivers_and_icebergs + Fri = JRA55_field_time_series(:river_freshwater_flux; kw...) + Fic = JRA55_field_time_series(:iceberg_freshwater_flux; kw...) + runoff_flux = (rivers = Fri, + icebergs = Fic) + else + runoff_flux = nothing + end + times = ua.times velocities = (u = ua, @@ -630,18 +644,18 @@ function JRA55_prescribed_atmosphere(architecture::AA, time_indices=Colon(); q = qa, r = ra) - freshwater_flux = (rain = Fra, - snow = Fsn, - rivers = Fri, - icebergs = Fic) pressure = pa - downwelling_radiation = TwoStreamDownwellingRadiation(shortwave=Qs, longwave=Ql) + downwelling_radiation = TwoBandDownwellingRadiation(shortwave=Qs, longwave=Ql) + + FT = eltype(ua) + reference_height = convert(FT, reference_height) - atmosphere = PrescribedAtmosphere(times, eltype(ua); + atmosphere = PrescribedAtmosphere(times, FT; velocities, freshwater_flux, + runoff_flux, tracers, downwelling_radiation, reference_height, diff --git a/src/DataWrangling/inpaint_mask.jl b/src/DataWrangling/inpaint_mask.jl index c6ea8c45..f5a3df19 100644 --- a/src/DataWrangling/inpaint_mask.jl +++ b/src/DataWrangling/inpaint_mask.jl @@ -76,6 +76,8 @@ function propagate_horizontally!(field, mask, tmp_field=deepcopy(field); max_ite @debug "Propagate pass $iter with sum $(sum(parent(field)))" end + fill_halo_regions!(field) + return field end diff --git a/src/InitialConditions/InitialConditions.jl b/src/InitialConditions/InitialConditions.jl index 9edc1e7b..58c36a6b 100644 --- a/src/InitialConditions/InitialConditions.jl +++ b/src/InitialConditions/InitialConditions.jl @@ -8,7 +8,7 @@ using Oceananigans.Fields: OneField using Oceananigans.Grids: peripheral_node using Oceananigans.Utils: launch! using Oceananigans.Fields: instantiated_location, interior, CenterField -using Oceananigans.Architectures: architecture, device, GPU +using Oceananigans.Architectures: architecture, device, GPU, child_architecture using KernelAbstractions: @kernel, @index using KernelAbstractions.Extras.LoopInfo: @unroll @@ -17,7 +17,7 @@ using JLD2 # Implementation of 3-dimensional regridding # TODO: move all the following to Oceananigans! -using Oceananigans.Fields: regrid! +using Oceananigans.Fields: regrid!, interpolate! using Oceananigans.Grids: cpu_face_constructor_x, cpu_face_constructor_y, cpu_face_constructor_z, @@ -37,6 +37,7 @@ function three_dimensional_regrid!(a, b) topo = topology(target_grid) arch = architecture(target_grid) + arch = child_architecture(arch) target_y = yt = cpu_face_constructor_y(target_grid) target_z = zt = cpu_face_constructor_z(target_grid) @@ -67,6 +68,41 @@ function three_dimensional_regrid!(a, b) return a end +import Oceananigans.Fields: interpolate! +using Oceananigans.Fields: _interpolate!, AbstractField +using Oceananigans.Architectures: child_architecture, architecture +using Oceananigans.Utils: launch! +using Oceananigans.BoundaryConditions + +""" + interpolate!(to_field::Field, from_field::AbstractField) + +Interpolate `from_field` `to_field` and then fill the halo regions of `to_field`. +""" +function interpolate!(to_field::Field, from_field::AbstractField) + to_grid = to_field.grid + from_grid = from_field.grid + + to_arch = child_architecture(architecture(to_field)) + from_arch = child_architecture(architecture(from_field)) + if !isnothing(from_arch) && to_arch != from_arch + msg = "Cannot interpolate! because from_field is on $from_arch while to_field is on $to_arch." + throw(ArgumentError(msg)) + end + + # Make locations + from_location = Tuple(L() for L in location(from_field)) + to_location = Tuple(L() for L in location(to_field)) + + launch!(to_arch, to_grid, size(to_field), + _interpolate!, to_field, to_grid, to_location, + from_field, from_grid, from_location) + + fill_halo_regions!(to_field) + + return nothing +end + include("diffuse_tracers.jl") end # module diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/CrossRealmFluxes.jl b/src/OceanSeaIceModels/CrossRealmFluxes/CrossRealmFluxes.jl index 8a423205..22a7764e 100644 --- a/src/OceanSeaIceModels/CrossRealmFluxes/CrossRealmFluxes.jl +++ b/src/OceanSeaIceModels/CrossRealmFluxes/CrossRealmFluxes.jl @@ -1,9 +1,11 @@ module CrossRealmFluxes using Oceananigans +using Adapt export Radiation, - OceanSeaIceSurfaceFluxes + OceanSeaIceSurfaceFluxes, + SimilarityTheoryTurbulentFluxes using ..OceanSeaIceModels: SKOFTS, default_gravitational_acceleration @@ -14,20 +16,20 @@ import ..OceanSeaIceModels: surface_velocities, ##### Utilities ##### -@inline stateindex(a::Number, i, j, k, time) = a -@inline stateindex(a::SKOFTS, i, j, k, time) = @inbounds a[i, j, k, time] -@inline stateindex(a::AbstractArray, i, j, k, time) = @inbounds a[i, j, k] -@inline Δϕt²(i, j, k, grid, ϕ1, ϕ2, time) = (stateindex(ϕ1, i, j, k, time) - stateindex(ϕ2, i, j, k, time))^2 +@inline stateindex(a::Number, i, j, k, grid, time) = a +@inline stateindex(a::SKOFTS, i, j, k, grid, time) = @inbounds a[i, j, k, time] +@inline stateindex(a::AbstractArray, i, j, k, grid, time) = @inbounds a[i, j, k] +@inline Δϕt²(i, j, k, grid, ϕ1, ϕ2, time) = (stateindex(ϕ1, i, j, k, grid, time) - stateindex(ϕ2, i, j, k, grid, time))^2 -@inline function stateindex(a::Tuple, i, j, k, time) +@inline function stateindex(a::Tuple, i, j, k, grid, time) N = length(a) ntuple(Val(N)) do n - stateindex(a[n], i, j, k, time) + stateindex(a[n], i, j, k, grid, time) end end -@inline function stateindex(a::NamedTuple, i, j, k, time) - vals = stateindex(values(a), i, j, k, time) +@inline function stateindex(a::NamedTuple, i, j, k, grid, time) + vals = stateindex(values(a), i, j, k, grid, time) names = keys(a) return NamedTuple{names}(vals) end @@ -60,9 +62,13 @@ function surface_tracers(ocean::Simulation{<:HydrostaticFreeSurfaceModel}) end include("radiation.jl") +include("tabulated_albedo.jl") +include("roughness_lengths.jl") +include("stability_functions.jl") +include("seawater_saturation_specific_humidity.jl") include("similarity_theory_turbulent_fluxes.jl") include("ocean_sea_ice_surface_fluxes.jl") +include("atmosphere_ocean_fluxes.jl") include("sea_ice_ocean_fluxes.jl") -# include("atmosphere_sea_ice_fluxes.jl") end # module diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/atmosphere_ocean_fluxes.jl b/src/OceanSeaIceModels/CrossRealmFluxes/atmosphere_ocean_fluxes.jl new file mode 100644 index 00000000..7c1c9f44 --- /dev/null +++ b/src/OceanSeaIceModels/CrossRealmFluxes/atmosphere_ocean_fluxes.jl @@ -0,0 +1,368 @@ + +##### +##### Surface flux computation +##### + +const c = Center() +const f = Face() + +function compute_atmosphere_ocean_fluxes!(coupled_model) + ocean = coupled_model.ocean + atmosphere = coupled_model.atmosphere + atmosphere_grid = atmosphere.grid + sea_ice = coupled_model.sea_ice + + # Basic model properties + grid = ocean.model.grid + arch = architecture(grid) + clock = coupled_model.clock + + # Ocean, atmosphere, and sea ice state + ocean_velocities = surface_velocities(ocean) + ocean_tracers = surface_tracers(ocean) + + # Fluxes, and flux contributors + centered_velocity_fluxes = (u = coupled_model.fluxes.total.ocean.momentum.uᶜᶜᶜ, + v = coupled_model.fluxes.total.ocean.momentum.vᶜᶜᶜ) + + staggered_velocity_fluxes = (u = coupled_model.fluxes.total.ocean.momentum.u, + v = coupled_model.fluxes.total.ocean.momentum.v) + + net_tracer_fluxes = coupled_model.fluxes.total.ocean.tracers + similarity_theory = coupled_model.fluxes.turbulent + radiation_properties = coupled_model.fluxes.radiation + + ocean_state = merge(ocean_velocities, ocean_tracers) + + atmosphere_velocities = map(u -> u.data, atmosphere.velocities) + atmosphere_tracers = map(c -> c.data, atmosphere.tracers) + atmosphere_pressure = atmosphere.pressure.data + + atmosphere_state = merge(atmosphere_velocities, atmosphere_tracers, (; p=atmosphere_pressure)) + freshwater_flux = map(ϕ -> ϕ.data, atmosphere.freshwater_flux) + + u = atmosphere.velocities.u # for example + atmosphere_times = u.times + atmosphere_backend = u.backend + atmosphere_time_indexing = u.time_indexing + + runoff_args = get_runoff_args(atmosphere.runoff_flux) + + Qs = atmosphere.downwelling_radiation.shortwave + Ql = atmosphere.downwelling_radiation.longwave + + downwelling_radiation = (shortwave=Qs.data, longwave=Ql.data) + + kernel_size = (size(grid, 1) + 2, size(grid, 2) + 2) + + # kernel parameters that compute fluxes in 0:Nx+1 and 0:Ny+1 + kernel_parameters = KernelParameters(kernel_size, (-1, -1)) + + launch!(arch, grid, kernel_parameters, _compute_atmosphere_ocean_similarity_theory_fluxes!, + similarity_theory, + grid, + clock, + ocean_state, + coupled_model.fluxes.ocean_temperature_units, + atmosphere_state, + atmosphere_grid, + atmosphere_times, + atmosphere_backend, + atmosphere_time_indexing, + atmosphere.reference_height, # height at which the state is known + atmosphere.boundary_layer_height, + atmosphere.thermodynamics_parameters) + + launch!(arch, grid, kernel_parameters, _assemble_atmosphere_ocean_fluxes!, + centered_velocity_fluxes, + net_tracer_fluxes, + grid, + clock, + ocean_state.T, + ocean_state.S, + coupled_model.fluxes.ocean_temperature_units, + similarity_theory.fields, + downwelling_radiation, + freshwater_flux, + atmosphere_grid, + atmosphere_times, + atmosphere_backend, + atmosphere_time_indexing, + runoff_args, + radiation_properties, + coupled_model.fluxes.ocean_reference_density, + coupled_model.fluxes.ocean_heat_capacity, + coupled_model.fluxes.freshwater_density) + + limit_fluxes_over_sea_ice!(grid, kernel_parameters, sea_ice, + centered_velocity_fluxes, + net_tracer_fluxes, + ocean_state.T, + ocean_state.S) + + launch!(arch, grid, :xy, reconstruct_momentum_fluxes!, + grid, staggered_velocity_fluxes, centered_velocity_fluxes) + + return nothing +end + +# Fallback +@inline convert_to_intrinsic_reference_frame(i, j, k, grid, uₒ, vₒ) = uₒ, vₒ +@inline convert_to_extrinsic_reference_frame(i, j, k, grid, uₒ, vₒ) = uₒ, vₒ + +# Fallback! +limit_fluxes_over_sea_ice!(args...) = nothing + +@kernel function _compute_atmosphere_ocean_similarity_theory_fluxes!(similarity_theory, + grid, + clock, + ocean_state, + ocean_temperature_units, + atmos_state, + atmos_grid, + atmos_times, + atmos_backend, + atmos_time_indexing, + atmosphere_reference_height, + atmosphere_boundary_layer_height, + atmos_thermodynamics_parameters) + + i, j = @index(Global, NTuple) + kᴺ = size(grid, 3) + + time = Time(clock.time) + + # Extract state variables at cell centers + @inbounds begin + # Ocean state + uₒ = ℑxᶜᵃᵃ(i, j, 1, grid, ocean_state.u) + vₒ = ℑyᵃᶜᵃ(i, j, 1, grid, ocean_state.v) + Tₒ = ocean_state.T[i, j, 1] + Tₒ = convert_to_kelvin(ocean_temperature_units, Tₒ) + Sₒ = ocean_state.S[i, j, 1] + end + + kᴺ = size(grid, 3) # index of the top ocean cell + + # Convert the native grid velocities to a zonal - meridional + # frame of reference (assuming the frame of reference is + # latitude - longitude here, we might want to change it) + uₒ, vₒ = convert_to_intrinsic_reference_frame(i, j, kᴺ, grid, uₒ, vₒ) + + @inbounds begin + # Atmos state, which is _assumed_ to exist at location = (c, c, nothing) + # The third index "k" should not matter but we put the correct index to get + # a surface node anyways. + X = node(i, j, kᴺ + 1, grid, c, c, f) + atmos_args = (atmos_grid, atmos_times, atmos_backend, atmos_time_indexing) + + uₐ = interp_atmos_time_series(atmos_state.u, X, time, atmos_args...) + vₐ = interp_atmos_time_series(atmos_state.v, X, time, atmos_args...) + + Tₐ = interp_atmos_time_series(atmos_state.T, X, time, atmos_args...) + pₐ = interp_atmos_time_series(atmos_state.p, X, time, atmos_args...) + qₐ = interp_atmos_time_series(atmos_state.q, X, time, atmos_args...) + end + + # Build thermodynamic and dynamic states in the atmosphere and surface. + # Notation: + # ⋅ 𝒬 ≡ thermodynamic state vector + # ⋅ 𝒰 ≡ "dynamic" state vector (thermodynamics + reference height + velocity) + ℂₐ = atmos_thermodynamics_parameters + 𝒬ₐ = thermodynamic_atmospheric_state = AtmosphericThermodynamics.PhaseEquil_pTq(ℂₐ, pₐ, Tₐ, qₐ) + + hₐ = atmosphere_reference_height # elevation of atmos variables relative to surface + Uₐ = SVector(uₐ, vₐ) + 𝒰ₐ = dynamic_atmos_state = SurfaceFluxes.StateValues(hₐ, Uₐ, 𝒬ₐ) + + # Build surface state with saturated specific humidity + surface_type = AtmosphericThermodynamics.Liquid() + qₒ = seawater_saturation_specific_humidity(ℂₐ, Tₒ, Sₒ, 𝒬ₐ, + similarity_theory.water_mole_fraction, + similarity_theory.water_vapor_saturation, + surface_type) + + # Thermodynamic and dynamic surface state + 𝒬₀ = thermodynamic_surface_state = AtmosphericThermodynamics.PhaseEquil_pTq(ℂₐ, pₐ, Tₒ, qₒ) + + h₀ = zero(grid) # surface height + Uₒ = SVector(uₒ, vₒ) + 𝒰₀ = dynamic_ocean_state = SurfaceFluxes.StateValues(h₀, Uₒ, 𝒬₀) + + Qv = similarity_theory.fields.latent_heat + Qc = similarity_theory.fields.sensible_heat + Fv = similarity_theory.fields.water_vapor + τx = similarity_theory.fields.x_momentum + τy = similarity_theory.fields.y_momentum + + g = default_gravitational_acceleration + ϰ = similarity_theory.von_karman_constant + + inactive = inactive_node(i, j, kᴺ, grid, c, c, c) + maxiter = ifelse(inactive, 1, similarity_theory.maxiter) + + turbulent_fluxes = compute_similarity_theory_fluxes(similarity_theory, + dynamic_ocean_state, + dynamic_atmos_state, + atmosphere_boundary_layer_height, + ℂₐ, g, ϰ, maxiter) + + # Convert back from a zonal - meridional flux to the frame of + # reference of the native ocean grid + τˣ, τʸ = convert_to_extrinsic_reference_frame(i, j, kᴺ, grid, turbulent_fluxes.x_momentum, + turbulent_fluxes.y_momentum) + + @inbounds begin + # +0: cooling, -0: heating + Qv[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.latent_heat) + Qc[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.sensible_heat) + Fv[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.water_vapor) + τx[i, j, 1] = ifelse(inactive, 0, τˣ) + τy[i, j, 1] = ifelse(inactive, 0, τʸ) + end +end + +@kernel function _assemble_atmosphere_ocean_fluxes!(centered_velocity_fluxes, + net_tracer_fluxes, + grid, + clock, + ocean_temperature, + ocean_salinity, + ocean_temperature_units, + similarity_theory_fields, + downwelling_radiation, + prescribed_freshwater_flux, + atmos_grid, + atmos_times, + atmos_backend, + atmos_time_indexing, + runoff_args, + radiation_properties, + ocean_reference_density, + ocean_heat_capacity, + freshwater_density) + + i, j = @index(Global, NTuple) + kᴺ = size(grid, 3) + time = Time(clock.time) + + @inbounds begin + Tₒ = ocean_temperature[i, j, 1] + Tₒ = convert_to_kelvin(ocean_temperature_units, Tₒ) + Sₒ = ocean_salinity[i, j, 1] + + X = node(i, j, kᴺ + 1, grid, c, c, f) + atmos_args = (atmos_grid, atmos_times, atmos_backend, atmos_time_indexing) + + Qs = interp_atmos_time_series(downwelling_radiation.shortwave, X, time, atmos_args...) + Qℓ = interp_atmos_time_series(downwelling_radiation.longwave, X, time, atmos_args...) + + # Accumulate mass fluxes of freshwater due to rain, snow, rivers, icebergs, and whatever else. + # Rememeber runoff fluxes could be `nothing` if rivers and icebergs are not included in the forcing + Mp = interp_atmos_time_series(prescribed_freshwater_flux, X, time, atmos_args...) + Mr = get_runoff_flux(X, time, runoff_args) + + Qc = similarity_theory_fields.sensible_heat[i, j, 1] # sensible or "conductive" heat flux + Qv = similarity_theory_fields.latent_heat[i, j, 1] # latent heat flux + Mv = similarity_theory_fields.water_vapor[i, j, 1] # mass flux of water vapor + τx = similarity_theory_fields.x_momentum[i, j, 1] # zonal momentum flux + τy = similarity_theory_fields.y_momentum[i, j, 1] # meridional momentum flux + end + + # Compute heat fluxes, bulk flux first + Qd = net_downwelling_radiation(i, j, grid, time, radiation_properties, Qs, Qℓ) + Qu = net_upwelling_radiation(i, j, grid, time, radiation_properties, Tₒ) + + ΣQ = Qd + Qu + Qc + Qv + + # Convert from a mass flux to a volume flux (aka velocity) + # by dividing by the density of freshwater. + # Also switch the sign, for some reason we are given freshwater flux as positive down. + ρᶠ = freshwater_density + ΣF = - (Mp + Mr) / ρᶠ + + # Add the contribution from the turbulent water vapor flux + Fv = Mv / ρᶠ + ΣF += Fv + + # Compute fluxes for u, v, T, S from momentum, heat, and freshwater fluxes + Jᵘ = centered_velocity_fluxes.u + Jᵛ = centered_velocity_fluxes.v + Jᵀ = net_tracer_fluxes.T + Jˢ = net_tracer_fluxes.S + + ρₒ = ocean_reference_density + cₒ = ocean_heat_capacity + + atmos_ocean_Jᵘ = τx / ρₒ + atmos_ocean_Jᵛ = τy / ρₒ + atmos_ocean_Jᵀ = ΣQ / (ρₒ * cₒ) + atmos_ocean_Jˢ = - Sₒ * ΣF + + # Mask fluxes over land for convenience + inactive = inactive_node(i, j, kᴺ, grid, c, c, c) + + @inbounds begin + Jᵘ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jᵘ) + Jᵛ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jᵛ) + Jᵀ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jᵀ) + Jˢ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jˢ) + end +end + +@kernel function reconstruct_momentum_fluxes!(grid, J, Jᶜᶜᶜ) + i, j = @index(Global, NTuple) + + @inbounds begin + J.u[i, j, 1] = ℑxᶠᵃᵃ(i, j, 1, grid, Jᶜᶜᶜ.u) + J.v[i, j, 1] = ℑyᵃᶠᵃ(i, j, 1, grid, Jᶜᶜᶜ.v) + end +end + +# Fallback for a `Nothing` radiation scheme +@inline net_upwelling_radiation(i, j, grid, time, ::Nothing, Tₒ) = zero(grid) +@inline net_downwelling_radiation(i, j, grid, time, ::Nothing, Qs, Qℓ) = zero(grid) + +@inline function net_downwelling_radiation(i, j, grid, time, radiation, Qs, Qℓ) + α = stateindex(radiation.reflection.ocean, i, j, 1, grid, time) + ϵ = stateindex(radiation.emission.ocean, i, j, 1, grid, time) + + return @inbounds - (1 - α) * Qs - ϵ * Qℓ +end + +@inline function net_upwelling_radiation(i, j, grid, time, radiation, Tₒ) + σ = radiation.stefan_boltzmann_constant + ϵ = stateindex(radiation.emission.ocean, i, j, 1, grid, time) + + # Note: positive implies _upward_ heat flux, and therefore cooling. + return ϵ * σ * Tₒ^4 +end + +# Retrieve the details of runoff fluxes (rivers and icebergs, if present in the simulation). +# Note that these forcing fields are different in terms of frequency (daily instead of three-hourly) +# and gridsize (1/4 degree instead of 1/2 degree) when compared to the other prescribed fluxes +# So they need to be interpolated using their own grid / times / backend / time_indexing +@inline get_runoff_args(::Nothing) = nothing + +@inline function get_runoff_args(runoff_flux) + + data = map(ϕ -> ϕ.data, runoff_flux) + grid = runoff_flux.rivers.grid + times = runoff_flux.rivers.times + backend = runoff_flux.rivers.backend + time_indexing = runoff_flux.rivers.time_indexing + + return (data, grid, times, backend, time_indexing) +end + +@inline get_runoff_flux(X, time, ::Nothing) = zero(eltype(X)) + +@inline function get_runoff_flux(X, time, runoff_args) + + @inbounds runoff_flux = runoff_args[1] # The data is located at position 1 of the tuple + @inbounds other_args = runoff_args[2:end] # Other args contain grid, times, backend and time_indexing + + Mr = interp_atmos_time_series(runoff_flux, X, time, other_args...) + + return Mr +end diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/ocean_sea_ice_surface_fluxes.jl b/src/OceanSeaIceModels/CrossRealmFluxes/ocean_sea_ice_surface_fluxes.jl index a71484e5..61899ac1 100644 --- a/src/OceanSeaIceModels/CrossRealmFluxes/ocean_sea_ice_surface_fluxes.jl +++ b/src/OceanSeaIceModels/CrossRealmFluxes/ocean_sea_ice_surface_fluxes.jl @@ -14,7 +14,7 @@ using Oceananigans: HydrostaticFreeSurfaceModel, architecture using Oceananigans.Grids: inactive_node, node using Oceananigans.BoundaryConditions: fill_halo_regions! using Oceananigans.Fields: ConstantField, interpolate -using Oceananigans.Utils: launch!, Time +using Oceananigans.Utils: launch!, Time, KernelParameters # using Oceananigans.OutputReaders: extract_field_time_series, update_field_time_series! @@ -58,6 +58,7 @@ function OceanSeaIceSurfaceFluxes(ocean, sea_ice=nothing; radiation = nothing, freshwater_density = 1000, ocean_temperature_units = DegreesCelsius(), + similarity_theory = nothing, ocean_reference_density = reference_density(ocean), ocean_heat_capacity = heat_capacity(ocean)) @@ -72,9 +73,9 @@ function OceanSeaIceSurfaceFluxes(ocean, sea_ice=nothing; # It's the "thermodynamics gravitational acceleration" # (as opposed to the one used for the free surface) gravitational_acceleration = ocean.model.buoyancy.model.gravitational_acceleration - similarity_theory = SimilarityTheoryTurbulentFluxes(grid; gravitational_acceleration) - else - similarity_theory = nothing + if isnothing(similarity_theory) + similarity_theory = SimilarityTheoryTurbulentFluxes(grid; gravitational_acceleration) + end end prescribed_fluxes = nothing @@ -124,327 +125,7 @@ function OceanSeaIceSurfaceFluxes(ocean, sea_ice=nothing; freshwater_density, ocean_temperature_units) end - -##### -##### Surface flux computation -##### - -const c = Center() -const f = Face() - -function compute_atmosphere_ocean_fluxes!(coupled_model) - ocean = coupled_model.ocean - sea_ice = coupled_model.sea_ice - atmosphere = coupled_model.atmosphere - atmosphere_grid = atmosphere.grid - - # Basic model properties - grid = ocean.model.grid - arch = architecture(grid) - clock = coupled_model.clock - - # Ocean, atmosphere, and sea ice state - ocean_velocities = surface_velocities(ocean) - ocean_tracers = surface_tracers(ocean) - ice_concentration = sea_ice_concentration(sea_ice) - - # Fluxes, and flux contributors - centered_velocity_fluxes = (u = coupled_model.fluxes.total.ocean.momentum.uᶜᶜᶜ, - v = coupled_model.fluxes.total.ocean.momentum.vᶜᶜᶜ) - - staggered_velocity_fluxes = (u = coupled_model.fluxes.total.ocean.momentum.u, - v = coupled_model.fluxes.total.ocean.momentum.v) - - net_tracer_fluxes = coupled_model.fluxes.total.ocean.tracers - similarity_theory = coupled_model.fluxes.turbulent - prescribed_fluxes = coupled_model.fluxes.prescribed - radiation_properties = coupled_model.fluxes.radiation - - ocean_state = merge(ocean_velocities, ocean_tracers) - - atmosphere_velocities = map(u -> u.data, atmosphere.velocities) - atmosphere_tracers = map(c -> c.data, atmosphere.tracers) - atmosphere_pressure = atmosphere.pressure.data - - atmosphere_state = merge(atmosphere_velocities, atmosphere_tracers, (; p=atmosphere_pressure)) - freshwater_flux = map(ϕ -> ϕ.data, atmosphere.freshwater_flux) - - u = atmosphere.velocities.u # for example - atmosphere_times = u.times - atmosphere_backend = u.backend - atmosphere_time_indexing = u.time_indexing - - Qs = atmosphere.downwelling_radiation.shortwave - Ql = atmosphere.downwelling_radiation.longwave - downwelling_radiation = (shortwave=Qs.data, longwave=Ql.data) - - launch!(arch, grid, :xy, compute_atmosphere_ocean_similarity_theory_fluxes!, - similarity_theory.fields, - grid, - clock, - ocean_state, - coupled_model.fluxes.ocean_temperature_units, - atmosphere_state, - atmosphere_grid, - atmosphere_times, - atmosphere_backend, - atmosphere_time_indexing, - atmosphere.reference_height, # height at which the state is known - atmosphere.thermodynamics_parameters, - similarity_theory.roughness_lengths) - - launch!(arch, grid, :xy, assemble_atmosphere_ocean_fluxes!, - centered_velocity_fluxes, - net_tracer_fluxes, - grid, - clock, - ocean_state.T, - ocean_state.S, - coupled_model.fluxes.ocean_temperature_units, - similarity_theory.fields, - downwelling_radiation, - freshwater_flux, - atmosphere_grid, - atmosphere_times, - atmosphere_backend, - atmosphere_time_indexing, - radiation_properties, - coupled_model.fluxes.ocean_reference_density, - coupled_model.fluxes.ocean_heat_capacity, - coupled_model.fluxes.freshwater_density) - - # Note: I think this can be avoided if we modify the preceding kernel - # to compute from 0:Nx+1, ie in halo regions - fill_halo_regions!(centered_velocity_fluxes) - - launch!(arch, grid, :xy, reconstruct_momentum_fluxes!, - grid, staggered_velocity_fluxes, centered_velocity_fluxes) - - return nothing -end - -const c = Center() -const f = Face() - -@kernel function compute_atmosphere_ocean_similarity_theory_fluxes!(similarity_theory_fields, - grid, - clock, - ocean_state, - ocean_temperature_units, - atmos_state, - atmos_grid, - atmos_times, - atmos_backend, - atmos_time_indexing, - atmosphere_reference_height, - atmos_thermodynamics_parameters, - roughness_lengths) - - i, j = @index(Global, NTuple) - kᴺ = size(grid, 3) - - time = Time(clock.time) - - # Extract state variables at cell centers - @inbounds begin - # Ocean state - uₒ = ℑxᶜᵃᵃ(i, j, 1, grid, ocean_state.u) - vₒ = ℑyᵃᶜᵃ(i, j, 1, grid, ocean_state.v) - Tₒ = ocean_state.T[i, j, 1] - Tₒ = convert_to_kelvin(ocean_temperature_units, Tₒ) - Sₒ = ocean_state.S[i, j, 1] - end - - @inbounds begin - # Atmos state, which is _assumed_ to exist at location = (c, c, nothing) - # The third index "k" should not matter but we put the correct index to get - # a surface node anyways. - X = node(i, j, kᴺ + 1, grid, c, c, f) - atmos_args = (atmos_grid, atmos_times, atmos_backend, atmos_time_indexing) - - uₐ = interp_atmos_time_series(atmos_state.u, X, time, atmos_args...) - vₐ = interp_atmos_time_series(atmos_state.v, X, time, atmos_args...) - - Tₐ = interp_atmos_time_series(atmos_state.T, X, time, atmos_args...) - pₐ = interp_atmos_time_series(atmos_state.p, X, time, atmos_args...) - qₐ = interp_atmos_time_series(atmos_state.q, X, time, atmos_args...) - end - - # Build thermodynamic and dynamic states in the atmosphere and surface. - # Notation: - # ⋅ 𝒬 ≡ thermodynamic state vector - # ⋅ 𝒰 ≡ "dynamic" state vector (thermodynamics + reference height + velocity) - ℂₐ = atmos_thermodynamics_parameters - 𝒬ₐ = thermodynamic_atmospheric_state = AtmosphericThermodynamics.PhaseEquil_pTq(ℂₐ, pₐ, Tₐ, qₐ) - - hₐ = atmosphere_reference_height # elevation of atmos variables relative to surface - Uₐ = SVector(uₐ, vₐ) - 𝒰ₐ = dynamic_atmos_state = SurfaceFluxes.StateValues(hₐ, Uₐ, 𝒬ₐ) - - # Build surface state with saturated specific humidity - surface_type = AtmosphericThermodynamics.Liquid() - qₒ = seawater_saturation_specific_humidity(ℂₐ, Tₒ, Sₒ, 𝒬ₐ, - 0.98, #similarity_theory.water_mole_fraction, - ClasiusClapyeronSaturation(), #similarity_theory.water_vapor_saturation, - surface_type) - # Thermodynamic and dynamic surface state - 𝒬₀ = thermodynamic_surface_state = AtmosphericThermodynamics.PhaseEquil_pTq(ℂₐ, pₐ, Tₒ, qₒ) - - h₀ = zero(grid) # surface height - Uₒ = SVector(uₒ, vₒ) - 𝒰₀ = dynamic_ocean_state = SurfaceFluxes.StateValues(h₀, Uₒ, 𝒬₀) - - Qv = similarity_theory_fields.latent_heat - Qc = similarity_theory_fields.sensible_heat - Fv = similarity_theory_fields.water_vapor - τx = similarity_theory_fields.x_momentum - τy = similarity_theory_fields.y_momentum - - @inbounds begin - Qcᵢ = Qc[i, j, 1] - Fvᵢ = Fv[i, j, 1] - τxᵢ = τx[i, j, 1] - τyᵢ = τy[i, j, 1] - end - - # Compute initial guess based on previous fluxes - ρₐ = AtmosphericThermodynamics.air_density(ℂₐ, 𝒬ₐ) - cₚ = AtmosphericThermodynamics.cp_m(ℂₐ, 𝒬ₐ) # moist heat capacity - - u★ = sqrt(sqrt(τxᵢ^2 + τyᵢ^2)) - θ★ = - Qcᵢ / (ρₐ * cₚ * u★) - q★ = - Fvᵢ / (ρₐ * u★) - Σ★ = SimilarityScales(u★, θ★, q★) - - g = default_gravitational_acceleration - ϰ = 0.4 - turbulent_fluxes = compute_similarity_theory_fluxes(roughness_lengths, - dynamic_ocean_state, - dynamic_atmos_state, - ℂₐ, g, ϰ, Σ★) - - kᴺ = size(grid, 3) # index of the top ocean cell - - inactive = inactive_node(i, j, kᴺ, grid, c, c, c) - - @inbounds begin - # +0: cooling, -0: heating - Qv[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.latent_heat) - Qc[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.sensible_heat) - Fv[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.water_vapor) - τx[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.x_momentum) - τy[i, j, 1] = ifelse(inactive, 0, turbulent_fluxes.y_momentum) - end -end - -@kernel function assemble_atmosphere_ocean_fluxes!(centered_velocity_fluxes, - net_tracer_fluxes, - grid, - clock, - ocean_temperature, - ocean_salinity, - ocean_temperature_units, - similarity_theory_fields, - downwelling_radiation, - prescribed_freshwater_flux, - atmos_grid, - atmos_times, - atmos_backend, - atmos_time_indexing, - radiation_properties, - ocean_reference_density, - ocean_heat_capacity, - freshwater_density) - - i, j = @index(Global, NTuple) - kᴺ = size(grid, 3) - time = Time(clock.time) - - @inbounds begin - Tₒ = ocean_temperature[i, j, 1] - Tₒ = convert_to_kelvin(ocean_temperature_units, Tₒ) - Sₒ = ocean_salinity[i, j, 1] - - X = node(i, j, kᴺ + 1, grid, c, c, f) - atmos_args = (atmos_grid, atmos_times, atmos_backend, atmos_time_indexing) - - Qs = interp_atmos_time_series(downwelling_radiation.shortwave, X, time, atmos_args...) - Qℓ = interp_atmos_time_series(downwelling_radiation.longwave, X, time, atmos_args...) - - # Accumulate mass fluxes of freshwater due to rain, snow, rivers, - # icebergs, and whatever else. - Mp = interp_atmos_time_series(prescribed_freshwater_flux, X, time, atmos_args...) - - Qc = similarity_theory_fields.sensible_heat[i, j, 1] # sensible or "conductive" heat flux - Qv = similarity_theory_fields.latent_heat[i, j, 1] # latent heat flux - Mv = similarity_theory_fields.water_vapor[i, j, 1] # mass flux of water vapor - τx = similarity_theory_fields.x_momentum[i, j, 1] # zonal momentum flux - τy = similarity_theory_fields.y_momentum[i, j, 1] # meridional momentum flux - end - - # Compute heat fluxes, bulk flux first - Qd = net_downwelling_radiation(i, j, grid, time, Qs, Qℓ, radiation_properties) - Qu = net_upwelling_radiation(i, j, grid, time, radiation_properties, Tₒ) - ΣQ = Qd + Qu + Qc + Qv - - # Convert from a mass flux to a volume flux (aka velocity) - # by dividing by the density of freshwater. - # Also switch the sign, for some reason we are given freshwater flux as positive down. - ρᶠ = freshwater_density - ΣF = - Mp / ρᶠ - - # Add the contribution from the turbulent water vapor flux - Fv = Mv / ρᶠ - ΣF += Fv - - # Compute fluxes for u, v, T, S from momentum, heat, and freshwater fluxes - Jᵘ = centered_velocity_fluxes.u - Jᵛ = centered_velocity_fluxes.v - Jᵀ = net_tracer_fluxes.T - Jˢ = net_tracer_fluxes.S - - ρₒ = ocean_reference_density - cₒ = ocean_heat_capacity - - atmos_ocean_Jᵘ = τx / ρₒ - atmos_ocean_Jᵛ = τy / ρₒ - atmos_ocean_Jᵀ = ΣQ / (ρₒ * cₒ) - atmos_ocean_Jˢ = - Sₒ * ΣF - - # Mask fluxes over land for convenience - inactive = inactive_node(i, j, kᴺ, grid, c, c, c) - - @inbounds begin - Jᵘ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jᵘ) - Jᵛ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jᵛ) - Jᵀ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jᵀ) - Jˢ[i, j, 1] = ifelse(inactive, 0, atmos_ocean_Jˢ) - end -end - -@kernel function reconstruct_momentum_fluxes!(grid, J, Jᶜᶜᶜ) - i, j = @index(Global, NTuple) - - @inbounds begin - J.u[i, j, 1] = ℑxᶠᵃᵃ(i, j, 1, grid, Jᶜᶜᶜ.u) - J.v[i, j, 1] = ℑyᵃᶠᵃ(i, j, 1, grid, Jᶜᶜᶜ.v) - end -end - -@inline function net_downwelling_radiation(i, j, grid, time, Qs, Qℓ, radiation) - α = stateindex(radiation.reflection.ocean, i, j, 1, time) - return @inbounds - (1 - α) * Qs - Qℓ -end - -@inline function net_upwelling_radiation(i, j, grid, time, radiation, Tₒ) - σ = radiation.stefan_boltzmann_constant - ϵ = stateindex(radiation.emission.ocean, i, j, 1, time) - - # Note: positive implies _upward_ heat flux, and therefore cooling. - return ϵ * σ * Tₒ^4 -end - ##### ##### Utility for interpolating tuples of fields ##### diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/radiation.jl b/src/OceanSeaIceModels/CrossRealmFluxes/radiation.jl index f9ca57be..e0998b51 100644 --- a/src/OceanSeaIceModels/CrossRealmFluxes/radiation.jl +++ b/src/OceanSeaIceModels/CrossRealmFluxes/radiation.jl @@ -1,13 +1,48 @@ +using Oceananigans.Grids: φnode + +@inline hack_cosd(φ) = cos(π * φ / 180) +@inline hack_sind(φ) = sin(π * φ / 180) + struct Radiation{FT, E, R} emission :: E reflection :: R stefan_boltzmann_constant :: FT end -function Radiation(FT=Float64; +Adapt.adapt_structure(to, r :: Radiation) = + Radiation(Adapt.adapt(to, r.emission), + Adapt.adapt(to, r.reflection), + Adapt.adapt(to, r.stefan_boltzmann_constant)) + +""" + Radiation([arch = CPU(), FT=Float64]; + ocean_emissivity = 0.97, + sea_ice_emissivity = 1.0, + ocean_albedo = TabulatedAlbedo(arch, FT), + sea_ice_albedo = 0.7, + stefan_boltzmann_constant = 5.67e-8) + +Constructs a `Radiation` object that represents the radiation properties of the ocean and sea ice. + +# Arguments +=========== + +- `arch`: The architecture of the system (default: `CPU()`). +- `FT`: The floating-point type to use (default: `Float64`). + +# Keyword Arguments +=================== + +- `ocean_emissivity`: The emissivity of the ocean surface (default: `0.97`). +- `sea_ice_emissivity`: The emissivity of the sea ice surface (default: `1.0`). +- `ocean_albedo`: The albedo of the ocean surface (default: `LatitudeDependentAlbedo(FT)`). +- `sea_ice_albedo`: The albedo of the sea ice surface (default: `0.7`). +- `stefan_boltzmann_constant`: The Stefan-Boltzmann constant (default: `5.67e-8`). +""" +function Radiation(arch = CPU(), FT=Float64; ocean_emissivity = 0.97, sea_ice_emissivity = 1.0, - ocean_albedo = 0.3, + ocean_albedo = TabulatedAlbedo(arch, FT), sea_ice_albedo = 0.7, stefan_boltzmann_constant = 5.67e-8) @@ -25,10 +60,58 @@ function Radiation(FT=Float64; end Base.summary(r::Radiation) = "Radiation" -Base.show(io::IO, r::Radiation) = print(io, summary(osf)) +Base.show(io::IO, r::Radiation) = print(io, summary(r)) + +struct LatitudeDependentAlbedo{FT} + direct :: FT + diffuse :: FT +end + +""" + LatitudeDependentAlbedo([FT::DataType=Float64]; diffuse = 0.069, direct = 0.011) + +Constructs a `LatitudeDependentAlbedo` object. The albedo of the ocean surface is assumed to be a function of the latitude, +obeying the following formula (Large and Yeager, 2009): + + α(φ) = α.diffuse - α.direct * cos(2φ) + +where `φ` is the latitude, `α.diffuse` is the diffuse albedo, and `α_.irect` is the direct albedo. + +# Arguments +=========== + +- `FT::DataType`: The data type of the albedo values. Default is `Float64`. + +# Keyword Arguments +=================== +- `diffuse`: The diffuse albedo value. Default is `0.069`. +- `direct`: The direct albedo value. Default is `0.011`. +""" +function LatitudeDependentAlbedo(FT::DataType=Float64; + diffuse = 0.069, + direct = 0.011) + + return LatitudeDependentAlbedo(convert(FT, direct), + convert(FT, diffuse)) +end + +Adapt.adapt_structure(to, α::LatitudeDependentAlbedo) = + LatitudeDependentAlbedo(Adapt.adapt(to, α.direct), + Adapt.adapt(to, α.diffuse)) + +@inline function stateindex(α::LatitudeDependentAlbedo, i, j, k, grid, time) + φ = φnode(i, j, k, grid, Center(), Center(), Center()) + α_diffuse = α.diffuse + direct_correction = α.direct * hack_cosd(2φ) + + return α_diffuse - direct_correction +end struct SurfaceProperties{O, I} ocean :: O sea_ice :: I end +Adapt.adapt_structure(to, s :: SurfaceProperties) = + SurfaceProperties(Adapt.adapt(to, s.ocean), + Adapt.adapt(to, s.sea_ice)) diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/roughness_lengths.jl b/src/OceanSeaIceModels/CrossRealmFluxes/roughness_lengths.jl new file mode 100644 index 00000000..71974b3b --- /dev/null +++ b/src/OceanSeaIceModels/CrossRealmFluxes/roughness_lengths.jl @@ -0,0 +1,178 @@ +struct MomentumRoughnessLength{FT, V} + gravitational_acceleration :: FT + air_kinematic_viscosity :: V + gravity_wave_parameter :: FT + laminar_parameter :: FT + maximum_roughness_length :: FT +end + +struct ScalarRoughnessLength{FT, V, R} + air_kinematic_viscosity :: V + reynolds_number_scaling_function :: R + maximum_roughness_length :: FT +end + +""" + ScalarRoughnessLength([FT=Float64]; + air_kinematic_viscosity = temperature_dependent_viscosity, + reynolds_number_scaling_function = empirical_scaling_function, + maximum_roughness_length = 1.6e-4) + +Constructs a `ScalarRoughnessLength` object that represents the scalar roughness length +that regulates the exchange of heat and water vapor between the ocean and the atmosphere. + +Keyword Arguments +================== + +- `air_kinematic_viscosity::Function`: The function to compute the air kinematic viscosity. +- `reynolds_number_scaling_function::Function`: The function to compute the Reynolds number scaling factor. +- `maximum_roughness_length::Float`: The maximum roughness length value. Defaults to `1.6e-4`. +""" +function ScalarRoughnessLength(FT=Float64; + air_kinematic_viscosity = TemperatureDependentAirViscosity(FT), + reynolds_number_scaling_function = ReynoldsScalingFunction(FT), + maximum_roughness_length = 1.6e-4) # Values from COARE3.6 + + return ScalarRoughnessLength(air_kinematic_viscosity, + reynolds_number_scaling_function, + convert(FT, maximum_roughness_length)) +end + +""" + MomentumRoughnessLength([FT=Float64]; + air_kinematic_viscosity = temperature_dependent_viscosity, + reynolds_number_scaling_function = empirical_scaling_function, + maximum_roughness_length = 1.6e-4) + +Constructs a `MomentumRoughnessLength` object that represents the momentum roughness length that +regulates the exchange of momentum, heat, and water vapor between the ocean and the atmosphere. + +Keyword Arguments +================== + +- `gravitational_acceleration::Float`: The gravitational acceleration. Default is `default_gravitational_acceleration`. +- `maximum_roughness_length::Float`: The maximum roughness length. Default is `1.0`. +- `air_kinematic_viscosity::Float`: The air kinematic viscosity. Default is `temperature_dependent_viscosity`. +- `_wave_parameter::Float`: The wave parameter. Default is `0.011`. +- `laminar_parameter::Float`: The laminar parameter. Default is `0.11`. +""" +function MomentumRoughnessLength(FT=Float64; + gravitational_acceleration = default_gravitational_acceleration, + maximum_roughness_length = 1.0, # An estimate? + air_kinematic_viscosity = TemperatureDependentAirViscosity(FT), + gravity_wave_parameter = 0.011, + laminar_parameter = 0.11) + + return MomentumRoughnessLength(convert(FT, gravitational_acceleration), + air_kinematic_viscosity, + convert(FT, gravity_wave_parameter), + convert(FT, laminar_parameter), + convert(FT, maximum_roughness_length)) +end + +function default_roughness_lengths(FT=Float64) + momentum = MomentumRoughnessLength(FT) + temperature = ScalarRoughnessLength(FT) + water_vapor = ScalarRoughnessLength(FT) + return SimilarityScales(momentum, temperature, water_vapor) +end + +# Temperature-dependent viscosity law +struct TemperatureDependentAirViscosity{FT} + C₀ :: FT + C₁ :: FT + C₂ :: FT + C₃ :: FT +end + +""" + TemperatureDependentAirViscosity([FT = Float64; + C₀ = 1.326e-5, + C₁ = C₀ * 6.542e-3, + C₂ = C₀ * 8.301e-6, + C₃ = - C₀ * 4.84e-9]) + +Constructs a `TemperatureDependentAirViscosity` object that calculates the kinematic +viscosity of air as +```math +C₀ + C₁ T + C₂ T^2 + C₃ T^3. +``` +""" +function TemperatureDependentAirViscosity(FT = Float64; + C₀ = 1.326e-5, + C₁ = C₀ * 6.542e-3, + C₂ = C₀ * 8.301e-6, + C₃ = - C₀ * 4.84e-9) + + return TemperatureDependentAirViscosity(convert(FT, C₀), + convert(FT, C₁), + convert(FT, C₂), + convert(FT, C₃)) +end + +""" Calculate the air viscosity based on the temperature θ in Celsius. """ +@inline function (ν::TemperatureDependentAirViscosity)(θ) + FT = eltype(ν.C₀) + T = convert(FT, θ - celsius_to_kelvin) + return ν.C₀ + ν.C₁ * T + ν.C₂ * T^2 + ν.C₃ * T^3 +end + +# Fallbacks for constant roughness length! +@inline roughness_length(ℓ, u★, args...) = ℓ(u★, args...) +@inline roughness_length(ℓ::Number, args...) = ℓ + +# Momentum roughness length should be different from scalar roughness length. +# Temperature and water vapor can be considered the same (Edson et al 2013) +@inline function roughness_length(ℓ::MomentumRoughnessLength{FT}, u★, 𝒬, ℂ) where FT + g = ℓ.gravitational_acceleration + α = ℓ.gravity_wave_parameter + β = ℓ.laminar_parameter + ℓm = ℓ.maximum_roughness_length + + θ₀ = AtmosphericThermodynamics.air_temperature(ℂ, 𝒬) + ν = ℓ.air_kinematic_viscosity(θ₀) + + # We need to prevent `Inf` that pops up when `u★ == 0`. + # For this reason, if `u★ == 0` we prescribe the roughness length to be + # equal to a `maximum` roughness length + ℓᴿ = ifelse(u★ == 0, ℓm, β * ν / u★) + + return min(α * u★^2 / g + ℓᴿ, ℓm) +end + +struct ReynoldsScalingFunction{FT} + A :: FT + b :: FT +end + +""" + ReynoldsScalingFunction(FT = Float64; A = 5.85e-5, b = 0.72) + +Empirical fit of the scalar roughness length with roughness Reynolds number `R★ = u★ ℓu / ν`. +Edson et al. (2013), equation (28). +```math + ℓs = A / R★ ^ b +``` +""" +ReynoldsScalingFunction(FT = Float64; A = 5.85e-5, b = 0.72) = + ReynoldsScalingFunction(convert(FT, A), convert(FT, b)) + +@inline (s::ReynoldsScalingFunction)(R★, args...) = ifelse(R★ == 0, convert(eltype(R★), 0), s.A / R★ ^ s.b) + +# Edson 2013 formulation of scalar roughness length +@inline function roughness_length(ℓ::ScalarRoughnessLength{FT}, ℓu, u★, 𝒬, ℂ) where FT + ℓm = ℓ.maximum_roughness_length + + scaling_function = ℓ.reynolds_number_scaling_function + + θ₀ = AtmosphericThermodynamics.air_temperature(ℂ, 𝒬) + ν = ℓ.air_kinematic_viscosity(θ₀) + + # Roughness Reynolds number + R★ = ℓu * u★ / ν + + # implementation of scalar roughness length + ℓq = scaling_function(R★, ℓu, u★, ν) + + return min(ℓq, ℓm) +end diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/seawater_saturation_specific_humidity.jl b/src/OceanSeaIceModels/CrossRealmFluxes/seawater_saturation_specific_humidity.jl new file mode 100644 index 00000000..f025e918 --- /dev/null +++ b/src/OceanSeaIceModels/CrossRealmFluxes/seawater_saturation_specific_humidity.jl @@ -0,0 +1,73 @@ +using Thermodynamics: Liquid + +struct SalinityConstituent{FT} + molar_mass :: FT + mass_fraction :: FT +end + +struct WaterMoleFraction{FT, C} + water_molar_mass :: FT + salinity_constituents :: C +end + +function WaterMoleFraction(FT=Float64) + water_molar_mass = convert(FT, 18.02) + + # TODO: find reference for these + salinity_constituents = ( + chloride = SalinityConstituent{FT}(35.45, 0.56), + sodium = SalinityConstituent{FT}(22.99, 0.31), + sulfate = SalinityConstituent{FT}(96.06, 0.08), + magnesium = SalinityConstituent{FT}(24.31, 0.05), + ) + + return SeawaterComposition(water_molar_mass, salinity_constituents) +end + +@inline compute_water_mole_fraction(x_H₂O::Number, S) = x_H₂O + +@inline function compute_water_mole_fraction(wmf::WaterMoleFraction, S) + # TODO: express the concept of "ocean_salinity_units"? + s = S / 1000 # convert g/kg to concentration + + # Molecular weights + μ_H₂O = wmf.water_molar_mass + + # Salinity constituents: Cl⁻, Na, SO₄, Mg + μ_Cl = wmf.salinity_constituents.chloride.molar_mass + μ_Na = wmf.salinity_constituents.sodium.molar_mass + μ_SO₄ = wmf.salinity_constituents.sulfate.molar_mass + μ_Mg = wmf.salinity_constituents.magnesium.molar_mass + + # Salinity constituent fractions + ϵ_Cl = wmf.salinity_constituents.chloride.mass_fraction + ϵ_Na = wmf.salinity_constituents.sodium.mass_fraction + ϵ_SO₄ = wmf.salinity_constituents.sulfate.mass_fraction + ϵ_Mg = wmf.salinity_constituents.magnesium.mass_fraction + + α = μ_H₂O * (ϵ_Cl/μ_Cl + ϵ_Na/μ_Na + ϵ_SO₄/μ_SO₄ + ϵ_Mg/μ_Mg) + + return (1 - s) / (1 - s + α * s) +end + +@inline function seawater_saturation_specific_humidity(atmosphere_thermodynamics_parameters, + surface_temperature, + surface_salinity, + atmos_state, + water_mole_fraction, + water_vapor_saturation, + ::Liquid) + + ℂₐ = atmosphere_thermodynamics_parameters + FT = eltype(ℂₐ) + Tₛ = surface_temperature + Sₛ = surface_salinity + ρₛ = atmos_state.ρ # surface density -- should we extrapolate to obtain this? + ρₛ = convert(FT, ρₛ) + + q★_H₂O = water_saturation_specific_humidity(water_vapor_saturation, ℂₐ, ρₛ, Tₛ) + x_H₂O = compute_water_mole_fraction(water_mole_fraction, Sₛ) + + # Return saturation specific humidity for salty seawater + return q★_H₂O * x_H₂O +end \ No newline at end of file diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/similarity_theory_turbulent_fluxes.jl b/src/OceanSeaIceModels/CrossRealmFluxes/similarity_theory_turbulent_fluxes.jl index 224ef4d4..7cb5ebf3 100644 --- a/src/OceanSeaIceModels/CrossRealmFluxes/similarity_theory_turbulent_fluxes.jl +++ b/src/OceanSeaIceModels/CrossRealmFluxes/similarity_theory_turbulent_fluxes.jl @@ -3,7 +3,7 @@ using Oceananigans.Grids: AbstractGrid using Adapt using Thermodynamics: Liquid -using SurfaceFluxes.Parameters: SurfaceFluxesParameters, AbstractSurfaceFluxesParameters +using SurfaceFluxes.Parameters: SurfaceFluxesParameters using SurfaceFluxes.UniversalFunctions: BusingerParams, BusingerType using Printf @@ -12,6 +12,8 @@ using KernelAbstractions.Extras.LoopInfo: @unroll using ..PrescribedAtmospheres: PrescribedAtmosphereThermodynamicsParameters +using Statistics: norm + import Thermodynamics as AtmosphericThermodynamics import Thermodynamics.Parameters: molmass_ratio @@ -27,35 +29,45 @@ import SurfaceFluxes.Parameters: ##### Bulk turbulent fluxes based on similarity theory ##### -struct SimilarityTheoryTurbulentFluxes{FT, ΔU, UF, TP, S, W, R, F} <: AbstractSurfaceFluxesParameters +struct SimilarityTheoryTurbulentFluxes{FT, UF, TP, S, W, R, B, V, F} gravitational_acceleration :: FT von_karman_constant :: FT - bulk_velocity_scale :: ΔU - similarity_functions :: UF + turbulent_prandtl_number :: FT + gustiness_parameter :: FT + stability_functions :: UF thermodynamics_parameters :: TP water_vapor_saturation :: S water_mole_fraction :: W roughness_lengths :: R + bulk_coefficients :: B + bulk_velocity :: V + tolerance :: FT + maxiter :: Int fields :: F end const STTF = SimilarityTheoryTurbulentFluxes @inline thermodynamics_params(fluxes::STTF) = fluxes.thermodynamics_parameters -@inline uf_params(fluxes::STTF) = fluxes.similarity_functions +@inline uf_params(fluxes::STTF) = fluxes.stability_functions @inline von_karman_const(fluxes::STTF) = fluxes.von_karman_constant @inline grav(fluxes::STTF) = fluxes.gravitational_acceleration @inline molmass_ratio(fluxes::STTF) = molmass_ratio(fluxes.thermodynamics_parameters) -@inline universal_func_type(fluxes::STTF{<:Any, <:Any, <:BusingerParams}) = BusingerType() +@inline universal_func_type(::STTF{<:Any, <:Any, <:BusingerParams}) = BusingerType() Adapt.adapt_structure(to, fluxes::STTF) = SimilarityTheoryTurbulentFluxes(adapt(to, fluxes.gravitational_acceleration), adapt(to, fluxes.von_karman_constant), - nothing, # adapt(to, fluxes.bulk_velocity_scale), - adapt(to, fluxes.similarity_functions), + adapt(to, fluxes.turbulent_prandtl_number), + adapt(to, fluxes.gustiness_parameter), + adapt(to, fluxes.stability_functions), adapt(to, fluxes.thermodynamics_parameters), - nothing, #adapt(to, fluxes.water_vapor_saturation), - nothing, #adapt(to, fluxes.water_mole_fraction), + adapt(to, fluxes.water_vapor_saturation), + adapt(to, fluxes.water_mole_fraction), adapt(to, fluxes.roughness_lengths), + adapt(to, fluxes.bulk_coefficients), + adapt(to, fluxes.bulk_velocity), + fluxes.tolerance, + fluxes.maxiter, adapt(to, fluxes.fields)) Base.summary(::SimilarityTheoryTurbulentFluxes{FT}) where FT = "SimilarityTheoryTurbulentFluxes{$FT}" @@ -63,55 +75,107 @@ Base.summary(::SimilarityTheoryTurbulentFluxes{FT}) where FT = "SimilarityTheory struct ClasiusClapyeronSaturation end @inline function water_saturation_specific_humidity(::ClasiusClapyeronSaturation, ℂₐ, ρₛ, Tₛ) - p★ = AtmosphericThermodynamics.saturation_vapor_pressure(ℂₐ, Tₛ, Liquid()) - q★ = AtmosphericThermodynamics.q_vap_saturation_from_density(ℂₐ, Tₛ, ρₛ, p★) + FT = eltype(ℂₐ) + p★ = AtmosphericThermodynamics.saturation_vapor_pressure(ℂₐ, convert(FT, Tₛ), Liquid()) + q★ = AtmosphericThermodynamics.q_vap_saturation_from_density(ℂₐ, convert(FT, Tₛ), ρₛ, p★) return q★ end -struct LargeYeagerSaturation{FT} - c₁ :: FT - c₂ :: FT -end - -function LargeYeagerSaturation(FT=Float64; c₁ = 640380, c₂ = 5107.4) - return LargeYeagerSaturation(convert(FT, c₁), convert(FT, c₂)) -end - -const LYS = LargeYeagerSaturation -@inline water_saturation_specific_humidity(lys::LYS, ℂₐ, ρₛ, Tₛ) = lys.c₁ * exp(-lys.c₂ / Tₛ) / ρₛ - function Base.show(io::IO, fluxes::SimilarityTheoryTurbulentFluxes) print(io, summary(fluxes), '\n', - "├── gravitational_acceleration: ", prettysummary(fluxes.gravitational_acceleration), '\n', - "├── von_karman_constant: ", prettysummary(fluxes.von_karman_constant), '\n', - "├── bulk_velocity_scale: ", summary(fluxes.bulk_velocity_scale), '\n', - "├── similarity_function: ", summary(fluxes.similarity_function), '\n', - "├── water_mole_fraction: ", summary(fluxes.water_mole_fraction), '\n', - "├── water_vapor_saturation: ", summary(fluxes.water_vapor_saturation), '\n', - "└── thermodynamics_parameters: ", summary(fluxes.thermodynamics_parameters)) + "├── gravitational_acceleration: ", prettysummary(fluxes.gravitational_acceleration), '\n', + "├── von_karman_constant: ", prettysummary(fluxes.von_karman_constant), '\n', + "├── turbulent_prandtl_number: ", prettysummary(fluxes.turbulent_prandtl_number), '\n', + "├── gustiness_parameter: ", prettysummary(fluxes.gustiness_parameter), '\n', + "├── stability_functions: ", summary(fluxes.stability_functions), '\n', + "├── water_mole_fraction: ", summary(fluxes.water_mole_fraction), '\n', + "├── water_vapor_saturation: ", summary(fluxes.water_vapor_saturation), '\n', + "├── roughness_lengths: ", summary(fluxes.roughness_lengths), '\n', + "├── bulk_coefficients: ", summary(fluxes.bulk_coefficients), '\n', + "└── thermodynamics_parameters: ", summary(fluxes.thermodynamics_parameters)) end const PATP = PrescribedAtmosphereThermodynamicsParameters +""" The exchange fluxes depend on the atmosphere velocity but not the ocean velocity """ +struct WindVelocity end + +""" The exchange fluxes depend on the relative velocity between the atmosphere and the ocean """ +struct RelativeVelocity end + +""" + SimilarityTheoryTurbulentFluxes(FT::DataType = Float64; + gravitational_acceleration = default_gravitational_acceleration, + von_karman_constant = convert(FT, 0.4), + turbulent_prandtl_number = convert(FT, 1), + gustiness_parameter = convert(FT, 6.5), + stability_functions = default_stability_functions(FT), + thermodynamics_parameters = PATP(FT), + water_vapor_saturation = ClasiusClapyeronSaturation(), + water_mole_fraction = convert(FT, 0.98), + roughness_lengths = default_roughness_lengths(FT), + bulk_coefficients = bulk_coefficients, + bulk_velocity = RelativeVelocity(), + tolerance = 1e-8, + maxiter = 100, + fields = nothing) + +`SimilarityTheoryTurbulentFluxes` contains parameters and settings to calculate +sea-air turbulent fluxes using Monin-Obukhov similarity theory. + +Keyword Arguments +================== + +- `gravitational_acceleration`: The gravitational acceleration (default: default_gravitational_acceleration). +- `von_karman_constant`: The von Karman constant (default: 0.4). +- `turbulent_prandtl_number`: The turbulent Prandtl number (default: 1). +- `gustiness_parameter`: The gustiness parameter that accounts for low wind speed areas (default: 6.5). +- `stability_functions`: The stability functions. Default: default_stability_functions(FT) that follow the + formulation of Edson et al (2013). +- `thermodynamics_parameters`: The thermodynamics parameters used to calculate atmospheric stability and + saturation pressure. Default: `PATP`, alias for `PrescribedAtmosphereThermodynamicsParameters`. +- `water_vapor_saturation`: The water vapor saturation law. Default: ClasiusClapyeronSaturation() that follows the + Clasius Clapyeron pressure formulation. +- `water_mole_fraction`: The water mole fraction used to calculate the seawater_saturation_specific_humidity. + Default: 0.98, the rest is assumed to be other substances such as chlorine, sodium sulfide and magnesium. +- `roughness_lengths`: The roughness lengths used to calculate the characteristic scales for momentum, temperature and + water vapor. Default: default_roughness_lengths(FT), formulation taken from Edson et al (2013). +- `bulk_coefficients`: The bulk coefficients. +- `bulk_velocity`: The velocity used to calculate the characteristic scales. Default: RelativeVelocity() (difference between + atmospheric and oceanic speed). +- `tolerance`: The tolerance for convergence (default: 1e-8). +- `maxiter`: The maximum number of iterations (default: 100). +- `fields`: The fields to calculate (default: nothing). +""" function SimilarityTheoryTurbulentFluxes(FT::DataType = Float64; gravitational_acceleration = default_gravitational_acceleration, - bulk_velocity_scale = nothing, von_karman_constant = convert(FT, 0.4), - similarity_functions = businger_similarity_functions(FT), + turbulent_prandtl_number = convert(FT, 1), + gustiness_parameter = convert(FT, 6.5), + stability_functions = edson_stability_functions(FT), thermodynamics_parameters = PATP(FT), water_vapor_saturation = ClasiusClapyeronSaturation(), water_mole_fraction = convert(FT, 0.98), roughness_lengths = default_roughness_lengths(FT), + bulk_coefficients = bulk_coefficients, + bulk_velocity = RelativeVelocity(), + tolerance = 1e-8, + maxiter = 100, fields = nothing) return SimilarityTheoryTurbulentFluxes(convert(FT, gravitational_acceleration), convert(FT, von_karman_constant), - bulk_velocity_scale, - similarity_functions, + convert(FT, turbulent_prandtl_number), + convert(FT, gustiness_parameter), + stability_functions, thermodynamics_parameters, water_vapor_saturation, water_mole_fraction, roughness_lengths, + bulk_coefficients, + bulk_velocity, + convert(FT, tolerance), + maxiter, fields) end @@ -127,245 +191,122 @@ function SimilarityTheoryTurbulentFluxes(grid::AbstractGrid; kw...) return SimilarityTheoryTurbulentFluxes(eltype(grid); kw..., fields) end -# See SurfaceFluxes.jl for other parameter set options. -default_businger_parameters(FT=Float64) = BusingerParams{FT}(Pr_0 = convert(FT, 0.74), - a_m = convert(FT, 4.7), - a_h = convert(FT, 4.7), - ζ_a = convert(FT, 2.5), - γ = convert(FT, 4.42)) - -@inline function seawater_saturation_specific_humidity(atmosphere_thermodynamics_parameters, - surface_temperature, - surface_salinity, - atmos_state, - water_mole_fraction, - water_vapor_saturation, - ::Liquid) - - ℂₐ = atmosphere_thermodynamics_parameters - FT = eltype(ℂₐ) - Tₛ = surface_temperature - Sₛ = surface_salinity - ρₛ = atmos_state.ρ # surface density -- should we extrapolate to obtain this? - ρₛ = convert(FT, ρₛ) - - q★_H₂O = water_saturation_specific_humidity(water_vapor_saturation, ℂₐ, ρₛ, Tₛ) - x_H₂O = compute_water_mole_fraction(water_mole_fraction, Sₛ) - - # Return saturation specific humidity for salty seawater - return q★_H₂O * x_H₂O -end - -struct SalinityConstituent{FT} - molar_mass :: FT - mass_fraction :: FT -end - -struct WaterMoleFraction{FT, C} - water_molar_mass :: FT - salinity_constituents :: C -end - -function WaterMoleFraction(FT=Float64) - water_molar_mass = convert(FT, 18.02) - - # TODO: find reference for these - salinity_constituents = ( - chloride = SalinityConstituent{FT}(35.45, 0.56), - sodium = SalinityConstituent{FT}(22.99, 0.31), - sulfate = SalinityConstituent{FT}(96.06, 0.08), - magnesium = SalinityConstituent{FT}(24.31, 0.05), - ) - - return SeawaterComposition(water_molar_mass, salinity_constituents) -end - -@inline compute_water_mole_fraction(x_H₂O::Number, S) = x_H₂O - -@inline function compute_water_mole_fraction(wmf::WaterMoleFraction, S) - # TODO: express the concept of "ocean_salinity_units"? - s = S / 1000 # convert g/kg to concentration - - # Molecular weights - μ_H₂O = wmf.water_molar_mass - - # Salinity constituents: Cl, Na, SO₄, Mg - μ_Cl = wmf.salinity_constituents.chloride.molar_mass - μ_Na = wmf.salinity_constituents.sodium.molar_mass - μ_SO₄ = wmf.salinity_constituents.sulfate.molar_mass - μ_Mg = wmf.salinity_constituents.magnesium.molar_mass - - # Salinity constituent fractions - ϵ_Cl = wmf.salinity_constituents.chloride.mass_fraction - ϵ_Na = wmf.salinity_constituents.sodium.mass_fraction - ϵ_SO₄ = wmf.salinity_constituents.sulfate.mass_fraction - ϵ_Mg = wmf.salinity_constituents.magnesium.mass_fraction - - α = μ_H₂O * (ϵ_Cl/μ_Cl + ϵ_Na/μ_Na + ϵ_SO₄/μ_SO₄ + ϵ_Mg/μ_Mg) - - return (1 - s) / (1 - s + α * s) -end - - -@inline update_turbulent_flux_fields!(::Nothing, args...) = nothing - -@inline function update_turbulent_flux_fields!(fields, i, j, grid, fluxes) - return nothing -end - -@inline compute_similarity_theory_fluxes(turbulent_fluxes, atmos_state, surface_state) = - compute_similarity_theory_fluxes(turbulent_fluxes.roughness_lengths, turbulent_fluxes, atmos_state, surface_state) +# Simplified coefficient a la COARE +@inline simplified_bulk_coefficients(ψ, h, ℓ, L) = log(h / ℓ) - ψ(h / L) # + ψ(ℓ / L) -##### -##### Struct that represents a 3-tuple of momentum, heat, and water vapor -##### - -struct SimilarityScales{U, T, Q} - momentum :: U - temperature :: T - water_vapor :: Q -end - -# Convenience default with water_vapor component = nothing -SimilarityScales(momentum, temperature) = SimilarityScales(momentum, temperature, nothing) +# The complete bulk coefficient +@inline bulk_coefficients(ψ, h, ℓ, L) = log(h / ℓ) - ψ(h / L) + ψ(ℓ / L) ##### -##### Interface into SurfaceFluxes.jl +##### Fixed-point iteration for roughness length ##### -# This is the case that SurfaceFluxes.jl can do -const NothingVaporRoughnessLength = SimilarityScales{<:Number, <:Number, Nothing} - -@inline function compute_similarity_theory_fluxes(roughness_lengths::NothingVaporRoughnessLength, +@inline function compute_similarity_theory_fluxes(similarity_theory, surface_state, atmos_state, + atmos_boundary_layer_height, thermodynamics_parameters, gravitational_acceleration, - von_karman_constant) - - # turbulent_fluxes, - # atmos_state, - # surface_state) - - FT = Float64 - similarity_functions = BusingerParams{FT}(Pr_0 = convert(FT, 0.74), - a_m = convert(FT, 4.7), - a_h = convert(FT, 4.7), - ζ_a = convert(FT, 2.5), - γ = convert(FT, 4.42)) - - turbulent_fluxes = SimilarityTheoryTurbulentFluxes(gravitational_acceleration, - von_karman_constant, - nothing, - similarity_functions, - thermodynamics_parameters, - nothing, - nothing, - nothing, - nothing) - - # Constant roughness lengths - ℓu = roughness_lengths.momentum - ℓθ = roughness_lengths.temperature - - # Solve for the surface fluxes with initial roughness length guess - Uᵍ = zero(ℓu) # gustiness - β = one(ℓu) # surface "resistance" - values = SurfaceFluxes.ValuesOnly(atmos_state, surface_state, ℓu, ℓθ, Uᵍ, β) - conditions = SurfaceFluxes.surface_conditions(turbulent_fluxes, values) - - fluxes = (; - sensible_heat = conditions.shf, - latent_heat = conditions.lhf, - water_vapor = conditions.evaporation, - x_momentum = conditions.ρτxz, - y_momentum = conditions.ρτyz, - ) - - return fluxes -end - -##### -##### Fixed-point iteration for roughness length -##### - -const ConstantRoughnessLength = SimilarityScales{<:Number, <:Number, <:Number} - -struct SimilarityFunction{FT, C} - a :: FT - b :: FT - c :: C -end - -@inline function (ψ::SimilarityFunction)(Ri) - a = ψ.a - b = ψ.b - c = ψ.c - - Ri⁻ = min(zero(Ri), Ri) - ϕ⁻¹ = (1 - b * Ri⁻)^c - ψ_unstable = log((1 + ϕ⁻¹)^2 * (1 + ϕ⁻¹^2) / 8) - (4 * atan(ϕ⁻¹) + π) / 2 + von_karman_constant, + maxiter) - ψ_stable = - a * Ri + # Prescribed difference between two states + ℂₐ = thermodynamics_parameters + Δh, Δu, Δv, Δθ, Δq = state_differences(ℂₐ, + atmos_state, + surface_state, + gravitational_acceleration, + similarity_theory.bulk_velocity) - return ifelse(Ri < 0, ψ_unstable, ψ_stable) -end + differences = (; u=Δu, v=Δv, θ=Δθ, q=Δq, h=Δh) + + u★ = convert(eltype(Δh), 1e-4) + + # Initial guess for the characteristic scales u★, θ★, q★. + # Does not really matter if we are sophisticated or not, it converges + # in about 10 iterations no matter what... + Σ₀ = SimilarityScales(1, 1, 1) + Σ★ = SimilarityScales(u★, u★, u★) + + # The inital velocity scale assumes that + # the gustiness velocity `uᴳ` is equal to 0.5 ms⁻¹. + # That will be refined later on. + ΔUᴳ = sqrt(Δu^2 + Δv^2 + convert(eltype(Δh), 0.25)) + + # Initialize the solver + iteration = 0 + + while iterating(Σ★ - Σ₀, iteration, maxiter, similarity_theory) + Σ₀ = Σ★ + Σ★, ΔUᴳ = refine_characteristic_scales(Σ★, ΔUᴳ, + similarity_theory, + surface_state, + differences, + atmos_boundary_layer_height, + thermodynamics_parameters, + gravitational_acceleration, + von_karman_constant) + iteration += 1 + end -struct OneQuarter end -struct OneHalf end + u★ = Σ★.momentum + θ★ = Σ★.temperature + q★ = Σ★.water_vapor -import Base: ^ -@inline ^(x, ::OneQuarter) = sqrt(sqrt(x)) -@inline ^(x, ::OneHalf) = sqrt(x) + θ★ = θ★ / similarity_theory.turbulent_prandtl_number + q★ = q★ / similarity_theory.turbulent_prandtl_number -function businger_similarity_functions(FT=Float64) - au = convert(FT, 4.7) - bu = convert(FT, 15) - cu = OneQuarter() - ψu = SimilarityFunction(au, bu, cu) + # `u★² ≡ sqrt(τx² + τy²)` + # We remove the gustiness by dividing by `ΔUᴳ` + τx = - u★^2 * Δu / ΔUᴳ + τy = - u★^2 * Δv / ΔUᴳ - ah = convert(FT, 6.35) - bh = convert(FT, 9) - ch = OneHalf() - ψh = SimilarityFunction(ah, bh, ch) + 𝒬ₐ = atmos_state.ts + ρₐ = AtmosphericThermodynamics.air_density(ℂₐ, 𝒬ₐ) + cₚ = AtmosphericThermodynamics.cp_m(ℂₐ, 𝒬ₐ) # moist heat capacity + ℰv = AtmosphericThermodynamics.latent_heat_vapor(ℂₐ, 𝒬ₐ) - ψq = ψh + fluxes = (; + sensible_heat = - ρₐ * cₚ * u★ * θ★, + latent_heat = - ρₐ * u★ * q★ * ℰv, + water_vapor = - ρₐ * u★ * q★, + x_momentum = + ρₐ * τx, + y_momentum = + ρₐ * τy, + ) - return SimilarityScales(ψu, ψh, ψq) + return fluxes end -@inline function bulk_factor(ψ, h, ℓ, Ri) - L★ = h / Ri - χ⁻¹ = log(h / ℓ) - ψ(Ri) + ψ(ℓ / L★) - return 1 / χ⁻¹ +# Iterating condition for the characteristic scales solvers +@inline function iterating(Σ★, iteration, maxiter, solver) + converged = norm(Σ★) <= solver.tolerance + reached_maxiter = iteration >= maxiter + return !(converged | reached_maxiter) end +# The M-O characteristic length is calculated as +# L★ = - u★² / (κ ⋅ b★) +# where b★ is the characteristic buoyancy scale calculated from: @inline function buoyancy_scale(θ★, q★, 𝒬, ℂ, g) - 𝒯₀ = AtmosphericThermodynamics.virtual_temperature(ℂ, 𝒬) - θ₀ = AtmosphericThermodynamics.air_temperature(ℂ, 𝒬) - q₀ = AtmosphericThermodynamics.vapor_specific_humidity(ℂ, 𝒬) + 𝒯ₐ = AtmosphericThermodynamics.virtual_temperature(ℂ, 𝒬) + qₐ = AtmosphericThermodynamics.vapor_specific_humidity(ℂ, 𝒬) + ε = AtmosphericThermodynamics.Parameters.molmass_ratio(ℂ) + δ = ε - 1 # typically equal to 0.608 - ε = AtmosphericThermodynamics.Parameters.molmass_ratio(ℂ) - δ = ε - 1 - - b★ = g / 𝒯₀ * (θ★ * (1 + δ * q₀) + δ * θ₀ * q★) + # Fairell et al. 1996, + b★ = g / 𝒯ₐ * (θ★ * (1 + δ * qₐ) + δ * 𝒯ₐ * q★) return b★ end +@inline velocity_differences(𝒰₁, 𝒰₀, ::RelativeVelocity) = @inbounds 𝒰₁.u[1] - 𝒰₀.u[1], 𝒰₁.u[2] - 𝒰₀.u[2] +@inline velocity_differences(𝒰₁, 𝒰₀, ::WindVelocity) = @inbounds 𝒰₁.u[1], 𝒰₁.u[2] -@inline function state_differences(ℂ, 𝒰₁, 𝒰₀) +@inline function state_differences(ℂ, 𝒰₁, 𝒰₀, g, bulk_velocity) z₁ = 𝒰₁.z z₀ = 𝒰₀.z Δh = z₁ - z₀ - - U₁ = 𝒰₁.u - U₀ = 𝒰₀.u - - @inbounds begin - Δu = U₁[1] - U₀[1] - Δv = U₁[2] - U₀[2] - end + Δu, Δv = velocity_differences(𝒰₁, 𝒰₀, bulk_velocity) # Thermodynamic state 𝒬₁ = 𝒰₁.ts @@ -373,7 +314,10 @@ end θ₁ = AtmosphericThermodynamics.air_temperature(ℂ, 𝒬₁) θ₀ = AtmosphericThermodynamics.air_temperature(ℂ, 𝒬₀) - Δθ = θ₁ - θ₀ + cₚ = AtmosphericThermodynamics.cp_m(ℂ, 𝒬₁) # moist heat capacity + + # Temperature difference including the ``lapse rate'' `α = g / cₚ` + Δθ = θ₁ - θ₀ + g / cₚ * Δh q₁ = AtmosphericThermodynamics.vapor_specific_humidity(ℂ, 𝒬₁) q₀ = AtmosphericThermodynamics.vapor_specific_humidity(ℂ, 𝒬₀) @@ -382,63 +326,12 @@ end return Δh, Δu, Δv, Δθ, Δq end -@inline function compute_similarity_theory_fluxes(roughness_lengths, - surface_state, - atmos_state, - thermodynamics_parameters, - gravitational_acceleration, - von_karman_constant, - Σ₀ = SimilarityScales(1e-3, 1e-3, 1e-3)) - - # Prescribed difference between two states - ℂₐ = thermodynamics_parameters - Δh, Δu, Δv, Δθ, Δq = state_differences(ℂₐ, atmos_state, surface_state) - differences = (; u=Δu, v=Δv, θ=Δθ, q=Δq, h=Δh) - - # Solve for the characteristic scales u★, θ★, q★, and thus for fluxes. - Σ★ = Σ₀ - - @unroll for iter = 1:10 - Σ★ = refine_characteristic_scales(Σ★, - roughness_lengths, - surface_state, - differences, - thermodynamics_parameters, - gravitational_acceleration, - von_karman_constant) - end - - u★ = Σ★.momentum - θ★ = Σ★.temperature - q★ = Σ★.water_vapor - - # u★² ≡ sqrt(τx² + τy²) - τx = - u★^2 * Δu / sqrt(Δu^2 + Δv^2) - τy = - u★^2 * Δv / sqrt(Δu^2 + Δv^2) - - 𝒬ₐ = atmos_state.ts - ρₐ = AtmosphericThermodynamics.air_density(ℂₐ, 𝒬ₐ) - cₚ = AtmosphericThermodynamics.cp_m(ℂₐ, 𝒬ₐ) # moist heat capacity - ℰv = AtmosphericThermodynamics.latent_heat_vapor(ℂₐ, 𝒬ₐ) - - fluxes = (; - water_vapor = - ρₐ * u★ * q★, - sensible_heat = - ρₐ * cₚ * u★ * θ★, - latent_heat = - ρₐ * u★ * q★ * ℰv, - x_momentum = + ρₐ * τx, - y_momentum = + ρₐ * τy, - ) - - return fluxes -end - -@inline compute_roughness_length(ℓ::Number, Σ★) = ℓ -@inline compute_roughness_length(ℓ, Σ★) = ℓ(Σ★) - -@inline function refine_characteristic_scales(estimated_characteristic_scales, - roughness_lengths, +@inline function refine_characteristic_scales(estimated_characteristic_scales, + velocity_scale, + similarity_theory, surface_state, differences, + atmos_boundary_layer_height, thermodynamics_parameters, gravitational_acceleration, von_karman_constant) @@ -447,82 +340,58 @@ end u★ = estimated_characteristic_scales.momentum θ★ = estimated_characteristic_scales.temperature q★ = estimated_characteristic_scales.water_vapor - Σ★ = estimated_characteristic_scales + uτ = velocity_scale - # Extract roughness lengths - ℓu = roughness_lengths.momentum - ℓθ = roughness_lengths.temperature - ℓq = roughness_lengths.water_vapor - - ℓu₀ = compute_roughness_length(ℓu, Σ★) - ℓθ₀ = compute_roughness_length(ℓθ, Σ★) - ℓq₀ = compute_roughness_length(ℓq, Σ★) - - # Compute flux Richardson number - h = differences.h - ϰ = von_karman_constant + # Similarity functions from Edson et al. (2013) + ψu = similarity_theory.stability_functions.momentum + ψθ = similarity_theory.stability_functions.temperature + ψq = similarity_theory.stability_functions.water_vapor - ℂ = thermodynamics_parameters - g = gravitational_acceleration - 𝒬ₒ = surface_state.ts # thermodyanmic state + # Extract roughness lengths + ℓu = similarity_theory.roughness_lengths.momentum + ℓθ = similarity_theory.roughness_lengths.temperature + ℓq = similarity_theory.roughness_lengths.water_vapor + β = similarity_theory.gustiness_parameter + + h = differences.h + ϰ = von_karman_constant + ℂ = thermodynamics_parameters + g = gravitational_acceleration + 𝒬ₒ = surface_state.ts # thermodynamic state + zᵢ = atmos_boundary_layer_height + + # Compute Monin-Obukhov length scale depending on a `buoyancy flux` b★ = buoyancy_scale(θ★, q★, 𝒬ₒ, ℂ, g) - Riₕ = - ϰ * h * b★ / u★^2 - Riₕ = ifelse(isnan(Riₕ), zero(Riₕ), Riₕ) - # Compute similarity functions - ψu = SimilarityFunction(4.7, 15.0, OneQuarter()) - ψc = SimilarityFunction(6.35, 9.0, OneHalf()) + # Monin-Obhukov characteristic length scale and non-dimensional height + L★ = ifelse(b★ == 0, zero(b★), - u★^2 / (ϰ * b★)) + + # Compute roughness length scales + ℓu₀ = roughness_length(ℓu, u★, 𝒬ₒ, ℂ) + ℓq₀ = roughness_length(ℓq, ℓu₀, u★, 𝒬ₒ, ℂ) + ℓθ₀ = roughness_length(ℓθ, ℓu₀, u★, 𝒬ₒ, ℂ) - χu = bulk_factor(ψu, h, ℓu₀, Riₕ) - χθ = bulk_factor(ψc, h, ℓθ₀, Riₕ) - χq = bulk_factor(ψc, h, ℓq₀, Riₕ) + # Transfer coefficients at height `h` + χu = ϰ / similarity_theory.bulk_coefficients(ψu, h, ℓu₀, L★) + χθ = ϰ / similarity_theory.bulk_coefficients(ψθ, h, ℓθ₀, L★) + χq = ϰ / similarity_theory.bulk_coefficients(ψq, h, ℓq₀, L★) Δu = differences.u Δv = differences.v Δθ = differences.θ Δq = differences.q - u★ = ϰ * χu * sqrt(Δu^2 + Δv^2) - θ★ = ϰ * χθ * Δθ - q★ = ϰ * χq * Δq - - return SimilarityScales(u★, θ★, q★) -end - -struct GravityWaveRoughnessLength{FT} - gravitational_acceleration :: FT - air_kinematic_viscosity :: FT - gravity_wave_parameter :: FT - laminar_parameter :: FT -end + # u★ including gustiness + u★ = χu * uτ + θ★ = χθ * Δθ + q★ = χq * Δq -function GravityWaveRoughnessLength(FT=Float64; - gravitational_acceleration = default_gravitational_acceleration, - air_kinematic_viscosity = 1.5e-5, - gravity_wave_parameter = 0.011, - laminar_parameter = 0.11) - - return GravityWaveRoughnessLength(convert(FT, gravitational_acceleration), - convert(FT, air_kinematic_viscosity), - convert(FT, gravity_wave_parameter), - convert(FT, laminar_parameter)) -end - -@inline function compute_roughness_length(ℓ::GravityWaveRoughnessLength, Σ★) - u★ = Σ★.momentum - g = ℓ.gravitational_acceleration - ν = ℓ.air_kinematic_viscosity - α = ℓ.gravity_wave_parameter - β = ℓ.laminar_parameter - - return α * u★^2 / g + β * ν / u★ -end - -function default_roughness_lengths(FT=Float64) - momentum = 1e-4 #GravityWaveRoughnessLength(FT) - temperature = convert(FT, 1e-4) - water_vapor = convert(FT, 1e-4) - return SimilarityScales(momentum, temperature, water_vapor) -end + # Buoyancy flux characteristic scale for gustiness (Edson 2013) + Jᵇ = - u★ * b★ + uᴳ = β * cbrt(Jᵇ * zᵢ) + # New velocity difference accounting for gustiness + ΔUᴳ = sqrt(Δu^2 + Δv^2 + uᴳ^2) + return SimilarityScales(u★, θ★, q★), ΔUᴳ +end \ No newline at end of file diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/stability_functions.jl b/src/OceanSeaIceModels/CrossRealmFluxes/stability_functions.jl new file mode 100644 index 00000000..f1f67cdf --- /dev/null +++ b/src/OceanSeaIceModels/CrossRealmFluxes/stability_functions.jl @@ -0,0 +1,185 @@ +import Base: - +import Statistics + +##### +##### Struct that represents a 3-tuple of momentum, heat, and water vapor +##### + +struct SimilarityScales{U, T, Q} + momentum :: U + temperature :: T + water_vapor :: Q +end + +-(a::SimilarityScales, b::SimilarityScales) = SimilarityScales(a.momentum - b.momentum, + a.temperature - b.temperature, + a.water_vapor - b.water_vapor) + +Statistics.norm(a::SimilarityScales) = norm(a.momentum) + norm(a.temperature) + norm(a.water_vapor) + +function edson_stability_functions(FT = Float64) + + # Edson et al. (2013) + ψu = MomentumStabilityFunction() + ψc = ScalarStabilityFunction() + + return SimilarityScales(ψu, ψc, ψc) +end + +""" + MomentumStabilityFunction{FT} + +A struct representing the momentum stability function detailed in Edson et al (2013). +The formulation hinges on the definition of three different functions: +one for stable atmospheric conditions ``(ζ > 0)``, named ``ψₛ`` and two for unstable conditions, +named ``ψᵤ₁`` and ``ψᵤ₂``. +These stability functions are obtained by regression to experimental data. + +The stability parameter for stable atmospheric conditions is defined as +```math +dζ = min(ζmax, Aˢζ) +ψₛ = - (Bˢ ζ + Cˢ ( ζ - Dˢ ) ) exp( - dζ) - Cˢ Dˢ +``` + +While the stability parameter for unstable atmospheric conditions is calculated +as a function of the two individual stability functions as follows +```math +fᵤ₁ = √√(1 - Aᵘζ) +ψᵤ₁ = Bᵘ / 2 ⋅ log((1 + fᵤ₁ + fᵤ₁² + fᵤ₁³) / Bᵘ) - √Bᵘ atan(fᵤ₁) - Cᵘ + +fᵤ₂ = ∛(1 - Dᵘζ) +ψᵤ₂ = Eᵘ / 2 ⋅ log((1 + fᵤ₂ + fᵤ₂²) / Eᵘ) - √Eᵘ atan( (1 + 2fᵤ₂) / √Eᵘ) + Fᵘ + +f = ζ² / (1 + ζ²) +ψᵤ = (1 - f) ψᵤ₁ + f ψᵤ₂ +``` + +The superscripts ``ˢ`` and ``ᵘ`` indicate if the parameter applies to the +stability function for _stable_ or _unstable_ atmospheric conditions, respectively. +""" +@kwdef struct MomentumStabilityFunction{FT} + ζmax :: FT = 50.0 + Aˢ :: FT = 0.35 + Bˢ :: FT = 0.7 + Cˢ :: FT = 0.75 + Dˢ :: FT = 5/0.35 + Aᵘ :: FT = 15.0 + Bᵘ :: FT = 2.0 + Cᵘ :: FT = π/2 + Dᵘ :: FT = 10.15 + Eᵘ :: FT = 3.0 + Fᵘ :: FT = π / sqrt(3) +end + +@inline function (ψ::MomentumStabilityFunction)(ζ) + ζmax = ψ.ζmax + Aˢ = ψ.Aˢ + Bˢ = ψ.Bˢ + Cˢ = ψ.Cˢ + Dˢ = ψ.Dˢ + Aᵘ = ψ.Aᵘ + Bᵘ = ψ.Bᵘ + Cᵘ = ψ.Cᵘ + Dᵘ = ψ.Dᵘ + Eᵘ = ψ.Eᵘ + Fᵘ = ψ.Fᵘ + + ζ⁻ = min(zero(ζ), ζ) + ζ⁺ = max(zero(ζ), ζ) + dζ = min(ζmax, Aˢ * ζ⁺) + + # Stability parameter for _stable_ atmospheric conditions + ψₛ = - (Bˢ * ζ⁺ + Cˢ * (ζ⁺ - Dˢ)) * exp(- dζ) - Cˢ * Dˢ + + # Stability parameter for _unstable_ atmospheric conditions + fᵤ₁ = sqrt(sqrt(1 - Aᵘ * ζ⁻)) + ψᵤ₁ = Bᵘ * log((1 + fᵤ₁) / Bᵘ) + log((1 + fᵤ₁^2) / Bᵘ) - Bᵘ * atan(fᵤ₁) + Cᵘ + + fᵤ₂ = cbrt(1 - Dᵘ * ζ⁻) + ψᵤ₂ = Eᵘ / 2 * log((1 + fᵤ₂ + fᵤ₂^2) / Eᵘ) - sqrt(Eᵘ) * atan( (1 + 2fᵤ₂) / sqrt(Eᵘ)) + Fᵘ + + f = ζ⁻^2 / (1 + ζ⁻^2) + ψᵤ = (1 - f) * ψᵤ₁ + f * ψᵤ₂ + + return ifelse(ζ < 0, ψᵤ, ψₛ) +end + +""" + ScalarStabilityFunction{FT} + +A struct representing the scalar stability function detailed in Edson et al (2013). +The formulation hinges on the definition of three different functions: +one for stable atmospheric conditions ``(ζ > 0)``, named ``ψₛ`` and two for unstable conditions, +named ``ψᵤ₁`` and ``ψᵤ₂``. +These stability functions are obtained by regression to experimental data. + +The stability parameter for stable atmospheric conditions is defined as +```math +dζ = min(ζmax, Aˢζ) +ψₛ = - (1 + Bˢ ζ) ^ Cₛ - Bˢ ( ζ - Dˢ ) * exp( - dζ) - Eˢ +``` + +While the stability parameter for unstable atmospheric conditions is calculated +as a function of the two individual stability functions as follows +```math +fᵤ₁ = √(1 - Aᵘζ) +ψᵤ₁ = Bᵘ ⋅ log((1 + fᵤ₁) / Bᵘ) + Cᵤ + +fᵤ₂ = ∛(1 - Dᵘζ) +ψᵤ₂ = Eᵘ / 2 ⋅ log((1 + fᵤ₂ + fᵤ₂²) / Eᵘ) - √Eᵘ atan( (1 + 2fᵤ₂) / √Eᵘ) + Fᵘ + +f = ζ² / (1 + ζ²) +ψᵤ = (1 - f) ψᵤ₁ + f ψᵤ₂ +``` + +The superscripts ``ˢ`` and ``ᵘ`` indicate if the parameter applies to the +stability function for _stable_ or _unstable_ atmospheric conditions, respectively. +""" +@kwdef struct ScalarStabilityFunction{FT} + ζmax :: FT = 50.0 + Aˢ :: FT = 0.35 + Bˢ :: FT = 2/3 + Cˢ :: FT = 3/2 + Dˢ :: FT = 14.28 + Eˢ :: FT = 8.525 + Aᵘ :: FT = 15.0 + Bᵘ :: FT = 2.0 + Cᵘ :: FT = 0.0 + Dᵘ :: FT = 34.15 + Eᵘ :: FT = 3.0 + Fᵘ :: FT = π / sqrt(3) +end + +@inline function (ψ::ScalarStabilityFunction)(ζ) + ζmax = ψ.ζmax + Aˢ = ψ.Aˢ + Bˢ = ψ.Bˢ + Cˢ = ψ.Cˢ + Dˢ = ψ.Dˢ + Eˢ = ψ.Eˢ + Aᵘ = ψ.Aᵘ + Bᵘ = ψ.Bᵘ + Cᵘ = ψ.Cᵘ + Dᵘ = ψ.Dᵘ + Eᵘ = ψ.Eᵘ + Fᵘ = ψ.Fᵘ + + ζ⁻ = min(zero(ζ), ζ) + ζ⁺ = max(zero(ζ), ζ) + dζ = min(ζmax, Aˢ * ζ⁺) + + # stability function for stable atmospheric conditions + ψₛ = - (1 + Bˢ * ζ⁺) ^ Cˢ - Bˢ * (ζ⁺ - Dˢ) * exp(-dζ) - Eˢ + + # Stability parameter for _unstable_ atmospheric conditions + fᵤ₁ = sqrt(1 - Aᵘ * ζ⁻) + ψᵤ₁ = Bᵘ * log((1 + fᵤ₁) / Bᵘ) + Cᵘ + + fᵤ₂ = cbrt(1 - Dᵘ * ζ⁻) + ψᵤ₂ = Eᵘ / 2 * log((1 + fᵤ₂ + fᵤ₂^2) / Eᵘ) - sqrt(Eᵘ) * atan( (1 + 2fᵤ₂) / sqrt(Eᵘ)) + Fᵘ + + f = ζ⁻^2 / (1 + ζ⁻^2) + ψᵤ = (1 - f) * ψᵤ₁ + f * ψᵤ₂ + + return ifelse(ζ < 0, ψᵤ, ψₛ) +end diff --git a/src/OceanSeaIceModels/CrossRealmFluxes/tabulated_albedo.jl b/src/OceanSeaIceModels/CrossRealmFluxes/tabulated_albedo.jl new file mode 100644 index 00000000..59379da5 --- /dev/null +++ b/src/OceanSeaIceModels/CrossRealmFluxes/tabulated_albedo.jl @@ -0,0 +1,164 @@ +using Oceananigans.Fields: interpolator +using Oceananigans.Grids: on_architecture +using Oceananigans.Utils: Time +using Base + +using ClimaOcean.OceanSeaIceModels: + PrescribedAtmosphere, + TwoBandDownwellingRadiation + +# Bilinear interpolation of the albedo α in α_table based on a +# transmissivity value (𝓉_values) and latitude (φ_values) +struct TabulatedAlbedo{M, P, T, FT} + α_table :: M + φ_values :: P + 𝓉_values :: T + S₀ :: FT # Solar constant W / m^2 + day_to_radians :: FT + noon_in_seconds :: Int +end + +Adapt.adapt_structure(to, α :: TabulatedAlbedo) = + TabulatedAlbedo(Adapt.adapt(to, α.α_table), + Adapt.adapt(to, α.φ_values), + Adapt.adapt(to, α.𝓉_values), + Adapt.adapt(to, α.S₀), + Adapt.adapt(to, α.day_to_radians), + Adapt.adapt(to, α.noon_in_seconds)) + +# Tabulated from Payne (1972) https://doi.org/10.1175/1520-0469(1972)029<0959:AOTSS>2.0.CO;2 +const α_payne = [ 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.06 + 0.062 0.062 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.06 + 0.072 0.070 0.068 0.065 0.065 0.063 0.062 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.061 0.060 0.061 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.06 + 0.087 0.083 0.079 0.073 0.070 0.068 0.066 0.065 0.064 0.063 0.062 0.061 0.061 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.06 + 0.115 0.108 0.098 0.086 0.082 0.077 0.072 0.071 0.067 0.067 0.065 0.063 0.062 0.061 0.061 0.060 0.060 0.060 0.060 0.061 0.061 0.061 0.061 0.060 0.059 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.060 0.059 0.059 0.05 + 0.163 0.145 0.130 0.110 0.101 0.092 0.084 0.079 0.072 0.072 0.068 0.067 0.064 0.063 0.062 0.061 0.061 0.061 0.060 0.060 0.060 0.060 0.060 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.05 + 0.235 0.198 0.174 0.150 0.131 0.114 0.103 0.094 0.083 0.080 0.074 0.074 0.070 0.067 0.065 0.064 0.063 0.062 0.061 0.060 0.060 0.060 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.058 0.058 0.05 + 0.318 0.263 0.228 0.192 0.168 0.143 0.127 0.113 0.099 0.092 0.084 0.082 0.076 0.072 0.070 0.067 0.065 0.064 0.062 0.062 0.060 0.060 0.060 0.059 0.059 0.059 0.059 0.059 0.059 0.059 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.058 0.057 0.058 0.058 0.058 0.058 0.057 0.057 0.05 + 0.395 0.336 0.290 0.248 0.208 0.176 0.151 0.134 0.117 0.107 0.097 0.091 0.085 0.079 0.075 0.071 0.068 0.067 0.065 0.063 0.062 0.061 0.060 0.060 0.060 0.059 0.059 0.058 0.058 0.058 0.057 0.057 0.057 0.057 0.057 0.057 0.057 0.056 0.056 0.056 0.056 0.056 0.056 0.056 0.056 0.05 + 0.472 0.415 0.357 0.306 0.252 0.210 0.176 0.154 0.135 0.125 0.111 0.102 0.094 0.086 0.081 0.076 0.072 0.071 0.068 0.066 0.065 0.063 0.062 0.061 0.060 0.059 0.058 0.057 0.057 0.057 0.056 0.055 0.055 0.055 0.055 0.055 0.055 0.054 0.053 0.054 0.053 0.053 0.054 0.054 0.053 0.05 + 0.542 0.487 0.424 0.360 0.295 0.242 0.198 0.173 0.150 0.136 0.121 0.110 0.101 0.093 0.086 0.081 0.076 0.073 0.069 0.067 0.065 0.064 0.062 0.060 0.059 0.058 0.057 0.056 0.055 0.055 0.054 0.053 0.053 0.052 0.052 0.052 0.051 0.051 0.050 0.050 0.050 0.050 0.051 0.050 0.050 0.05 + 0.604 0.547 0.498 0.407 0.331 0.272 0.219 0.185 0.160 0.141 0.127 0.116 0.105 0.097 0.089 0.083 0.077 0.074 0.069 0.066 0.063 0.061 0.059 0.057 0.056 0.055 0.054 0.053 0.053 0.052 0.051 0.050 0.050 0.049 0.049 0.049 0.048 0.047 0.047 0.047 0.046 0.046 0.047 0.047 0.046 0.04 + 0.655 0.595 0.556 0.444 0.358 0.288 0.236 0.190 0.164 0.145 0.130 0.119 0.107 0.098 0.090 0.084 0.076 0.073 0.068 0.064 0.060 0.058 0.056 0.054 0.053 0.051 0.050 0.049 0.048 0.048 0.047 0.046 0.046 0.045 0.045 0.045 0.044 0.043 0.043 0.043 0.042 0.042 0.043 0.042 0.042 0.04 + 0.693 0.631 0.588 0.469 0.375 0.296 0.245 0.193 0.165 0.145 0.131 0.118 0.106 0.097 0.088 0.081 0.074 0.069 0.065 0.061 0.057 0.055 0.052 0.050 0.049 0.047 0.046 0.046 0.044 0.044 0.043 0.042 0.042 0.041 0.041 0.040 0.040 0.039 0.039 0.039 0.038 0.038 0.038 0.038 0.038 0.03 + 0.719 0.656 0.603 0.480 0.385 0.300 0.250 0.193 0.164 0.145 0.131 0.116 0.103 0.092 0.084 0.076 0.071 0.065 0.061 0.057 0.054 0.051 0.049 0.047 0.045 0.043 0.043 0.042 0.041 0.040 0.039 0.039 0.038 0.038 0.037 0.036 0.036 0.035 0.035 0.034 0.034 0.034 0.034 0.034 0.034 0.03 + 0.732 0.670 0.592 0.474 0.377 0.291 0.246 0.190 0.162 0.144 0.130 0.114 0.100 0.088 0.080 0.072 0.067 0.062 0.058 0.054 0.050 0.047 0.045 0.043 0.041 0.039 0.039 0.038 0.037 0.036 0.036 0.035 0.035 0.034 0.033 0.032 0.032 0.032 0.031 0.031 0.031 0.030 0.030 0.030 0.030 0.03 + 0.730 0.652 0.556 0.444 0.356 0.273 0.235 0.188 0.160 0.143 0.129 0.113 0.097 0.086 0.077 0.069 0.064 0.060 0.055 0.051 0.047 0.044 0.042 0.039 0.037 0.035 0.035 0.035 0.034 0.033 0.033 0.032 0.032 0.032 0.029 0.029 0.029 0.029 0.028 0.028 0.028 0.028 0.027 0.027 0.028 0.02 + 0.681 0.602 0.488 0.386 0.320 0.252 0.222 0.185 0.159 0.142 0.127 0.111 0.096 0.084 0.075 0.067 0.062 0.058 0.054 0.050 0.046 0.042 0.040 0.036 0.035 0.033 0.032 0.032 0.031 0.030 0.030 0.030 0.030 0.029 0.027 0.027 0.027 0.027 0.026 0.026 0.026 0.026 0.026 0.026 0.026 0.02 + 0.581 0.494 0.393 0.333 0.288 0.237 0.211 0.182 0.158 0.141 0.126 0.110 0.095 0.083 0.074 0.066 0.061 0.057 0.053 0.049 0.045 0.041 0.039 0.034 0.033 0.032 0.031 0.030 0.029 0.028 0.028 0.028 0.028 0.027 0.026 0.026 0.026 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.02 + 0.453 0.398 0.342 0.301 0.266 0.226 0.205 0.180 0.157 0.140 0.125 0.109 0.095 0.083 0.074 0.065 0.061 0.057 0.052 0.048 0.044 0.040 0.038 0.033 0.032 0.031 0.030 0.029 0.028 0.027 0.027 0.026 0.026 0.026 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.02 + 0.425 0.370 0.325 0.290 0.255 0.220 0.200 0.178 0.157 0.140 0.122 0.108 0.095 0.083 0.074 0.065 0.061 0.056 0.052 0.048 0.044 0.040 0.038 0.033 0.032 0.031 0.030 0.029 0.028 0.027 0.026 0.026 0.026 0.026 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.02] + +""" + TabulatedAlbedo(arch = CPU(), FT = Float64; + S₀ = convert(FT, 1365), + α_table = α_payne, + φ_values = (0:2:90) ./ 180 * π, + 𝓉_values = 0:0.05:1) + +Constructs a `TabulatedAlbedo` object that interpolated the albedo from a value table `α_table` that +is function of latitude `φ` and atmospheric transimissivity `𝓉`. + +Note: `TabulatedAlbedo` assumes that the latitude and the transissivity in the table are uniformly spaced. + +The transmissivity of the atmosphere is calculated as the ratio of the downwelling solar radiation to the +maximum possible downwelling solar radiation for a transparent atmosphere, function of hour of the day, latitude, +and day in the year. + +# Arguments +============ +- `arch`: The architecture to use (default: `CPU()`). +- `FT`: The floating-point type to use (default: `Float64`). + +# Keyword Arguments +=================== +- `S₀`: The solar constant (default: `convert(FT, 1365)`). +- `α_table`: The table of albedo values (default: `α_payne`). +- `φ_values`: The latitude values for the table (default: `(0:2:90) ./ 180 * π`). +- `𝓉_values`: The transmissivity values for the table (default: `0:0.05:1`). +""" +function TabulatedAlbedo(arch = CPU(), FT = Float64; + S₀ = convert(FT, 1365), + α_table = α_payne, + φ_values = (0:2:90) ./ 180 * π, + 𝓉_values = 0:0.05:1, + day_to_radians = convert(FT, 2π / 86400), + noon_in_seconds = 86400 ÷ 2 # assumes that midnight is at t = 0 seconds + ) + + # Make everything GPU - ready + α_table = on_architecture(arch, convert.(FT, α_table)) + φ_values = on_architecture(arch, convert.(FT, φ_values)) + 𝓉_values = on_architecture(arch, convert.(FT, 𝓉_values)) + + return TabulatedAlbedo(α_table, φ_values, 𝓉_values, convert(FT, S₀), convert(FT, day_to_radians), noon_in_seconds) +end + +Base.eltype(α::TabulatedAlbedo) = Base.eltype(α.S₀) + +@inline ϕ₁(ξ, η) = (1 - ξ) * (1 - η) +@inline ϕ₂(ξ, η) = (1 - ξ) * η +@inline ϕ₃(ξ, η) = ξ * (1 - η) +@inline ϕ₄(ξ, η) = ξ * η + +# Assumption: if the time is represented by a number it is defined in seconds. +# TODO: extend these functions for `DateTime` times when these are supported in +# Oceananigans. +@inline simulation_day(time::Time{<:Number}) = time.time ÷ 86400 +@inline seconds_in_day(time::Time{<:Number}, day) = time.time - day * 86400 + +@inline function net_downwelling_radiation(i, j, grid, time, radiation::Radiation{<:Any, <:Any, <:SurfaceProperties{<:TabulatedAlbedo}}, Qs, Qℓ) + α = radiation.reflection.ocean + + FT = eltype(α) + + λ, φ, z = node(i, j, 1, grid, Center(), Center(), Center()) + + φ = deg2rad(φ) + λ = deg2rad(λ) + + day = simulation_day(time) + day2rad = α.day_to_radians + noon_in_sec = α.noon_in_seconds + sec_of_day = seconds_in_day(time, day) + + # Hour angle h + h = (sec_of_day - noon_in_sec) * day2rad + λ + + # Declination angle δ + march_first = 80 + δ = deg2rad((23 + 27/60) * sind(360 * (day - march_first) / 365.25)) + δ = convert(FT, δ) + + # Zenith angle of the sun (if smaller than 0 we are in the dark) + cosθₛ = max(0, sin(φ) * sin(δ) + cos(h) * cos(δ) * cos(φ)) + + # Maximum downwelling solar radiation for + # a transparent atmosphere + Qmax = α.S₀ * cosθₛ + + # Finding the transmissivity and capping it to 1 + 𝓉 = ifelse(Qmax > 0, min(1, Qs / Qmax), 0) + + # finding the i-index in the table (depending on transmissivity) + # we assume that the transmissivity is tabulated with a constant spacing + 𝓉₁ = @inbounds α.𝓉_values[1] + Δ𝓉 = @inbounds α.𝓉_values[2] - 𝓉₁ + i⁻, i⁺, ξ = interpolator((𝓉 - 𝓉₁) / Δ𝓉) + + # finding the j-index in the table (depending on latitude) + # we assume that the transmissivity is tabulated with a constant spacing + φ₁ = @inbounds α.φ_values[1] + Δφ = @inbounds α.φ_values[2] - φ₁ + j⁻, j⁺, η = interpolator((abs(φ) - φ₁) / Δφ) + + # Bilinear interpolation! + α = @inbounds ϕ₁(ξ, η) * getindex(α.α_table, i⁻, j⁻) + + ϕ₂(ξ, η) * getindex(α.α_table, i⁻, j⁺) + + ϕ₃(ξ, η) * getindex(α.α_table, i⁺, j⁻) + + ϕ₄(ξ, η) * getindex(α.α_table, i⁺, j⁺) + + ϵ = stateindex(radiation.emission.ocean, i, j, 1, grid, time) + + return - (1 - α) * Qs - ϵ * Qℓ +end diff --git a/src/OceanSeaIceModels/OceanSeaIceModels.jl b/src/OceanSeaIceModels/OceanSeaIceModels.jl index 90629718..4a9eaf7c 100644 --- a/src/OceanSeaIceModels/OceanSeaIceModels.jl +++ b/src/OceanSeaIceModels/OceanSeaIceModels.jl @@ -1,5 +1,7 @@ module OceanSeaIceModels +export OceanSeaIceModel, SimilarityTheoryTurbulentFluxes + using Oceananigans using SeawaterPolynomials @@ -44,12 +46,13 @@ include("PrescribedAtmospheres.jl") using .PrescribedAtmospheres: PrescribedAtmosphere, - TwoStreamDownwellingRadiation + TwoBandDownwellingRadiation include("CrossRealmFluxes/CrossRealmFluxes.jl") using .CrossRealmFluxes +include("minimum_temperature_sea_ice.jl") include("ocean_sea_ice_model.jl") include("ocean_only_model.jl") include("time_step_ocean_sea_ice_model.jl") @@ -60,10 +63,8 @@ import .CrossRealmFluxes: # "No atmosphere" implementation const NoAtmosphereModel = OceanSeaIceModel{<:Any, Nothing} -const NoSeaIceModel = OceanSeaIceModel{Nothing} compute_atmosphere_ocean_fluxes!(coupled_model::NoAtmosphereModel) = nothing -compute_sea_ice_ocean_fluxes!(coupled_model::NoSeaIceModel) = nothing ##### ##### A fairly dumb, but nevertheless effective "sea ice model" diff --git a/src/OceanSeaIceModels/PrescribedAtmospheres.jl b/src/OceanSeaIceModels/PrescribedAtmospheres.jl index 10925962..3a9f3afb 100644 --- a/src/OceanSeaIceModels/PrescribedAtmospheres.jl +++ b/src/OceanSeaIceModels/PrescribedAtmospheres.jl @@ -94,7 +94,7 @@ function ConstitutiveParameters(FT = Float64; convert(FT, water_molar_mass)) end -const CP = ConstitutiveParameters +const CP{FT} = ConstitutiveParameters{FT} where FT @inline gas_constant(p::CP) = p.gas_constant @inline molmass_dryair(p::CP) = p.dry_air_molar_mass @@ -141,7 +141,7 @@ function HeatCapacityParameters(FT = Float64; convert(FT, water_ice_heat_capacity)) end -const HCP = HeatCapacityParameters +const HCP{FT} = HeatCapacityParameters{FT} where FT @inline cp_v(p::HCP) = p.water_vapor_heat_capacity @inline cp_l(p::HCP) = p.liquid_water_heat_capacity @inline cp_i(p::HCP) = p.water_ice_heat_capacity @@ -190,7 +190,7 @@ function PhaseTransitionParameters(FT = Float64; convert(FT, total_ice_nucleation_temperature)) end -const PTP = PhaseTransitionParameters +const PTP{FT} = PhaseTransitionParameters{FT} where FT @inline LH_v0(p::PTP) = p.reference_vaporization_enthalpy @inline LH_s0(p::PTP) = p.reference_sublimation_enthalpy @inline LH_f0(p::PTP) = LH_s0(p) - LH_v0(p) @@ -209,6 +209,11 @@ end const PATP{FT} = PrescribedAtmosphereThermodynamicsParameters{FT} where FT +Base.eltype(::PATP{FT}) where FT = FT +Base.eltype(::CP{FT}) where FT = FT +Base.eltype(::HCP{FT}) where FT = FT +Base.eltype(::PTP{FT}) where FT = FT + Base.summary(::PATP{FT}) where FT = "PrescribedAtmosphereThermodynamicsParameters{$FT}" function Base.show(io::IO, p::PrescribedAtmosphereThermodynamicsParameters) @@ -282,16 +287,18 @@ const PATP = PrescribedAtmosphereThermodynamicsParameters ##### Prescribed atmosphere (as opposed to dynamically evolving / prognostic) ##### -struct PrescribedAtmosphere{G, U, P, C, F, R, TP, TI, FT} +struct PrescribedAtmosphere{G, U, P, C, F, I, R, TP, TI, FT} grid :: G velocities :: U pressure :: P tracers :: C freshwater_flux :: F + runoff_flux :: I downwelling_radiation :: R thermodynamics_parameters :: TP times :: TI reference_height :: FT + boundary_layer_height :: FT end Base.summary(::PrescribedAtmosphere) = "PrescribedAtmosphere" @@ -312,8 +319,10 @@ state with data given at `times`. function PrescribedAtmosphere(times, FT=Float64; reference_height, velocities = nothing, + boundary_layer_height = convert(FT, 600), pressure = nothing, freshwater_flux = nothing, + runoff_flux = nothing, downwelling_radiation = nothing, thermodynamics_parameters = PrescribedAtmosphereThermodynamicsParameters(FT), grid = nothing, @@ -329,10 +338,12 @@ function PrescribedAtmosphere(times, FT=Float64; pressure, tracers, freshwater_flux, + runoff_flux, downwelling_radiation, thermodynamics_parameters, times, - convert(FT, reference_height)) + convert(FT, reference_height), + convert(FT, boundary_layer_height)) end update_model_field_time_series!(::Nothing, time) = nothing @@ -346,23 +357,23 @@ function update_model_field_time_series!(atmos::PrescribedAtmosphere, time) return nothing end -struct TwoStreamDownwellingRadiation{SW, LW} +struct TwoBandDownwellingRadiation{SW, LW} shortwave :: SW longwave :: LW end """ - TwoStreamDownwellingRadiation(shortwave=nothing, longwave=nothing) + TwoBandDownwellingRadiation(shortwave=nothing, longwave=nothing) -Return a two-stream model for downwelling radiation that -passes through he atmosphere and arrives at the surface of ocean +Return a two-band model for downwelling radiation (split in a shortwave band +and a longwave band) that passes through the atmosphere and arrives at the surface of ocean or sea ice. """ -TwoStreamDownwellingRadiation(; shortwave=nothing, longwave=nothing) = - TwoStreamDownwellingRadiation(shortwave, longwave) +TwoBandDownwellingRadiation(; shortwave=nothing, longwave=nothing) = + TwoBandDownwellingRadiation(shortwave, longwave) -Adapt.adapt_structure(to, tsdr::TwoStreamDownwellingRadiation) = - TwoStreamDownwellingRadiation(adapt(to, tsdr.shortwave), +Adapt.adapt_structure(to, tsdr::TwoBandDownwellingRadiation) = + TwoBandDownwellingRadiation(adapt(to, tsdr.shortwave), adapt(to, tsdr.longwave)) end # module diff --git a/src/OceanSeaIceModels/minimum_temperature_sea_ice.jl b/src/OceanSeaIceModels/minimum_temperature_sea_ice.jl new file mode 100644 index 00000000..3a3c8894 --- /dev/null +++ b/src/OceanSeaIceModels/minimum_temperature_sea_ice.jl @@ -0,0 +1,65 @@ +using Oceananigans.Architectures: architecture + +import ClimaOcean.OceanSeaIceModels.CrossRealmFluxes: limit_fluxes_over_sea_ice! + +""" + struct MinimumTemperatureSeaIce{T} + +The minimal possible sea ice representation, providing an "Insulating layer" on the surface. +Not really a ``model'' per se, however, it is the most simple way to make sure that temperature +does not dip below freezing temperature. +All fluxes are shut down when the surface is below the `minimum_temperature` except for heating. + +# Fields +- `minimum_temperature`: The minimum temperature of water. +""" +struct MinimumTemperatureSeaIce{T} + minimum_temperature :: T +end + +MinimumTemperatureSeaIce() = MinimumTemperatureSeaIce(-1.8) + +function limit_fluxes_over_sea_ice!(grid, kernel_parameters, sea_ice::MinimumTemperatureSeaIce, + centered_velocity_fluxes, + net_tracer_fluxes, + ocean_temperature, + ocean_salinity) + + launch!(architecture(grid), grid, kernel_parameters, _cap_fluxes_on_sea_ice!, + centered_velocity_fluxes, + net_tracer_fluxes, + grid, + sea_ice.minimum_temperature, + ocean_temperature) + + return nothing +end + +@kernel function _cap_fluxes_on_sea_ice!(centered_velocity_fluxes, + net_tracer_fluxes, + grid, + minimum_temperature, + ocean_temperature) + + i, j = @index(Global, NTuple) + + @inbounds begin + Tₒ = ocean_temperature[i, j, 1] + + Jᵘ = centered_velocity_fluxes.u + Jᵛ = centered_velocity_fluxes.v + Jᵀ = net_tracer_fluxes.T + Jˢ = net_tracer_fluxes.S + + sea_ice = Tₒ < minimum_temperature + cooling_sea_ice = sea_ice & (Jᵀ[i, j, 1] > 0) + + # Don't allow the ocean to cool below the minimum temperature! (make sure it heats up though!) + Jᵀ[i, j, 1] = ifelse(cooling_sea_ice, zero(grid), Jᵀ[i, j, 1]) + + # If we are in a "sea ice" region we remove all fluxes + Jˢ[i, j, 1] = ifelse(sea_ice, zero(grid), Jˢ[i, j, 1]) + Jᵘ[i, j, 1] = ifelse(sea_ice, zero(grid), Jᵘ[i, j, 1]) + Jᵛ[i, j, 1] = ifelse(sea_ice, zero(grid), Jᵛ[i, j, 1]) + end +end diff --git a/src/OceanSeaIceModels/ocean_only_model.jl b/src/OceanSeaIceModels/ocean_only_model.jl index 2d7b1bdc..1fa1b3ce 100644 --- a/src/OceanSeaIceModels/ocean_only_model.jl +++ b/src/OceanSeaIceModels/ocean_only_model.jl @@ -1,54 +1,34 @@ const OceanOnlyModel = OceanSeaIceModel{Nothing} +const OceanSimplifiedSeaIceModel = OceanSeaIceModel{<:MinimumTemperatureSeaIce} -OceanOnlyModel(ocean; kw...) = OceanSeaIceModel(nothing, ocean; kw...) +const NoSeaIceModel = Union{OceanOnlyModel, OceanSimplifiedSeaIceModel} ##### -##### No ice-ocean fluxes in this model!! +##### No ice-ocean fluxes in these models!! ##### -#= -compute_ice_ocean_salinity_flux!(::OceanOnlyModel) = nothing -ice_ocean_latent_heat!(::OceanOnlyModel) = nothing +import ClimaOcean.OceanSeaIceModels.CrossRealmFluxes: compute_sea_ice_ocean_fluxes! -##### -##### Air-sea fluxes -##### +compute_sea_ice_ocean_fluxes!(::NoSeaIceModel) = nothing + +function time_step!(coupled_model::NoSeaIceModel, Δt; callbacks=[], compute_tendencies=true) + ocean = coupled_model.ocean + + # Be paranoid and update state at iteration 0 + coupled_model.clock.iteration == 0 && update_state!(coupled_model, callbacks) -function time_step!(coupled_model::OceanOnlyModel, Δt; callbacks=nothing) time_step!(ocean) - tick!(coupled_model.clock, Δt) - return nothing -end -function update_state!(coupled_model::OceanOnlyModel; callbacks=nothing) - compute_air_sea_flux!(coupled_model) + tick!(coupled_model.clock, ocean.Δt) # An Ocean-only model advances with the ocean time-step! + update_state!(coupled_model, callbacks; compute_tendencies) + return nothing end -function compute_air_sea_fluxes!(coupled_model::OceanOnlyModel) - ocean = coupled_model.ocean - forcing = coupled_model.atmospheric_forcing - - (; T, S) = ocean.model.tracers - (; u, v) = ocean.model.velocities - - grid = ocean.model.grid - clock = ocean.model.clock - fields = prognostic_fields(ocean.model) - - Qˢ = T.boundary_conditions.top.condition - Fˢ = S.boundary_conditions.top.condition - τˣ = u.boundary_conditions.top.condition - τʸ = v.boundary_conditions.top.condition - - ε = coupled_model.ocean_emissivity - ρₒ = coupled_model.ocean_reference_density - cₒ = coupled_model.ocean_heat_capacity - I₀ = coupled_model.solar_insolation - - launch!(ocean, :xy, _calculate_air_sea_fluxes!, Qˢ, Fˢ, τˣ, τʸ, ρₒ, cₒ, ε, Iₒ, - grid, clock, fields, forcing, nothing) - +function update_state!(coupled_model::NoSeaIceModel, callbacks=[]; compute_tendencies=false) + time = Time(coupled_model.clock.time) + update_model_field_time_series!(coupled_model.atmosphere, time) + compute_atmosphere_ocean_fluxes!(coupled_model) return nothing end -=# + diff --git a/src/OceanSeaIceModels/ocean_sea_ice_model.jl b/src/OceanSeaIceModels/ocean_sea_ice_model.jl index 8a0cb264..0790511f 100644 --- a/src/OceanSeaIceModels/ocean_sea_ice_model.jl +++ b/src/OceanSeaIceModels/ocean_sea_ice_model.jl @@ -59,12 +59,18 @@ end function OceanSeaIceModel(ocean, sea_ice=nothing; atmosphere = nothing, radiation = nothing, + similarity_theory = nothing, ocean_reference_density = reference_density(ocean), ocean_heat_capacity = heat_capacity(ocean), clock = deepcopy(ocean.model.clock)) # Contains information about flux contributions: bulk formula, prescribed fluxes, etc. - fluxes = OceanSeaIceSurfaceFluxes(ocean, sea_ice; atmosphere, radiation) + fluxes = OceanSeaIceSurfaceFluxes(ocean, sea_ice; + atmosphere, + ocean_reference_density, + similarity_theory, + ocean_heat_capacity, + radiation) ocean_sea_ice_model = OceanSeaIceModel(clock, ocean.model.grid, diff --git a/src/OceanSeaIceModels/time_step_ocean_sea_ice_model.jl b/src/OceanSeaIceModels/time_step_ocean_sea_ice_model.jl index 0f8941e6..d150e8ab 100644 --- a/src/OceanSeaIceModels/time_step_ocean_sea_ice_model.jl +++ b/src/OceanSeaIceModels/time_step_ocean_sea_ice_model.jl @@ -39,6 +39,7 @@ function time_step!(coupled_model::OceanSeaIceModel, Δt; callbacks=[], compute_ # - Store fractional ice-free / ice-covered _time_ for more # accurate flux computation? tick!(coupled_model.clock, Δt) + update_state!(coupled_model, callbacks; compute_tendencies) return nothing diff --git a/src/OceanSimulations/OceanSimulations.jl b/src/OceanSimulations/OceanSimulations.jl index 5e995a45..ae9cbe68 100644 --- a/src/OceanSimulations/OceanSimulations.jl +++ b/src/OceanSimulations/OceanSimulations.jl @@ -1,5 +1,13 @@ module OceanSimulations +export ocean_simulation + +using Oceananigans +using Oceananigans.Units +using Oceananigans.Advection: TracerAdvection +using Oceananigans.Coriolis: ActiveCellEnstrophyConserving +using Oceananigans.ImmersedBoundaries: immersed_peripheral_node, inactive_node + using Oceananigans.TurbulenceClosures.CATKEVerticalDiffusivities: CATKEVerticalDiffusivity, MixingLength, @@ -9,9 +17,10 @@ using SeawaterPolynomials.TEOS10: TEOS10EquationOfState using Oceananigans.BuoyancyModels: g_Earth using Oceananigans.Coriolis: Ω_Earth +using Oceananigans.Operators -# Some defualts -default_free_surface(grid) = SplitExplicitFreeSurface(cfl=0.7; grid) +# Some defaults +default_free_surface(grid) = SplitExplicitFreeSurface(grid; cfl=0.7) function default_ocean_closure() mixing_length = MixingLength(Cᵇ=0.01) @@ -19,14 +28,41 @@ function default_ocean_closure() return CATKEVerticalDiffusivity(; mixing_length, turbulent_kinetic_energy_equation) end +default_momentum_advection() = VectorInvariant(; vorticity_scheme = WENO(; order = 9), + vertical_scheme = Centered(), + divergence_scheme = WENO()) + +default_tracer_advection() = TracerAdvection(WENO(; order = 7), + WENO(; order = 7), + Centered()) + +@inline ϕ²(i, j, k, grid, ϕ) = @inbounds ϕ[i, j, k]^2 +@inline spᶠᶜᶜ(i, j, k, grid, Φ) = @inbounds sqrt(Φ.u[i, j, k]^2 + ℑxyᶠᶜᵃ(i, j, k, grid, ϕ², Φ.v)) +@inline spᶜᶠᶜ(i, j, k, grid, Φ) = @inbounds sqrt(Φ.v[i, j, k]^2 + ℑxyᶜᶠᵃ(i, j, k, grid, ϕ², Φ.u)) + +@inline u_quadratic_bottom_drag(i, j, grid, c, Φ, μ) = @inbounds - μ * Φ.u[i, j, 1] * spᶠᶜᶜ(i, j, 1, grid, Φ) +@inline v_quadratic_bottom_drag(i, j, grid, c, Φ, μ) = @inbounds - μ * Φ.v[i, j, 1] * spᶜᶠᶜ(i, j, 1, grid, Φ) + +@inline is_immersed_drag_u(i, j, k, grid) = Int(immersed_peripheral_node(i, j, k-1, grid, Face(), Center(), Center()) & !inactive_node(i, j, k, grid, Face(), Center(), Center())) +@inline is_immersed_drag_v(i, j, k, grid) = Int(immersed_peripheral_node(i, j, k-1, grid, Center(), Face(), Center()) & !inactive_node(i, j, k, grid, Center(), Face(), Center())) + +# Keep a constant linear drag parameter independent on vertical level +@inline u_immersed_bottom_drag(i, j, k, grid, clock, fields, μ) = @inbounds - μ * fields.u[i, j, k] * is_immersed_drag_u(i, j, k, grid) * spᶠᶜᶜ(i, j, k, grid, fields) / Δzᶠᶜᶜ(i, j, k, grid) +@inline v_immersed_bottom_drag(i, j, k, grid, clock, fields, μ) = @inbounds - μ * fields.v[i, j, k] * is_immersed_drag_v(i, j, k, grid) * spᶜᶠᶜ(i, j, k, grid, fields) / Δzᶜᶠᶜ(i, j, k, grid) + # TODO: Specify the grid to a grid on the sphere; otherwise we can provide a different # function that requires latitude and longitude etc for computing coriolis=FPlane... -function ocean_simulation(grid; +function ocean_simulation(grid; Δt = 5minutes, closure = default_ocean_closure(), free_surface = default_free_surface(grid), reference_density = 1020, rotation_rate = Ω_Earth, - gravitational_acceleration = g_Earth) + gravitational_acceleration = g_Earth, + bottom_drag_coefficient = 0.003, + coriolis = HydrostaticSphericalCoriolis(; rotation_rate), + momentum_advection = default_momentum_advection(), + tracer_advection = default_tracer_advection(), + verbose = false) # Set up boundary conditions using Field top_zonal_momentum_flux = Jᵘ = Field{Face, Center, Nothing}(grid) @@ -34,35 +70,39 @@ function ocean_simulation(grid; top_ocean_heat_flux = Jᵀ = Field{Center, Center, Nothing}(grid) top_salt_flux = Jˢ = Field{Center, Center, Nothing}(grid) - ocean_boundary_conditions = (u = FieldBoundaryConditions(top=FluxBoundaryCondition(Jᵘ)), - v = FieldBoundaryConditions(top=FluxBoundaryCondition(Jᵛ)), - T = FieldBoundaryConditions(top=FluxBoundaryCondition(Jᵀ)), - S = FieldBoundaryConditions(top=FluxBoundaryCondition(Jˢ))) + u_bot_bc = FluxBoundaryCondition(u_quadratic_bottom_drag, discrete_form=true, parameters=bottom_drag_coefficient) + v_bot_bc = FluxBoundaryCondition(v_quadratic_bottom_drag, discrete_form=true, parameters=bottom_drag_coefficient) + + ocean_boundary_conditions = (u = FieldBoundaryConditions(top = FluxBoundaryCondition(Jᵘ), bottom = u_bot_bc), + v = FieldBoundaryConditions(top = FluxBoundaryCondition(Jᵛ), bottom = v_bot_bc), + T = FieldBoundaryConditions(top = FluxBoundaryCondition(Jᵀ)), + S = FieldBoundaryConditions(top = FluxBoundaryCondition(Jˢ))) + if !(grid isa ImmersedBoundaryGrid) + forcing = NamedTuple() + else + Fu = Forcing(u_immersed_bottom_drag, discrete_form=true, parameters=bottom_drag_coefficient) + Fv = Forcing(v_immersed_bottom_drag, discrete_form=true, parameters=bottom_drag_coefficient) + forcing = (; u = Fu, v = Fv) + end + # Use the TEOS10 equation of state teos10 = TEOS10EquationOfState(; reference_density) buoyancy = SeawaterBuoyancy(; gravitational_acceleration, equation_of_state=teos10) # Minor simplifications for single column grids - Nx, Ny, Nz = size(grid) + Nx, Ny, _ = size(grid) if Nx == Ny == 1 # single column grid tracer_advection = nothing momentum_advection = nothing - else - # TODO: better advection scheme - tracer_advection = WENO() - momentum_advection = VectorInvariant(vorticity_scheme = WENO(), - divergence_scheme = WENO(), - vertical_scheme = WENO()) end tracers = (:T, :S) if closure isa CATKEVerticalDiffusivity tracers = tuple(tracers..., :e) + tracer_advection = (; T = tracer_advection, S = tracer_advection, e = nothing) end - coriolis = HydrostaticSphericalCoriolis(; rotation_rate) - ocean_model = HydrostaticFreeSurfaceModel(; grid, buoyancy, closure, @@ -71,9 +111,10 @@ function ocean_simulation(grid; tracers, free_surface, coriolis, + forcing, boundary_conditions = ocean_boundary_conditions) - ocean = Simulation(ocean_model; Δt=5minutes, verbose=false) + ocean = Simulation(ocean_model; Δt, verbose) return ocean end diff --git a/src/VerticalGrids.jl b/src/VerticalGrids.jl index 220d791c..e569b660 100644 --- a/src/VerticalGrids.jl +++ b/src/VerticalGrids.jl @@ -1,6 +1,9 @@ module VerticalGrids -export stretched_vertical_faces, PowerLawStretching, LinearStretching +export stretched_vertical_faces, + exponential_z_faces, + PowerLawStretching, + LinearStretching struct PowerLawStretching{T} power :: T @@ -75,6 +78,21 @@ function stretched_vertical_faces(; surface_layer_Δz = 5.0, return z end +@inline exponential_profile(z; Lz, h) = (exp(z / h) - exp( - Lz / h)) / (1 - exp( - Lz / h)) + +function exponential_z_faces(; Nz, depth, h = Nz / 4.5) + + z_faces = exponential_profile.((1:Nz+1); Lz = Nz, h) + + # Normalize + z_faces .-= z_faces[1] + z_faces .*= - depth / z_faces[end] + + z_faces[1] = 0.0 + + return reverse(z_faces) +end + # Vertical grid with 49 levels. # Stretched from 10 meters spacing at surface # to 400 meter at the bottom. diff --git a/test/field_time_series_utilities.jl b/test/field_time_series_utilities.jl deleted file mode 100644 index e69de29b..00000000 diff --git a/test/runtests.jl b/test/runtests.jl index 36879aab..999c9374 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -17,3 +17,7 @@ end if test_group == :downloading || test_group == :all include("test_downloading.jl") end + +if test_group == :turbulent_fluxes || test_group == :all + include("test_surface_fluxes.jl") +end \ No newline at end of file diff --git a/test/test_ecco2.jl b/test/test_ecco2.jl index abbebec2..c940c2b3 100644 --- a/test/test_ecco2.jl +++ b/test/test_ecco2.jl @@ -43,7 +43,7 @@ end @testset "setting a field with ECCO2" begin for arch in test_architectures - grid = LatitudeLongitudeGrid(size = (10, 10, 10), latitude = (-60, -40), longitude = (-5, 5), z = (-200, 0)) + grid = LatitudeLongitudeGrid(size = (10, 10, 10), latitude = (-60, -40), longitude = (175, 185), z = (-200, 0)) field = CenterField(grid) set!(field, ECCO2Metadata(:temperature)) set!(field, ECCO2Metadata(:salinity)) diff --git a/test/test_surface_fluxes.jl b/test/test_surface_fluxes.jl new file mode 100644 index 00000000..35c875d6 --- /dev/null +++ b/test/test_surface_fluxes.jl @@ -0,0 +1,139 @@ +include("runtests_setup.jl") + +using ClimaOcean.OceanSeaIceModels.CrossRealmFluxes: + celsius_to_kelvin, + convert_to_kelvin, + SimilarityScales, + seawater_saturation_specific_humidity + +using Thermodynamics +import ClimaOcean.OceanSeaIceModels.CrossRealmFluxes: water_saturation_specific_humidity + +struct FixedSpecificHumidity{FT} + qₒ :: FT +end + +@inline water_saturation_specific_humidity(h::FixedSpecificHumidity, args...) = h.qₒ + +@testset "Test surface fluxes" begin + @info " Testing zero fluxes..." + + grid = LatitudeLongitudeGrid(size = (1, 1, 1), + latitude = (-0.5, 0.5), + longitude = (-0.5, 0.5), + z = (-1, 0), + topology = (Periodic, Periodic, Bounded)) + + ocean = ocean_simulation(grid; momentum_advection = nothing, + tracer_advection = nothing, + closure = nothing, + bottom_drag_coefficient = 0.0) + + atmosphere = JRA55_prescribed_atmosphere(1:2; grid, backend = InMemory()) + + h = atmosphere.reference_height + pₐ = atmosphere.pressure[1][1, 1, 1] + + Tₐ = atmosphere.tracers.T[1][1, 1, 1] + qₐ = atmosphere.tracers.q[1][1, 1, 1] + + uₐ = atmosphere.velocities.u[1][1, 1, 1] + vₐ = atmosphere.velocities.v[1][1, 1, 1] + + ℂₐ = atmosphere.thermodynamics_parameters + + # Force the saturation humidity of the ocean to be + # equal to the atmospheric saturation humidity + water_vapor_saturation = FixedSpecificHumidity(qₐ) + water_mole_fraction = 1 + + # turbulent fluxes that force a specific humidity at the ocean's surface + similarity_theory = SimilarityTheoryTurbulentFluxes(grid; water_vapor_saturation, water_mole_fraction) + + # Thermodynamic parameters of the atmosphere + g = similarity_theory.gravitational_acceleration + 𝒬ₐ = Thermodynamics.PhaseEquil_pTq(ℂₐ, pₐ, Tₐ, qₐ) + cp = Thermodynamics.cp_m(ℂₐ, 𝒬ₐ) + ρₐ = Thermodynamics.air_density(ℂₐ, 𝒬ₐ) + ℰv = Thermodynamics.latent_heat_vapor(ℂₐ, 𝒬ₐ) + + # Ensure that the ΔT between atmosphere and ocean is zero + # Note that the Δθ accounts for the "lapse rate" at height h + Tₒ = Tₐ - celsius_to_kelvin + h / cp * g + + set!(ocean.model, u = uₐ, v = vₐ, T = Tₒ) + + # Compute the turbulent fluxes (neglecting radiation) + coupled_model = OceanSeaIceModel(ocean; atmosphere, similarity_theory) + turbulent_fluxes = coupled_model.fluxes.turbulent.fields + + # Make sure all fluxes are (almost) zero! + @test turbulent_fluxes.x_momentum[1, 1, 1] < eps(eltype(grid)) + @test turbulent_fluxes.y_momentum[1, 1, 1] < eps(eltype(grid)) + @test turbulent_fluxes.sensible_heat[1, 1, 1] < eps(eltype(grid)) + @test turbulent_fluxes.latent_heat[1, 1, 1] < eps(eltype(grid)) + @test turbulent_fluxes.water_vapor[1, 1, 1] < eps(eltype(grid)) + + @info " Testing neutral fluxes..." + + # Constructing very special fluxes that do not account for stability of + # the atmosphere, have zero gustiness and a constant roughness length of + # `1e-4` for momentum, water vapor and temperature + # For this case we can compute the fluxes by hand. + + @inline neutral_bulk_coefficients(ψ, h, ℓ, L) = log(h / ℓ) + + ℓ = 1e-4 + + roughness_lengths = SimilarityScales(ℓ, ℓ, ℓ) + similarity_theory = SimilarityTheoryTurbulentFluxes(grid; + roughness_lengths, + gustiness_parameter = 0, + bulk_coefficients = neutral_bulk_coefficients) + + # mid-latitude ocean conditions + set!(ocean.model, u = 0, v = 0, T = 15, S = 30) + + coupled_model = OceanSeaIceModel(ocean; atmosphere, similarity_theory) + + # Now manually compute the fluxes: + Tₒ = ocean.model.tracers.T[1, 1, 1] + celsius_to_kelvin + Sₒ = ocean.model.tracers.S[1, 1, 1] + qₒ = seawater_saturation_specific_humidity(ℂₐ, Tₒ, Sₒ, 𝒬ₐ, + similarity_theory.water_mole_fraction, + similarity_theory.water_vapor_saturation, + Thermodynamics.Liquid()) + + 𝒬ₒ = Thermodynamics.PhaseEquil_pTq(ℂₐ, pₐ, Tₒ, qₒ) + qₒ = Thermodynamics.vapor_specific_humidity(ℂₐ, 𝒬ₒ) + + # Differences! + Δu = uₐ + Δv = vₐ + ΔU = sqrt(Δu^2 + Δv^2) + Δθ = Tₐ - Tₒ + h / cp * g + Δq = qₐ - qₒ + ϰ = similarity_theory.von_karman_constant + + # Characteristic scales + u★ = ϰ / log(h / ℓ) * ΔU + θ★ = ϰ / log(h / ℓ) * Δθ + q★ = ϰ / log(h / ℓ) * Δq + + τx = - ρₐ * u★^2 * Δu / sqrt(Δu^2 + Δv^2) + τy = - ρₐ * u★^2 * Δv / sqrt(Δu^2 + Δv^2) + Qs = - ρₐ * cp * u★ * θ★ + Mv = - ρₐ * u★ * q★ + Ql = - ρₐ * u★ * q★ * ℰv + + turbulent_fluxes = coupled_model.fluxes.turbulent.fields + + # Make sure fluxes agree with the hand-calculated ones + @test turbulent_fluxes.x_momentum[1, 1, 1] ≈ τx + @test turbulent_fluxes.y_momentum[1, 1, 1] ≈ τy + @test turbulent_fluxes.sensible_heat[1, 1, 1] ≈ Qs + @test turbulent_fluxes.latent_heat[1, 1, 1] ≈ Ql + @test turbulent_fluxes.water_vapor[1, 1, 1] ≈ Mv +end + +