diff --git a/Project.toml b/Project.toml index 4a5264455..4664abbf8 100644 --- a/Project.toml +++ b/Project.toml @@ -10,6 +10,8 @@ CFTime = "179af706-886a-5703-950a-314cd64e0468" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" CUDA_Compiler_jll = "d1e2174e-dfdc-576e-b43e-73b79eb1aca8" ClimaSeaIce = "6ba0ff68-24e6-4315-936c-2e99227c95a4" +CondaPkg = "992eb4ea-22a4-4c89-a5bb-47a3300528ab" +CopernicusClimateDataStore = "bce3f73f-acea-4481-bd86-df89ecc2cb46" CubicSplines = "9c784101-8907-5a6d-9be6-98f00873c89b" DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" @@ -26,6 +28,7 @@ Oceananigans = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" Scratch = "6c6a2e73-6563-6170-7368-637461726353" SeawaterPolynomials = "d496a93d-167e-4197-9f49-d3af4ff8fe40" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" @@ -34,6 +37,7 @@ Thermodynamics = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" ZipFile = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" [weakdeps] +MITgcm = "dce5fa8e-68ce-4431-a242-9469c69627a0" Breeze = "660aa2fb-d4c8-4359-a52c-9c057bc511da" CDSAPI = "8a7b9de3-9c00-473e-88b4-7eccd7ef2fea" CondaPkg = "992eb4ea-22a4-4c89-a5bb-47a3300528ab" @@ -44,10 +48,14 @@ SpeedyWeather = "9e226e20-d153-4fed-8a5b-493def4f21a9" WorldOceanAtlasTools = "04f20302-f1b9-11e8-29d9-7d841cb0a64a" XESMF = "2e0b0046-e7a1-486f-88de-807ee8ffabe5" +[sources] +MITgcm = {url = "https://github.com/simone-silvestri/MITgcm.jl.git", rev = "ss-gf-jmc/mitgcm-running-in-julia"} + [extensions] NumericalEarthBreezeExt = "Breeze" NumericalEarthCDSAPIExt = "CDSAPI" NumericalEarthCopernicusMarineExt = "CopernicusMarine" +NumericalEarthMITgcmExt = "MITgcm" NumericalEarthReactantExt = "Reactant" NumericalEarthSpeedyWeatherExt = ["SpeedyWeather", "XESMF"] NumericalEarthVerosExt = ["PythonCall", "CondaPkg"] @@ -71,6 +79,7 @@ Glob = "1" ImageMorphology = "0.4" JLD2 = "0.4, 0.5, 0.6" KernelAbstractions = "0.9" +MITgcm = "0.5" MPI = "0.20" MeshArrays = "0.3, 0.4, 0.5" NCDatasets = "0.12, 0.13, 0.14" @@ -95,6 +104,7 @@ Breeze = "660aa2fb-d4c8-4359-a52c-9c057bc511da" CDSAPI = "8a7b9de3-9c00-473e-88b4-7eccd7ef2fea" CUDA_Runtime_jll = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" Coverage = "a2441757-f6aa-5fb2-8edb-039e3f45d037" +MITgcm = "dce5fa8e-68ce-4431-a242-9469c69627a0" MPIPreferences = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" WorldOceanAtlasTools = "04f20302-f1b9-11e8-29d9-7d841cb0a64a" diff --git a/examples/mitgcm/.gitignore b/examples/mitgcm/.gitignore new file mode 100644 index 000000000..914de2476 --- /dev/null +++ b/examples/mitgcm/.gitignore @@ -0,0 +1,2 @@ +# MITgcm build artifacts +build/ diff --git a/examples/mitgcm/Manifest.toml b/examples/mitgcm/Manifest.toml new file mode 100644 index 000000000..4b71a8f90 --- /dev/null +++ b/examples/mitgcm/Manifest.toml @@ -0,0 +1,1875 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.12.5" +manifest_format = "2.0" +project_hash = "29f89e219bfee6ea634b0513b15eab447bbec98a" + +[[deps.AbstractFFTs]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.5.0" + + [deps.AbstractFFTs.extensions] + AbstractFFTsChainRulesCoreExt = "ChainRulesCore" + AbstractFFTsTestExt = "Test" + + [deps.AbstractFFTs.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.AbstractTrees]] +git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.5" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "856ecd7cebb68e5fc87abecd2326ad59f0f911f3" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.43" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "35ea197a51ce46fcd01c4a44befce0578a1aaeca" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.5.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "d81ae5489e13bc03567d4fbbb06c546a5e53c857" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.22.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = ["CUDSS", "CUDA"] + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceMetalExt = "Metal" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + 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" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "29bb0eb6f578a587a49da16564705968667f5fa8" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.2" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random"] +git-tree-sha1 = "e386db8b4753b42caac75ac81d0a4fe161a68a97" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.6.1" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.Blosc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Lz4_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "535c80f1c0847a4c967ea945fca21becc9de1522" +uuid = "0b7ba130-8d10-5ba8-a3d6-c5182647fed9" +version = "1.21.7+0" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CFTime]] +deps = ["Dates", "Printf"] +git-tree-sha1 = "0836c647014903bedccf23ba72b5ebb8c89a7db8" +uuid = "179af706-886a-5703-950a-314cd64e0468" +version = "0.2.5" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Preferences", "Static"] +git-tree-sha1 = "f3a21d7fc84ba618a779d1ed2fcca2e682865bab" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.7" + +[[deps.CSV]] +deps = ["CodecZlib", "Dates", "FilePathsBase", "InlineStrings", "Mmap", "Parsers", "PooledArrays", "PrecompileTools", "SentinelArrays", "Tables", "Unicode", "WeakRefStrings", "WorkerUtilities"] +git-tree-sha1 = "8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d" +uuid = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +version = "0.10.16" + +[[deps.CUDA]] +deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CUDA_Compiler_jll", "CUDA_Driver_jll", "CUDA_Runtime_Discovery", "CUDA_Runtime_jll", "Crayons", "ExprTools", "GPUArrays", "GPUCompiler", "GPUToolbox", "KernelAbstractions", "LLVM", "LLVMLoopInfo", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "NVTX", "Preferences", "PrettyTables", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "SparseArrays", "StaticArrays", "Statistics", "demumble_jll"] +git-tree-sha1 = "1b4e9bf1c386ccd4815d00859d1a354562d98af2" +uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" +version = "5.9.7" + + [deps.CUDA.extensions] + ChainRulesCoreExt = "ChainRulesCore" + EnzymeCoreExt = "EnzymeCore" + SparseMatricesCSRExt = "SparseMatricesCSR" + SpecialFunctionsExt = "SpecialFunctions" + + [deps.CUDA.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + SparseMatricesCSR = "a0a7dd2c-ebf4-11e9-1f05-cf50bc540ca1" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.CUDA_Compiler_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "CUDA_Runtime_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "8fd66238d13b624bf149758177a1248d14adf844" +uuid = "d1e2174e-dfdc-576e-b43e-73b79eb1aca8" +version = "0.3.1+1" + +[[deps.CUDA_Driver_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "23bf4e60006b78544f753880fbcf1aa158a7669c" +uuid = "4ee394cb-3365-5eb0-8335-949819d2adfc" +version = "13.1.0+2" + +[[deps.CUDA_Runtime_Discovery]] +deps = ["Libdl"] +git-tree-sha1 = "f9a521f52d236fe49f1028d69e549e7f2644bb72" +uuid = "1af6417a-86b4-443c-805f-a4643ffb695f" +version = "1.0.0" + +[[deps.CUDA_Runtime_jll]] +deps = ["Artifacts", "CUDA_Driver_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "92cd84e2b760e471d647153ea5efc5789fc5e8b2" +uuid = "76a88914-d11a-5bdc-97e0-2f5a05c973a2" +version = "0.19.2+0" + +[[deps.CatViews]] +deps = ["Random", "Test"] +git-tree-sha1 = "23d1f1e10d4e24374112fcf800ac981d14a54b24" +uuid = "81a5f4ea-a946-549a-aa7e-2a7f63a27d31" +version = "1.0.0" + +[[deps.ChunkCodecCore]] +git-tree-sha1 = "1a3ad7e16a321667698a19e77362b35a1e94c544" +uuid = "0b6fb165-00bc-4d37-ab8b-79f91016dbe1" +version = "1.0.1" + +[[deps.ChunkCodecLibZlib]] +deps = ["ChunkCodecCore", "Zlib_jll"] +git-tree-sha1 = "cee8104904c53d39eb94fd06cbe60cb5acde7177" +uuid = "4c0bbee4-addc-4d73-81a0-b6caacae83c8" +version = "1.0.0" + +[[deps.ChunkCodecLibZstd]] +deps = ["ChunkCodecCore", "Zstd_jll"] +git-tree-sha1 = "34d9873079e4cb3d0c62926a225136824677073f" +uuid = "55437552-ac27-4d47-9aa3-63184e8fd398" +version = "1.0.0" + +[[deps.ClimaSeaIce]] +deps = ["Adapt", "JLD2", "KernelAbstractions", "Oceananigans", "RootSolvers", "Roots", "SeawaterPolynomials"] +git-tree-sha1 = "5fdf5ba59466dc4a7d5fe4cced7e88fb466d1344" +uuid = "6ba0ff68-24e6-4315-936c-2e99227c95a4" +version = "0.4.4" + +[[deps.ClimateModels]] +deps = ["CSV", "DataFrames", "Dates", "Downloads", "Git", "OrderedCollections", "Pkg", "Statistics", "Suppressor", "TOML", "Test", "UUIDs"] +git-tree-sha1 = "c15e03226f2b3c65b84d2e7d61d7d67e9dca0868" +uuid = "f6adb021-9183-4f40-84dc-8cea6f651bb0" +version = "0.3.5" + + [deps.ClimateModels.extensions] + ClimateModelsCondaExt = ["Conda"] + ClimateModelsMakieExt = ["Makie"] + ClimateModelsPyCallExt = ["PyCall"] + + [deps.ClimateModels.weakdeps] + Conda = "8f4d0f93-b110-5947-807f-2305c1781a2d" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.CommonDataModel]] +deps = ["CFTime", "DataStructures", "Dates", "DiskArrays", "Preferences", "Printf", "Statistics"] +git-tree-sha1 = "cd10f8b38725a6458dd971464daa5a751a67e6b0" +uuid = "1fbeeb36-5f17-413c-809b-666fb144f157" +version = "0.4.2" + +[[deps.CommonSolve]] +git-tree-sha1 = "78ea4ddbcf9c241827e7035c3a03e2e456711470" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.6" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.18.1" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.3.0+1" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "21d088c496ea22914fe80906eb5bce65755e5ec8" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.1" + +[[deps.CondaPkg]] +deps = ["JSON3", "Markdown", "MicroMamba", "Pidfile", "Pkg", "Preferences", "Scratch", "TOML", "pixi_jll"] +git-tree-sha1 = "bd491d55b97a036caae1d78729bdb70bf7dababc" +uuid = "992eb4ea-22a4-4c89-a5bb-47a3300528ab" +version = "0.2.33" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.CopernicusClimateDataStore]] +deps = ["CondaPkg"] +git-tree-sha1 = "62ec3ff0c6d3babb596f17937f6006f4dd001d88" +uuid = "bce3f73f-acea-4481-bd86-df89ecc2cb46" +version = "0.1.0" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.CubedSphere]] +deps = ["Distances", "LinearAlgebra", "Printf", "Random", "Statistics", "TaylorSeries"] +git-tree-sha1 = "6ffea589cf350b1582722e57a8de787907d59454" +uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" +version = "0.3.4" + +[[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", "Random", "Reexport", "SentinelArrays", "SortingAlgorithms", "Statistics", "TableTraits", "Tables", "Unicode"] +git-tree-sha1 = "d8928e9169ff76c6281f39a659f9bca3a573f24c" +uuid = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" +version = "1.8.1" + +[[deps.DataStructures]] +deps = ["OrderedCollections"] +git-tree-sha1 = "e357641bb3e0638d353c4b29ea0e40ea644066a6" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.19.3" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dataverse]] +deps = ["CSV", "CodecZlib", "DataFrames", "Downloads", "HTTP", "JSON", "NetworkOptions", "Tar", "ZipFile"] +git-tree-sha1 = "84ad16bc3c21a8d13e07c55287f7049cda236349" +uuid = "9c0b9be8-e31e-490f-90fe-77697562404d" +version = "0.2.7" + + [deps.Dataverse.extensions] + DataverseCondaPkgExt = ["CondaPkg"] + DataversePythonCallExt = ["PythonCall"] + + [deps.Dataverse.weakdeps] + CondaPkg = "992eb4ea-22a4-4c89-a5bb-47a3300528ab" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[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 = ["ConstructionBase", "LRUCache", "Mmap", "OffsetArrays"] +git-tree-sha1 = "e5d9ce1b751ddf9bcd9d36b51249dce8ea73cd55" +uuid = "3c3547ce-8d99-4f5e-a174-61eb10b00ae3" +version = "0.4.19" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + + [deps.Distances.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.7.0" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.7.3+0" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.ExpressionExplorer]] +git-tree-sha1 = "5f1c005ed214356bbe41d442cc1ccd416e510b7e" +uuid = "21656369-7473-754a-2065-74616d696c43" +version = "1.1.4" + +[[deps.Extents]] +git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4" +uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" +version = "0.1.6" + +[[deps.FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.10.0" + +[[deps.FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.11+0" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "6522cfb3b8fe97bec632252263057996cbd3de20" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.18.0" +weakdeps = ["HTTP"] + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + +[[deps.FilePathsBase]] +deps = ["Compat", "Dates"] +git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +uuid = "48062228-2e41-5def-b9a4-89aafe57970f" +version = "0.9.24" +weakdeps = ["Mmap", "Test"] + + [deps.FilePathsBase.extensions] + FilePathsBaseMmapExt = "Mmap" + FilePathsBaseTestExt = "Test" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.FortranFiles]] +git-tree-sha1 = "97069e9106dffe888562d974acf1d225cfbf8d4e" +uuid = "c58ffaec-ab22-586d-bfc5-781a99fd0b10" +version = "0.6.2" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "eef4c86803f47dcb61e9b8790ecaa96956fdd8ae" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.3.2" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GPUArrays]] +deps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LLVM", "LinearAlgebra", "Printf", "Random", "Reexport", "ScopedValues", "Serialization", "SparseArrays", "Statistics"] +git-tree-sha1 = "6487601563e4a1d1dab796e88b4548bf5544209e" +uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" +version = "11.4.1" +weakdeps = ["JLD2"] + + [deps.GPUArrays.extensions] + JLD2Ext = "JLD2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GPUCompiler]] +deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "PrecompileTools", "Preferences", "Scratch", "Serialization", "TOML", "Tracy", "UUIDs"] +git-tree-sha1 = "966946d226e8b676ca6409454718accb18c34c54" +uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" +version = "1.8.2" + +[[deps.GPUToolbox]] +deps = ["LLVM"] +git-tree-sha1 = "9e9186b09a13b7f094f87d1a9bb266d8780e1b1c" +uuid = "096a3bc2-3ced-46d0-87f4-dd12716f4bfc" +version = "1.0.0" + +[[deps.GeoFormatTypes]] +git-tree-sha1 = "7528a7956248c723d01a0a9b0447bf254bf4da52" +uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f" +version = "0.4.5" + +[[deps.GeoInterface]] +deps = ["DataAPI", "Extents", "GeoFormatTypes"] +git-tree-sha1 = "2b0312a0c06b4408773c6dc1829b472ea706f058" +uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" +version = "1.6.1" + + [deps.GeoInterface.extensions] + GeoInterfaceMakieExt = ["Makie", "GeometryBasics"] + GeoInterfaceRecipesBaseExt = "RecipesBase" + + [deps.GeoInterface.weakdeps] + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + +[[deps.Git]] +deps = ["Git_LFS_jll", "Git_jll", "JLLWrappers", "OpenSSH_jll"] +git-tree-sha1 = "824a1890086880696fc908fe12a17bcf61738bd8" +uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" +version = "1.5.0" + +[[deps.Git_LFS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "bb8471f313ed941f299aa53d32a94ab3bee08844" +uuid = "020c3dae-16b3-5ae5-87b3-4cb189e250b2" +version = "3.7.0+0" + +[[deps.Git_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "dc34a3e3d96b4ed305b641e626dc14c12b7824b8" +uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" +version = "2.53.0+0" + +[[deps.Glob]] +git-tree-sha1 = "83cb0092e2792b9e3a865b6655e88f5b862607e2" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.4.0" + +[[deps.HDF5_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"] +git-tree-sha1 = "e94f84da9af7ce9c6be049e9067e511e17ff89ec" +uuid = "0234f1f7-429e-5d53-9886-15a909be8d59" +version = "1.14.6+0" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "5e6fe50ae7f23d171f44e311c2960294aaa0beb5" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.19" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.HostCPUFeatures]] +deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Preferences", "Static"] +git-tree-sha1 = "af9ab7d1f70739a47f03be78771ebda38c3c71bf" +uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" +version = "0.1.18" + +[[deps.Hwloc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "157e2e5838984449e44af851a52fe374d56b9ada" +uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" +version = "2.13.0+0" + +[[deps.IfElse]] +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 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.5" + +[[deps.ImageMorphology]] +deps = ["DataStructures", "ImageCore", "LinearAlgebra", "LoopVectorization", "OffsetArrays", "Requires", "TiledIteration"] +git-tree-sha1 = "895205d762ae24a01689f8cc7ad584b55f1fd005" +uuid = "787d08f9-d448-5407-9aad-5290dd7ab264" +version = "0.4.7" + +[[deps.InlineStrings]] +git-tree-sha1 = "8f3d257792a522b4601c24a577954b0a8cd7334d" +uuid = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +version = "1.4.5" + + [deps.InlineStrings.extensions] + ArrowTypesExt = "ArrowTypes" + ParsersExt = "Parsers" + + [deps.InlineStrings.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + Parsers = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2025.2.0+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.InvertedIndices]] +git-tree-sha1 = "6da3c4316095de0f5ee2ebd875df8721e7e0bdbe" +uuid = "41ab1584-1d38-5bbf-9106-f11c6c58b48f" +version = "1.3.1" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.6" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLD2]] +deps = ["ChunkCodecLibZlib", "ChunkCodecLibZstd", "FileIO", "MacroTools", "Mmap", "OrderedCollections", "PrecompileTools", "ScopedValues"] +git-tree-sha1 = "8f8ff711442d1f4cfc0d86133e7ee03d62ec9b98" +uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" +version = "0.6.3" +weakdeps = ["UnPack"] + + [deps.JLD2.extensions] + UnPackExt = "UnPack" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.1" + +[[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 = "411eccfe8aba0814ffa0fdf4860913ed09c34975" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.3" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.JuliaNVTXCallbacks_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "af433a10f3942e882d3c671aacb203e006a5808f" +uuid = "9c1d0b0a-7046-5b2e-a33f-ea22f176ac7e" +version = "0.2.1+0" + +[[deps.JuliaSyntaxHighlighting]] +deps = ["StyledStrings"] +uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" +version = "1.12.0" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "fb14a863240d62fbf5922bf9f8803d7df6c62dc8" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.40" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "125d65fe5042faf078383312dd060adf11d90802" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.10.5" + +[[deps.LLVM]] +deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Preferences", "Printf", "Unicode"] +git-tree-sha1 = "69e4739502b7ab5176117e97e1664ed181c35036" +uuid = "929cbde3-209d-540e-8aea-75f648917ca0" +version = "9.4.6" +weakdeps = ["BFloat16s"] + + [deps.LLVM.extensions] + BFloat16sExt = "BFloat16s" + +[[deps.LLVMExtra_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] +git-tree-sha1 = "8e76807afb59ebb833e9b131ebf1a8c006510f33" +uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" +version = "0.0.38+0" + +[[deps.LLVMLoopInfo]] +git-tree-sha1 = "2e5c102cfc41f48ae4740c7eca7743cc7e7b75ea" +uuid = "8b046642-f1f6-4319-8d3c-209ddc03c586" +version = "1.0.0" + +[[deps.LRUCache]] +git-tree-sha1 = "5519b95a490ff5fe629c4a7aa3b3dfc9160498b3" +uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" +version = "1.6.2" +weakdeps = ["Serialization"] + + [deps.LRUCache.extensions] + SerializationExt = ["Serialization"] + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.17" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.15.0+0" + +[[deps.LibGit2]] +deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.9.0+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "OpenSSL_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.3+1" + +[[deps.LibTracyClient_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d4e20500d210247322901841d4eafc7a0c52642d" +uuid = "ad6e5548-8b26-5c9f-8ef3-ef0ad883f3a5" +version = "0.13.1+0" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.12.0" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.2.0" + +[[deps.LoopVectorization]] +deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] +git-tree-sha1 = "a9fc7883eb9b5f04f46efb9a540833d1fad974b3" +uuid = "bdcacae8-1622-11e9-2a5c-532679323890" +version = "0.12.173" + + [deps.LoopVectorization.extensions] + ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] + ForwardDiffNNlibExt = ["ForwardDiff", "NNlib"] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.LoopVectorization.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + NNlib = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.Lz4_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "191686b1ac1ea9c89fc52e996ad15d1d241d1e33" +uuid = "5ced341a-0733-55b8-9ab6-a4889d929147" +version = "1.10.1+0" + +[[deps.MITgcm]] +deps = ["ClimateModels", "DataDeps", "Dataverse", "Dates", "Distributed", "FortranFiles", "Glob", "Libdl", "MeshArrays", "Printf", "Scratch", "SharedArrays", "SparseArrays", "Statistics", "StyledStrings", "UUIDs"] +git-tree-sha1 = "feb8454a7893e549750110e8e4d6dd0e03570465" +repo-rev = "ss-gf-jmc/mitgcm-running-in-julia" +repo-url = "https://github.com/simone-silvestri/MITgcm.jl.git" +uuid = "dce5fa8e-68ce-4431-a242-9469c69627a0" +version = "0.5.14" + + [deps.MITgcm.extensions] + MITgcmNetCDFExt = ["NetCDF"] + + [deps.MITgcm.weakdeps] + NetCDF = "30363a11-5582-574a-97bb-aa9a979735b9" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2025.2.0+0" + +[[deps.MPI]] +deps = ["Distributed", "DocStringExtensions", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "PkgVersion", "PrecompileTools", "Requires", "Serialization", "Sockets"] +git-tree-sha1 = "a61ecf714d71064b766d481ef43c094d4c6e3c52" +uuid = "da04e1cc-30fd-572f-bb4f-1f8673147195" +version = "0.20.23" + + [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 = "9341048b9f723f2ae2a72a5269ac2f15f80534dc" +uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4" +version = "4.3.2+0" + +[[deps.MPIPreferences]] +deps = ["Libdl", "Preferences"] +git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07" +uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" +version = "0.1.11" + +[[deps.MPItrampoline_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] +git-tree-sha1 = "36c2d142e7d45fb98b5f83925213feb3292ca348" +uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748" +version = "5.5.5+0" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.MappedArrays]] +git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.3" + +[[deps.Markdown]] +deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "8785729fa736197687541f7053f6d8ab7fc44f92" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.10" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ff69a2b1330bcb730b9ac1ab7dd680176f5896b8" +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.1010+0" + +[[deps.MeshArrays]] +deps = ["CatViews", "Dates", "Distributed", "GeoInterface", "Glob", "LazyArtifacts", "NearestNeighbors", "Pkg", "Printf", "SharedArrays", "SparseArrays", "Statistics", "Unitful"] +git-tree-sha1 = "b9b1389807c4d535c046c8849fb05e752120c0bd" +uuid = "cb8c808f-1acf-59a3-9d2b-6e38d009f683" +version = "0.5.4" + + [deps.MeshArrays.extensions] + MeshArraysDataDepsExt = ["DataDeps"] + MeshArraysGeoJSONExt = ["GeoJSON"] + MeshArraysGeometryOpsExt = ["GeometryOps"] + MeshArraysJLD2Ext = ["JLD2"] + MeshArraysMakieExt = ["Makie"] + MeshArraysProjExt = ["Proj"] + MeshArraysShapefileExt = ["Shapefile"] + + [deps.MeshArrays.weakdeps] + DataDeps = "124859b0-ceae-595e-8997-d05f6a7a8dfe" + GeoJSON = "61d90e0f-e114-555e-ac52-39dfb47a3ef9" + GeometryOps = "3251bfac-6a57-4b6d-aa61-ac1fef2975ab" + JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + Proj = "c94c279d-25a6-4763-9509-64d165bea63e" + Shapefile = "8e980c4a-a4fe-5da2-b3a7-4b4b0353a2f4" + +[[deps.MicroMamba]] +deps = ["Pkg", "Scratch", "micromamba_jll"] +git-tree-sha1 = "535656ce55266bfed0575cd051acc4f36dc869a0" +uuid = "0b3b1443-0f03-428d-bdfb-f27f9c1191ea" +version = "0.1.15" + +[[deps.MicrosoftMPI_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227" +uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" +version = "10.1.4+3" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2025.11.4" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.NCDatasets]] +deps = ["CFTime", "CommonDataModel", "DataStructures", "Dates", "DiskArrays", "NetCDF_jll", "NetworkOptions", "Printf"] +git-tree-sha1 = "43e840d07d643a71171ade0f6109d911186bbe10" +uuid = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" +version = "0.14.12" +weakdeps = ["MPI"] + + [deps.NCDatasets.extensions] + NCDatasetsMPIExt = "MPI" + +[[deps.NVTX]] +deps = ["JuliaNVTXCallbacks_jll", "Libdl", "NVTX_jll"] +git-tree-sha1 = "a9083c3e469e63cca454d1fc3b19472d9d92c14a" +uuid = "5da4648a-3479-48b8-97b9-01cb529c0a1f" +version = "1.0.3" +weakdeps = ["Colors"] + + [deps.NVTX.extensions] + NVTXColorsExt = "Colors" + +[[deps.NVTX_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "af2232f69447494514c25742ba1503ec7e9877fe" +uuid = "e98f9f5b-d649-5603-91fd-7774390e6439" +version = "3.2.2+0" + +[[deps.NaNMath]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NearestNeighbors]] +deps = ["AbstractTrees", "Distances", "StaticArrays"] +git-tree-sha1 = "e2c3bba08dd6dedfe17a17889131b885b8c082f0" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.27" + +[[deps.NetCDF_jll]] +deps = ["Artifacts", "Blosc_jll", "Bzip2_jll", "HDF5_jll", "JLLWrappers", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "TOML", "XML2_jll", "Zlib_jll", "Zstd_jll", "libaec_jll", "libzip_jll"] +git-tree-sha1 = "d574803b6055116af212434460adf654ce98e345" +uuid = "7243133f-43d8-5620-bbf4-c2c921802cf3" +version = "401.900.300+0" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.3.0" + +[[deps.NumericalEarth]] +deps = ["Adapt", "CFTime", "CUDA", "CUDA_Compiler_jll", "ClimaSeaIce", "CopernicusClimateDataStore", "CubicSplines", "DataDeps", "Dates", "DocStringExtensions", "Downloads", "Glob", "ImageMorphology", "JLD2", "KernelAbstractions", "MPI", "MeshArrays", "NCDatasets", "Oceananigans", "OffsetArrays", "PrecompileTools", "Printf", "Scratch", "SeawaterPolynomials", "StaticArrays", "Statistics", "Thermodynamics", "ZipFile"] +path = "../.." +uuid = "904d977b-046a-4731-8b86-9235c0d1ef02" +version = "0.2.0" + + [deps.NumericalEarth.extensions] + NumericalEarthBreezeExt = "Breeze" + NumericalEarthCDSAPIExt = "CDSAPI" + NumericalEarthCopernicusMarineExt = "CopernicusMarine" + NumericalEarthMITgcmExt = "MITgcm" + NumericalEarthReactantExt = "Reactant" + NumericalEarthSpeedyWeatherExt = ["SpeedyWeather", "XESMF"] + NumericalEarthVerosExt = ["PythonCall", "CondaPkg"] + NumericalEarthWOAExt = "WorldOceanAtlasTools" + + [deps.NumericalEarth.weakdeps] + Breeze = "660aa2fb-d4c8-4359-a52c-9c057bc511da" + CDSAPI = "8a7b9de3-9c00-473e-88b4-7eccd7ef2fea" + CondaPkg = "992eb4ea-22a4-4c89-a5bb-47a3300528ab" + CopernicusMarine = "cd43e856-93a3-40c8-bc9e-6146cdce14fa" + MITgcm = "dce5fa8e-68ce-4431-a242-9469c69627a0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + SpeedyWeather = "9e226e20-d153-4fed-8a5b-493def4f21a9" + WorldOceanAtlasTools = "04f20302-f1b9-11e8-29d9-7d841cb0a64a" + XESMF = "2e0b0046-e7a1-486f-88de-807ee8ffabe5" + +[[deps.Oceananigans]] +deps = ["Adapt", "Crayons", "CubedSphere", "Dates", "Distances", "DocStringExtensions", "FFTW", "GPUArraysCore", "Glob", "InteractiveUtils", "JLD2", "KernelAbstractions", "Krylov", "LinearAlgebra", "Logging", "MPI", "MuladdMacro", "OffsetArrays", "OrderedCollections", "Pkg", "Printf", "ReactantCore", "Rotations", "SeawaterPolynomials", "SparseArrays", "StaticArrays", "Statistics", "StructArrays"] +git-tree-sha1 = "ab90584ff7c3d4bd15f2ef48cf290b7dd52c365b" +uuid = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" +version = "0.105.3" + + [deps.Oceananigans.extensions] + OceananigansAMDGPUExt = ["AMDGPU", "AbstractFFTs"] + OceananigansCUDAExt = ["CUDA", "GPUArrays", "GPUArraysCore"] + OceananigansEnzymeExt = "Enzyme" + OceananigansMakieExt = "Makie" + OceananigansMetalExt = "Metal" + OceananigansNCDatasetsExt = "NCDatasets" + OceananigansOneAPIExt = "oneAPI" + OceananigansReactantExt = ["Reactant", "KernelAbstractions", "ConstructionBase", "AbstractFFTs"] + OceananigansXESMFExt = ["XESMF"] + + [deps.Oceananigans.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + GPUArrays = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" + Reactant = "3c362404-f566-11ee-1572-e11a4b42c853" + XESMF = "2e0b0046-e7a1-486f-88de-807ee8ffabe5" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + +[[deps.OffsetArrays]] +git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.17.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.29+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.7+0" + +[[deps.OpenMPI_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"] +git-tree-sha1 = "2f3d05e419b6125ffe06e55784102e99325bdbe2" +uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" +version = "5.0.10+0" + +[[deps.OpenSSH_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll", "Zlib_jll"] +git-tree-sha1 = "301412a644646fdc0ad67d0a87487466b491e53d" +uuid = "9bd350c2-7e96-507f-8002-3f2e150b4e1b" +version = "10.2.1+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "1d1aaa7d449b58415f97d2839c318b70ffb525a0" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.6.1" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.4+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.44.0+1" + +[[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 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.Pidfile]] +deps = ["FileWatching", "Test"] +git-tree-sha1 = "2d8aaf8ee10df53d0dfb9b8ee44ae7c04ced2b03" +uuid = "fa939f87-e72e-5be4-a000-7fc836dbe307" +version = "1.3.0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.12.1" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PkgVersion]] +deps = ["Pkg"] +git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" +version = "0.3.3" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PooledArrays]] +deps = ["DataAPI", "Future"] +git-tree-sha1 = "36d8b4b899628fb92c2749eb488d884a926614d3" +uuid = "2dfb63ee-cc39-5dd5-95bd-886bf059d720" +version = "1.4.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.3.3" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "8b770b60760d4451834fe79dd483e318eee709c4" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.5.2" + +[[deps.PrettyTables]] +deps = ["Crayons", "LaTeXStrings", "Markdown", "PrecompileTools", "Printf", "REPL", "Reexport", "StringManipulation", "Tables"] +git-tree-sha1 = "211530a7dc76ab59087f4d4d1fc3f086fbe87594" +uuid = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" +version = "3.2.3" + + [deps.PrettyTables.extensions] + PrettyTablesTypstryExt = "Typstry" + + [deps.PrettyTables.weakdeps] + Typstry = "f0ed7684-a786-439e-b1e3-3b82803b501e" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.Profile]] +deps = ["StyledStrings"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +version = "1.11.0" + +[[deps.ProfileCanvas]] +deps = ["Base64", "JSON", "Pkg", "Profile", "REPL"] +git-tree-sha1 = "990016fb1508b0726a70039f39569720d054c78d" +uuid = "efd6af41-a80b-495e-886c-e51b0c7d77a3" +version = "0.1.7" + +[[deps.Quaternions]] +deps = ["LinearAlgebra", "Random", "RealDot"] +git-tree-sha1 = "4d8c1b7c3329c1885b857abb50d08fa3f4d9e3c8" +uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" +version = "0.7.7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "dbe5fd0b334694e905cb9fda73cd8554333c46e2" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.7.1" + +[[deps.RandomNumbers]] +deps = ["Random"] +git-tree-sha1 = "c6ec94d2aaba1ab2ff983052cf6a606ca5985902" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.6.0" + +[[deps.ReactantCore]] +deps = ["ExpressionExplorer", "MacroTools"] +git-tree-sha1 = "f3e31b90afcd152578a6c389eae46dd38b9a4f38" +uuid = "a3311ec8-5e00-46d5-b541-4f83e724a433" +version = "0.1.16" + +[[deps.RealDot]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9" +uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9" +version = "0.1.0" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.RootSolvers]] +deps = ["ForwardDiff", "Printf"] +git-tree-sha1 = "3b6c0089c3dc3d5780786d5007e976fe9d1b7887" +uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" +version = "1.0.2" + +[[deps.Roots]] +deps = ["Accessors", "CommonSolve", "Printf"] +git-tree-sha1 = "10a488dbecb88a9679c8f357d383d7d83dcc748d" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "2.2.13" + + [deps.Roots.extensions] + RootsChainRulesCoreExt = "ChainRulesCore" + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + RootsUnitfulExt = "Unitful" + + [deps.Roots.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Rotations]] +deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"] +git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e" +uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" +version = "1.7.1" + + [deps.Rotations.extensions] + RotationsRecipesBaseExt = "RecipesBase" + + [deps.Rotations.weakdeps] + RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" + +[[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 = "456f610ca2fbd1c14f5fcf31c6bfadc55e7d66e0" +uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" +version = "0.6.43" + +[[deps.SciMLPublic]] +git-tree-sha1 = "0ba076dbdce87ba230fff48ca9bca62e1f345c9b" +uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b" +version = "1.0.1" + +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "c3b2323466378a2ba15bea4b2f73b081e022f473" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.5.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.SeawaterPolynomials]] +git-tree-sha1 = "e2671e9abe2a2faa51dcecd9d911522931c16012" +uuid = "d496a93d-167e-4197-9f49-d3af4ff8fe40" +version = "0.3.10" + +[[deps.SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "ebe7e59b37c400f694f52b58c93d26201387da70" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.4.9" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +version = "1.11.0" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.2" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.12.0" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "5acc6a41b3082920f79ca3c759acbcecf18a8d78" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.7.1" + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + + [deps.SpecialFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.2" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"] +git-tree-sha1 = "49440414711eddc7227724ae6e570c7d5559a086" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.3.1" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "SciMLPublic", "Static"] +git-tree-sha1 = "aa1ea41b3d45ac449d10477f65e2b40e3197a0d2" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.9.0" +weakdeps = ["OffsetArrays", "StaticArrays"] + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0f529006004a8be48f1be25f3451186579392d47" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.17" + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + + [deps.StaticArrays.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.4" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.8.0" + +[[deps.StringManipulation]] +deps = ["PrecompileTools"] +git-tree-sha1 = "d05693d339e37d6ab134c5ab53c29fce5ee5d7d5" +uuid = "892a3eda-7b42-436c-8928-eab12a02cf0e" +version = "0.4.4" + +[[deps.StructArrays]] +deps = ["ConstructionBase", "DataAPI", "Tables"] +git-tree-sha1 = "a2c37d815bf00575332b7bd0389f771cb7987214" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.7.2" +weakdeps = ["Adapt", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "SparseArrays", "StaticArrays"] + + [deps.StructArrays.extensions] + StructArraysAdaptExt = "Adapt" + StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"] + StructArraysLinearAlgebraExt = "LinearAlgebra" + StructArraysSparseArraysExt = "SparseArrays" + StructArraysStaticArraysExt = "StaticArrays" + +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.11.0" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.8.3+2" + +[[deps.Suppressor]] +deps = ["Logging"] +git-tree-sha1 = "6dbb5b635c5437c68c28c2ac9e39b87138f37c0a" +uuid = "fd094767-a336-5f1f-9728-57cf17d0bbfb" +version = "0.2.8" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TaylorSeries]] +deps = ["LinearAlgebra", "Markdown", "SparseArrays"] +git-tree-sha1 = "4a5ddc4036946d3a7900b5776b0872e36d848a29" +uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" +version = "0.20.10" + + [deps.TaylorSeries.extensions] + TaylorSeriesIAExt = "IntervalArithmetic" + TaylorSeriesJLD2Ext = "JLD2" + TaylorSeriesRATExt = "RecursiveArrayTools" + TaylorSeriesSAExt = "StaticArrays" + + [deps.TaylorSeries.weakdeps] + IntervalArithmetic = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" + JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" + RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[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" +version = "1.11.0" + +[[deps.Thermodynamics]] +deps = ["ForwardDiff", "Random", "RootSolvers"] +git-tree-sha1 = "2983a61f8fe7e03957efea2b32b2f2c446b4a099" +uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" +version = "0.15.8" + + [deps.Thermodynamics.extensions] + CreateParametersExt = "ClimaParams" + + [deps.Thermodynamics.weakdeps] + ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.5" + +[[deps.TiledIteration]] +deps = ["OffsetArrays", "StaticArrayInterface"] +git-tree-sha1 = "1176cc31e867217b06928e2f140c90bd1bc88283" +uuid = "06e1c1a7-607b-532d-9fad-de7d9aa2abac" +version = "0.5.0" + +[[deps.Tracy]] +deps = ["ExprTools", "LibTracyClient_jll", "Libdl"] +git-tree-sha1 = "73e3ff50fd3990874c59fef0f35d10644a1487bc" +uuid = "e689c965-62c8-4b79-b2c5-8359227902fd" +version = "0.1.6" + + [deps.Tracy.extensions] + TracyProfilerExt = "TracyProfiler_jll" + + [deps.Tracy.weakdeps] + TracyProfiler_jll = "0c351ed6-8a68-550e-8b79-de6f926da83c" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.URIs]] +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.6.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.Unitful]] +deps = ["Dates", "LinearAlgebra", "Random"] +git-tree-sha1 = "57e1b2c9de4bd6f40ecb9de4ac1797b81970d008" +uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" +version = "1.28.0" + + [deps.Unitful.extensions] + ConstructionBaseUnitfulExt = "ConstructionBase" + ForwardDiffExt = "ForwardDiff" + InverseFunctionsUnitfulExt = "InverseFunctions" + LatexifyExt = ["Latexify", "LaTeXStrings"] + NaNMathExt = "NaNMath" + PrintfExt = "Printf" + + [deps.Unitful.weakdeps] + ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" + Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" + NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" + Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" +weakdeps = ["LLVM"] + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + +[[deps.VectorizationBase]] +deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "d1d9a935a26c475ebffd54e9c7ad11627c43ea85" +uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" +version = "0.21.72" + +[[deps.WeakRefStrings]] +deps = ["DataAPI", "InlineStrings", "Parsers"] +git-tree-sha1 = "b1be2855ed9ed8eac54e5caff2afcdb442d52c23" +uuid = "ea10d353-3f73-51f8-a26c-33c1cb351aa5" +version = "1.4.2" + +[[deps.WorkerUtilities]] +git-tree-sha1 = "cd1659ba0d57b71a464a29e64dbc67cfe83d54e7" +uuid = "76eceee3-57b5-4d4a-8e66-0e911cebbf60" +version = "1.6.1" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.9+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "9cce64c0fdd1960b597ba7ecda2950b5ed957438" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.2+0" + +[[deps.Xorg_libpciaccess_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "4909eb8f1cbf6bd4b1c30dd18b2ead9019ef2fad" +uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e" +version = "0.18.1+0" + +[[deps.ZipFile]] +deps = ["Libdl", "Printf", "Zlib_jll"] +git-tree-sha1 = "f492b7fe1698e623024e873244f10d89c95c340a" +uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" +version = "0.10.1" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.3.1+2" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.demumble_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6498e3581023f8e530f34760d18f75a69e3a4ea8" +uuid = "1e29f10c-031c-5a83-9565-69cddfc27673" +version = "1.3.0+0" + +[[deps.libaec_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "13b760f97c6e753b47df30cb438d4dc3b50df282" +uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0" +version = "1.1.5+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.15.0+0" + +[[deps.libzip_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "OpenSSL_jll", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "86addc139bca85fdf9e7741e10977c45785727b7" +uuid = "337d8026-41b4-5cde-a456-74a10e5b31d1" +version = "1.11.3+0" + +[[deps.micromamba_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "717df6f6892af4ee13279a73aa58474e58a88667" +uuid = "f8abcde7-e9b7-5caa-b8af-a437887ae8e4" +version = "2.3.1+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.64.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.0.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.7.0+0" + +[[deps.pixi_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "f349584316617063160a947a82638f7611a8ef0f" +uuid = "4d7b5844-a134-5dcd-ac86-c8f19cd51bed" +version = "0.41.3+0" diff --git a/examples/mitgcm/Project.toml b/examples/mitgcm/Project.toml new file mode 100644 index 000000000..84628ad44 --- /dev/null +++ b/examples/mitgcm/Project.toml @@ -0,0 +1,10 @@ +[deps] +MITgcm = "dce5fa8e-68ce-4431-a242-9469c69627a0" +NumericalEarth = "904d977b-046a-4731-8b86-9235c0d1ef02" +Oceananigans = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" +Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" +ProfileCanvas = "efd6af41-a80b-495e-886c-e51b0c7d77a3" + +[sources] +MITgcm = {rev = "ss-gf-jmc/mitgcm-running-in-julia", url = "https://github.com/simone-silvestri/MITgcm.jl.git"} +NumericalEarth = {path = "../.."} diff --git a/examples/mitgcm/mitgcm_config/code/SIZE.h b/examples/mitgcm/mitgcm_config/code/SIZE.h new file mode 100644 index 000000000..695fce260 --- /dev/null +++ b/examples/mitgcm/mitgcm_config/code/SIZE.h @@ -0,0 +1,63 @@ +CBOP +C !ROUTINE: SIZE.h +C !INTERFACE: +C include SIZE.h +C !DESCRIPTION: \bv +C *==========================================================* +C | SIZE.h Declare size of underlying computational grid. +C *==========================================================* +C | The design here supports a three-dimensional model grid +C | with indices I,J and K. The three-dimensional domain +C | is comprised of nPx*nSx blocks (or tiles) of size sNx +C | along the first (left-most index) axis, nPy*nSy blocks +C | of size sNy along the second axis and one block of size +C | Nr along the vertical (third) axis. +C | Blocks/tiles have overlap regions of size OLx and OLy +C | along the dimensions that are subdivided. +C *==========================================================* +C \ev +C +C Voodoo numbers controlling data layout: +C sNx :: Number of X points in tile. +C sNy :: Number of Y points in tile. +C OLx :: Tile overlap extent in X. +C OLy :: Tile overlap extent in Y. +C nSx :: Number of tiles per process in X. +C nSy :: Number of tiles per process in Y. +C nPx :: Number of processes to use in X. +C nPy :: Number of processes to use in Y. +C Nx :: Number of points in X for the full domain. +C Ny :: Number of points in Y for the full domain. +C Nr :: Number of points in vertical direction. +CEOP + INTEGER sNx + INTEGER sNy + INTEGER OLx + INTEGER OLy + INTEGER nSx + INTEGER nSy + INTEGER nPx + INTEGER nPy + INTEGER Nx + INTEGER Ny + INTEGER Nr + PARAMETER ( + & sNx = 30, + & sNy = 20, + & OLx = 2, + & OLy = 2, + & nSx = 3, + & nSy = 2, + & nPx = 1, + & nPy = 1, + & Nx = sNx*nSx*nPx, + & Ny = sNy*nSy*nPy, + & Nr = 15) + +C MAX_OLX :: Set to the maximum overlap region size of any array +C MAX_OLY that will be exchanged. Controls the sizing of exch +C routine buffers. + INTEGER MAX_OLX + INTEGER MAX_OLY + PARAMETER ( MAX_OLX = OLx, + & MAX_OLY = OLy ) diff --git a/examples/mitgcm/mitgcm_config/code/packages.conf b/examples/mitgcm/mitgcm_config/code/packages.conf new file mode 100644 index 000000000..fd5c8bdcf --- /dev/null +++ b/examples/mitgcm/mitgcm_config/code/packages.conf @@ -0,0 +1,7 @@ +#-- packages for coupled library mode with KPP vertical mixing +# EXF, CAL, PROFILES are disabled: surface forcing comes from the host (Julia). +gfd +cd_code +gmredi +kpp +diagnostics diff --git a/examples/mitgcm/mitgcm_config/input/POLY3.COEFFS b/examples/mitgcm/mitgcm_config/input/POLY3.COEFFS new file mode 100644 index 000000000..44c919c8a --- /dev/null +++ b/examples/mitgcm/mitgcm_config/input/POLY3.COEFFS @@ -0,0 +1,31 @@ +15 + 13.4965485754395 32.6000000000000 24.5481924347446 + 13.4882386805755 32.6000000000000 24.8185506216191 + 13.4764025555903 32.6000000000000 25.2009783814515 + 8.4690806223310 35.1500000000000 28.6417699272743 + 8.4510089195050 35.1500000000000 29.3928269010235 + 5.9397585609655 34.9000000000000 30.5632984773008 + 4.4248880992503 34.9000000000000 31.9847214990702 + 2.9114111861653 34.7500000000000 33.5047690245101 + 1.8932862598040 34.8000000000000 35.3412270497367 + 1.3669344372630 34.8000000000000 37.2987636266591 + 1.3272007124547 34.8000000000000 39.4052882836211 + 0.7905919628270 34.8000000000000 41.7881156235655 + 0.7358877560078 34.7500000000000 44.2594853649941 + 0.1858449458101 34.7500000000000 47.0435345001690 + 0.5950242216911 34.7500000000000 49.8352041101475 +-2.0248441577781e-01 7.7327632363592e-01 -4.6235907431162e-03 -1.7855486745386e-03 6.7161214818854e-05 1.9780689793512e-05 1.8596621330081e-05 2.7193175334807e-06 7.7992579107390e-06 +-2.0356900098784e-01 7.7287763354454e-01 -4.6078685547211e-03 -1.7797434187354e-03 6.9849851237856e-05 1.9700367626079e-05 1.8541107779796e-05 2.6814780158476e-06 7.6950638206688e-06 +-2.0510288558783e-01 7.7231413929174e-01 -4.5856232199577e-03 -1.7715237666829e-03 7.3641940080245e-05 1.9586693371392e-05 1.8462890416846e-05 2.6279856728835e-06 7.5480688984286e-06 +-1.6315278510835e-01 7.8362068555215e-01 -4.9742804881192e-03 -2.2358797318897e-03 -4.1623282245313e-04 2.3781382246111e-05 2.8390410822447e-05 1.8232580281910e-05 8.7007573824530e-05 +-1.6668703762104e-01 7.8244679887675e-01 -4.9199187906716e-03 -2.2150360379047e-03 -4.0253524411189e-04 2.3370269790246e-05 2.8117133690396e-05 1.7907936881655e-05 8.5353460010715e-05 +-1.4434702349368e-01 7.8636558552016e-01 -5.2437823005010e-03 -2.4430632367892e-03 -5.0604107382534e-04 3.0094061345352e-05 3.4995169663676e-05 2.6906045499581e-05 1.5782380566825e-04 +-1.3422530714233e-01 7.8774544403399e-01 -5.4057628884322e-03 -2.5425581389254e-03 -2.6671549575359e-04 3.4876625315646e-05 3.8742849620680e-05 2.2351400258486e-05 1.1390437277313e-04 +-1.2494903729136e-01 7.8886002954110e-01 -5.5923621375103e-03 -2.6509369714478e-03 -1.8969464504401e-04 4.2909291159896e-05 4.4780770266509e-05 2.8883428644997e-05 2.1006556257136e-04 +-1.2342388397754e-01 7.8859195674364e-01 -5.6185001971557e-03 -2.6849010357721e-03 4.1405949512546e-06 4.6245953907873e-05 4.6728604344334e-05 1.9161965321620e-05 1.1115190475704e-04 +-1.2890117744188e-01 7.8668953911886e-01 -5.5282092351178e-03 -2.6686338397672e-03 4.5996647260460e-06 4.6776611042599e-05 4.7296302315891e-05 2.2513552111924e-05 1.7041983515548e-04 +-1.4114412009280e-01 7.8313783149598e-01 -5.3256878521832e-03 -2.5926220481035e-03 2.2428825626142e-05 4.4369484204344e-05 4.5782525710578e-05 2.1123578875789e-05 1.6000623056750e-04 +-1.4945904203962e-01 7.8048541390059e-01 -5.1851051549971e-03 -2.5533751190741e-03 1.1992432484732e-04 4.4094804560539e-05 4.5370934503017e-05 1.2282632879782e-05 6.5241387954551e-05 +-1.6392270705111e-01 7.7627008453271e-01 -4.9448680074238e-03 -2.4654573880316e-03 9.3717129874410e-05 4.1174124268602e-05 4.3790593946149e-05 1.6928793605944e-05 1.3505403387493e-04 +-1.7490789271395e-01 7.7294291979081e-01 -4.7570017089526e-03 -2.4106158149213e-03 1.6880513678366e-04 4.0088827917669e-05 4.2910040951280e-05 8.3333879620506e-06 4.1916874947312e-05 +-1.9573834386012e-01 7.6706502751275e-01 -4.4224744309248e-03 -2.2656921102643e-03 2.0327244553310e-04 3.6548670987625e-05 4.0510685127073e-05 3.9178994487299e-06 9.2592973542915e-06 diff --git a/examples/mitgcm/mitgcm_config/input/data b/examples/mitgcm/mitgcm_config/input/data new file mode 100644 index 000000000..f4afa8848 --- /dev/null +++ b/examples/mitgcm/mitgcm_config/input/data @@ -0,0 +1,79 @@ +# ==================== +# | Model parameters | +# ==================== +# +# Based on global_oce_latlon, modified for coupled library mode: +# - EXF disabled (forcing from Julia) +# - KPP vertical mixing enabled +# - Timestep set by Julia at runtime via set_timestep! +# +# Continuous equation parameters + &PARM01 + tRef = 15*20., + sRef = 15*35., + viscAr=1.E-3, + viscAh=5.E5, + diffKhT=1.E3, + diffKrT=3.E-5, + diffKhS=1.E3, + diffKrS=3.E-5, + rhoConst=1035., + rotationPeriod=86400., + gravity=9.81, + eosType = 'POLY3', + ivdc_kappa=0.0, + implicitDiffusion=.TRUE., + implicitViscosity=.TRUE., + allowFreezing=.TRUE., + useRealFreshWaterFlux=.FALSE., + useCDscheme=.FALSE., + staggerTimeStep=.FALSE., +# useJamartWetPoints=.TRUE., + useEnergyConservingCoriolis=.TRUE., +# vectorInvariantMomentum=.TRUE., +# tempAdvScheme=33, +# saltAdvScheme=33, +# turn on looped cells + hFacMin=.05, +# hFacMindr=50., +# set precision of data files + readBinaryPrec=32, + usesinglecpuio=.TRUE., + & + +# Elliptic solver parameters + &PARM02 + cg2dMaxIters=500, + cg2dTargetResidual=1.E-13, + & + +# Time stepping parameters + &PARM03 + nIter0 = 0, + nTimeSteps = 2000000000, + deltaTmom = 1200.0, + deltaTtracer= 1200.0, + deltaTClock = 1200.0, + abEps = 0.1, + pChkptFreq = 311040000., + dumpFreq = 311040000., + monitorFreq = 864000., + & + +# Gridding parameters + &PARM04 + usingSphericalPolarGrid=.TRUE., + delR= 50., 70., 100., 140., 190., + 240., 290., 340., 390., 440., + 490., 540., 590., 640., 690., + ygOrigin=-80., + dySpacing=4., + dxSpacing=4., + & + +# Input datasets + &PARM05 + bathyFile= 'bathymetry.bin', + hydrogThetaFile='lev_t.bin', + hydrogSaltFile= 'lev_s.bin', + & diff --git a/examples/mitgcm/mitgcm_config/input/data.diagnostics b/examples/mitgcm/mitgcm_config/input/data.diagnostics new file mode 100644 index 000000000..7e11e925c --- /dev/null +++ b/examples/mitgcm/mitgcm_config/input/data.diagnostics @@ -0,0 +1,5 @@ +# Diagnostics disabled for shared-library mode (timestep may change at runtime) + &DIAGNOSTICS_LIST + & + &DIAG_STATIS_PARMS + & diff --git a/examples/mitgcm/mitgcm_config/input/data.gmredi b/examples/mitgcm/mitgcm_config/input/data.gmredi new file mode 100644 index 000000000..802719f25 --- /dev/null +++ b/examples/mitgcm/mitgcm_config/input/data.gmredi @@ -0,0 +1,9 @@ +# GM+Redi package parameters: + &GM_PARM01 + GM_background_K = 1.e+3, + GM_taper_scheme = 'gkw91', + GM_maxSlope = 1.e-2, + GM_Kmin_horiz = 50., + GM_Scrit = 4.e-3, + GM_Sd = 1.e-3, + & diff --git a/examples/mitgcm/mitgcm_config/input/data.kpp b/examples/mitgcm/mitgcm_config/input/data.kpp new file mode 100644 index 000000000..63249f681 --- /dev/null +++ b/examples/mitgcm/mitgcm_config/input/data.kpp @@ -0,0 +1,3 @@ +# KPP vertical mixing parameters + &KPP_PARM01 + & diff --git a/examples/mitgcm/mitgcm_config/input/data.pkg b/examples/mitgcm/mitgcm_config/input/data.pkg new file mode 100644 index 000000000..d5f77f64e --- /dev/null +++ b/examples/mitgcm/mitgcm_config/input/data.pkg @@ -0,0 +1,8 @@ +# Package configuration for coupled library mode. +# EXF is disabled: surface forcing comes from the host (Julia). +# KPP is enabled for vertical mixing. + &PACKAGES + useGMRedi = .FALSE., + useKPP = .TRUE., + useDiagnostics = .TRUE., + & diff --git a/examples/mitgcm/mitgcm_ocean_forced_simulation.jl b/examples/mitgcm/mitgcm_ocean_forced_simulation.jl new file mode 100644 index 000000000..6b22ee9ec --- /dev/null +++ b/examples/mitgcm/mitgcm_ocean_forced_simulation.jl @@ -0,0 +1,93 @@ +# # MITgcm Ocean Forced Simulation +# +# This script runs MITgcm (as a shared library) on the `global_oce_latlon` +# grid: 90×40×15, 4°×4° lat-lon, 80S–80N, with JRA55 atmospheric forcing +# applied through NumericalEarth's coupling framework. +# +# Initial conditions and bathymetry come from the MITgcm tutorial binary files. +# Physics: KPP vertical mixing, GM/Redi, CD scheme. +# +# Run for 2 years to compare against `numerical_earth_example.jl`. + +using NumericalEarth +using MITgcm +using Oceananigans +using Oceananigans.Units +using Printf +using Statistics + +# ## Build and load MITgcm + +example_dir = @__DIR__ +config_dir = joinpath(example_dir, "mitgcm_config") +code_dir = joinpath(config_dir, "code") +input_dir = joinpath(config_dir, "input") +build_dir = joinpath(example_dir, "build_jra55") + +mitgcm_dir = get(ENV, "MITGCM_DIR", "") +if !isdir(mitgcm_dir) + @info "Downloading MITgcm source..." + mitgcm_dir = MITgcm.download_mitgcm_source() +end + +@info "Building MITgcm..." mitgcm_dir code_dir input_dir +ocean = MITgcmOceanSimulation(mitgcm_dir; + output_dir = build_dir, + code_dir, + input_dir, + verbose = false) + +lib = ocean.library +Nx, Ny, Nr = lib.dims.Nx, lib.dims.Ny, lib.dims.Nr +@info "MITgcm loaded" Nx Ny Nr + +# ## Build coupled model with JRA55 forcing + +atmos = JRA55PrescribedAtmosphere() +radiation = Radiation(ocean_emissivity=0.0, sea_ice_emissivity=0.0) + +coupled_model = OceanSeaIceModel(ocean, nothing; atmosphere=atmos, radiation) + +Δt = 1200 +stop_time = 360days +simulation = Simulation(coupled_model; Δt, stop_time) + +# ## Progress callback + +wall_time = Ref(time_ns()) + +function progress(sim) + ocean = sim.model.ocean + lib = ocean.library + mtime = MITgcm.get_time(lib) + + refresh_state!(ocean) + mask = view(ocean.hfacc, :, :, 1) + ocean_sst = ocean.theta[:, :, 1][mask .> 0] + ocean_sss = ocean.salt[:, :, 1][mask .> 0] + eta = ocean.etan[mask .> 0] + + elapsed = 1e-9 * (time_ns() - wall_time[]) + + @printf("iter %6d | day %7.1f | SST: [%6.2f, %5.2f] | SSS: [%5.2f, %5.2f] | η: [%.4f, %.4f] mean=%.4e | wall: %s\n", + iteration(sim), mtime / 86400, + minimum(ocean_sst), maximum(ocean_sst), + minimum(ocean_sss), maximum(ocean_sss), + minimum(eta), maximum(eta), mean(eta), + prettytime(elapsed)) + + wall_time[] = time_ns() + return nothing +end + +add_callback!(simulation, progress, TimeInterval(10days)) + +# ## Run + +@info "Running MITgcm + JRA55 simulation..." Δt stop_time +wall_time[] = time_ns() +run!(simulation) + +@info "Simulation complete. Finalizing..." +MITgcm.finalize!(lib) +@info "Done!" diff --git a/examples/mitgcm/numerical_earth_example.jl b/examples/mitgcm/numerical_earth_example.jl new file mode 100644 index 000000000..5acac516b --- /dev/null +++ b/examples/mitgcm/numerical_earth_example.jl @@ -0,0 +1,287 @@ +# # NumericalEarth Ocean Simulation +# +# This script runs Oceananigans on the same grid as the MITgcm `global_oce_latlon` +# tutorial: 90×40×15, 4°×4° lat-lon, 80S–80N, with JRA55 atmospheric forcing. +# +# Initial conditions and bathymetry are read from the MITgcm tutorial binary files +# (linked into the MITgcm build directory) to ensure an exact match with +# `mitgcm_ocean_forced_simulation.jl`. +# +# Physics: CATKE vertical mixing, GM/Redi, horizontal viscosity. +# Numerics matched to MITgcm where possible: AB2 timestepper, +# centered 2nd-order tracer advection, POLY3 EOS (matching MITgcm exactly), +# implicit free surface (PCG, matching MITgcm CG2D), +# no penetrating shortwave (all SW applied at surface). +# Run for 2 years. + +using NumericalEarth +using MITgcm +using Oceananigans +using Oceananigans.Units +using SeawaterPolynomials: AbstractSeawaterPolynomial, BoussinesqEquationOfState +import SeawaterPolynomials: ρ′, thermal_sensitivity, haline_sensitivity, with_float_type +using Printf +using Statistics +using KernelAbstractions: @kernel, @index +using Oceananigans.Operators: ∂xᶠᶜᶜ, ∂yᶜᶠᶜ +using Oceananigans.Utils: launch! +using Oceananigans.ImmersedBoundaries: mask_immersed_field! +using Oceananigans.Architectures: architecture +using Oceananigans.BoundaryConditions: fill_halo_regions! +using Oceananigans: fields +using Oceananigans.MultiRegion: @apply_regionally +import Oceananigans.Models.HydrostaticFreeSurfaceModels: hydrostatic_ab2_step! +using Oceananigans.Models.HydrostaticFreeSurfaceModels: + compute_momentum_flux_bcs!, ab2_step_velocities!, step_free_surface!, + compute_transport_velocities!, compute_tracer_tendencies!, + ab2_step_grid!, correct_barotropic_mode!, ab2_step_tracers!, + compute_momentum_tendencies! +using Oceananigans.Models.NonhydrostaticModels: update_hydrostatic_pressure! +using Oceananigans.Models: surface_kernel_parameters +using Oceananigans.Advection: EnergyConserving + +# ## POLY3 Equation of State — exact match with MITgcm +# +# MITgcm's POLY3 EOS uses a 3rd-order polynomial in (T - T_ref, S - S_ref) +# with different coefficients at each vertical level, read from POLY3.COEFFS. +# ρ = rhoConst + eosSig0[k] + c₁·tp + c₂·sp + c₃·tp² + c₄·tp·sp + c₅·sp² +# + c₆·tp³ + c₇·tp²·sp + c₈·tp·sp² + c₉·sp³ +# where tp = T - T_ref[k], sp = S - S_ref[k]. + +struct POLY3SeawaterPolynomial{N, M, FT} <: AbstractSeawaterPolynomial + z_faces :: NTuple{M, FT} # N+1 z-face positions, bottom to top + T_ref :: NTuple{N, FT} # reference temperature per level + S_ref :: NTuple{N, FT} # reference salinity per level + ρ_ref :: NTuple{N, FT} # reference density anomaly (eosSig0) per level + c₁ :: NTuple{N, FT} + c₂ :: NTuple{N, FT} + c₃ :: NTuple{N, FT} + c₄ :: NTuple{N, FT} + c₅ :: NTuple{N, FT} + c₆ :: NTuple{N, FT} + c₇ :: NTuple{N, FT} + c₈ :: NTuple{N, FT} + c₉ :: NTuple{N, FT} +end + +Base.eltype(::POLY3SeawaterPolynomial{N, M, FT}) where {N, M, FT} = FT +Base.summary(::POLY3SeawaterPolynomial{N, M, FT}) where {N, M, FT} = "POLY3SeawaterPolynomial{$N levels, $FT}" + +function with_float_type(FT, p::POLY3SeawaterPolynomial{N, M}) where {N, M} + cvt(t) = NTuple{length(t), FT}(FT.(t)) + return POLY3SeawaterPolynomial{N, M, FT}( + cvt(p.z_faces), cvt(p.T_ref), cvt(p.S_ref), cvt(p.ρ_ref), + cvt(p.c₁), cvt(p.c₂), cvt(p.c₃), cvt(p.c₄), cvt(p.c₅), + cvt(p.c₆), cvt(p.c₇), cvt(p.c₈), cvt(p.c₉)) +end + +# Map geopotential height Z to the Oceananigans vertical level index (k=1 is bottom). +@inline function find_poly3_level(Z, z_faces) + N = length(z_faces) - 1 + k = 1 + for i in 2:N + k = ifelse(Z >= z_faces[i], i, k) + end + return k +end + +@inline function ρ′(Θ, Sᴬ, Z, eos::BoussinesqEquationOfState{<:POLY3SeawaterPolynomial}) + p = eos.seawater_polynomial + k = find_poly3_level(Z, p.z_faces) + tp = Θ - p.T_ref[k] + sp = Sᴬ - p.S_ref[k] + Δσ = p.c₁[k]*tp + p.c₂[k]*sp + + p.c₃[k]*tp^2 + p.c₄[k]*tp*sp + p.c₅[k]*sp^2 + + p.c₆[k]*tp^3 + p.c₇[k]*tp^2*sp + p.c₈[k]*tp*sp^2 + p.c₉[k]*sp^3 + return p.ρ_ref[k] + Δσ +end + +# thermal_sensitivity = -∂ρ/∂Θ +@inline function thermal_sensitivity(Θ, Sᴬ, Z, eos::BoussinesqEquationOfState{<:POLY3SeawaterPolynomial}) + p = eos.seawater_polynomial + k = find_poly3_level(Z, p.z_faces) + tp = Θ - p.T_ref[k] + sp = Sᴬ - p.S_ref[k] + return -(p.c₁[k] + 2p.c₃[k]*tp + p.c₄[k]*sp + + 3p.c₆[k]*tp^2 + 2p.c₇[k]*tp*sp + p.c₈[k]*sp^2) +end + +# haline_sensitivity = ∂ρ/∂S +@inline function haline_sensitivity(Θ, Sᴬ, Z, eos::BoussinesqEquationOfState{<:POLY3SeawaterPolynomial}) + p = eos.seawater_polynomial + k = find_poly3_level(Z, p.z_faces) + tp = Θ - p.T_ref[k] + sp = Sᴬ - p.S_ref[k] + return p.c₂[k] + p.c₄[k]*tp + 2p.c₅[k]*sp + + p.c₇[k]*tp^2 + 2p.c₈[k]*tp*sp + 3p.c₉[k]*sp^2 +end + +function read_poly3_coeffs(filepath, z_faces) + lines = readlines(filepath) + Nr = parse(Int, strip(lines[1])) + + T_ref = zeros(Nr) + S_ref = zeros(Nr) + ρ_ref = zeros(Nr) + for k in 1:Nr + vals = parse.(Float64, split(strip(lines[1 + k]))) + T_ref[k], S_ref[k], ρ_ref[k] = vals + end + + C = zeros(9, Nr) + for k in 1:Nr + vals = parse.(Float64, split(strip(lines[1 + Nr + k]))) + C[:, k] .= vals + end + + # MITgcm k=1 is top, Oceananigans k=1 is bottom → reverse + rev(v) = Tuple(reverse(v)) + return POLY3SeawaterPolynomial( + Tuple(z_faces), + rev(T_ref), rev(S_ref), rev(ρ_ref), + rev(C[1,:]), rev(C[2,:]), rev(C[3,:]), + rev(C[4,:]), rev(C[5,:]), rev(C[6,:]), + rev(C[7,:]), rev(C[8,:]), rev(C[9,:])) +end + +# ## Grid — matches MITgcm global_oce_latlon exactly + +import Oceananigans.Operators: ζ₃ᶠᶠᶜ, Γᶠᶠᶜ +using Oceananigans.Operators +using Oceananigans.Grids: peripheral_node + +@inline ζ₃ᶠᶠᶜ(i, j, k, grid, u, v) = ifelse(peripheral_node(i, j, k, grid, Face(), Face(), Center()), zero(grid), + Γᶠᶠᶜ(i, j, k, grid, u, v) * Az⁻¹ᶠᶠᶜ(i, j, k, grid)) + +Nx, Ny, Nz = 90, 40, 15 + +Δz = [50., 70., 100., 140., 190., 240., 290., 340., 390., 440., 490., 540., 590., 640., 690.] + +z_faces = zeros(Nz + 1) +z_faces[Nz + 1] = 0.0 +for k in Nz:-1:1 + z_faces[k] = z_faces[k + 1] - Δz[Nz - k + 1] +end + +grid = LatitudeLongitudeGrid(size = (Nx, Ny, Nz), + latitude = (-80, 80), + longitude = (0, 360), + z = z_faces, + halo = (5, 5, 5)) + +# ## Bathymetry and initial conditions from MITgcm binary files +# +# Build MITgcm first to get the tutorial binary files in the run directory. + +example_dir = @__DIR__ +config_dir = joinpath(example_dir, "mitgcm_config") +code_dir = joinpath(config_dir, "code") +input_dir = joinpath(config_dir, "input") +build_dir = joinpath(example_dir, "build_jra55") + +# Build MITgcm (or reuse existing build) to get binary data files +mitgcm_dir = get(ENV, "MITGCM_DIR", "") +if !isdir(mitgcm_dir) + @info "Downloading MITgcm source..." + mitgcm_dir = MITgcm.download_mitgcm_source() +end + +run_dir = joinpath(build_dir, "run") +if !isdir(run_dir) || !isfile(joinpath(run_dir, "bathymetry.bin")) + @info "Building MITgcm to obtain binary data files..." + MITgcm.build_mitgcm_library(mitgcm_dir; + output_dir = build_dir, + code_dir, + input_dir) +end + +function read_bin(filepath; dims) + array = zeros(Float32, prod(dims)) + read!(filepath, array) + array = bswap.(array) + array = Float64.(array) + return reshape(array, dims...) +end + +bathy = read_bin(joinpath(run_dir, "bathymetry.bin"); dims = (Nx, Ny)) +Tini = reverse(read_bin(joinpath(run_dir, "lev_t.bin"); dims = (Nx, Ny, Nz)), dims = 3) +Sini = reverse(read_bin(joinpath(run_dir, "lev_s.bin"); dims = (Nx, Ny, Nz)), dims = 3) + +grid = ImmersedBoundaryGrid(grid, PartialCellBottom(bathy; minimum_fractional_cell_height=0.05)) + +@info "Grid and bathymetry loaded" Nx Ny Nz + +# ## Ocean model — physics matching MITgcm config + +catke_closure = NumericalEarth.Oceans.default_ocean_closure() +vert_viscosity = VerticalScalarDiffusivity(ν=1e-3, κ=3e-5) +horiz_closure = HorizontalScalarDiffusivity(ν=5e5, κ=1e3) + +free_surface = ImplicitFreeSurface(solver_method = :PreconditionedConjugateGradient, + reltol = 1e-13, maxiter = 500) +momentum_advection = Centered(order=2) +tracer_advection = Centered(order=2) + +poly3 = read_poly3_coeffs(joinpath(input_dir, "POLY3.COEFFS"), z_faces) +equation_of_state = BoussinesqEquationOfState(poly3, 1035.0) + +# NumericalEarth only defines reference_density for TEOS10; extend for our POLY3 EOS +import NumericalEarth.EarthSystemModels: reference_density +reference_density(eos::BoussinesqEquationOfState) = eos.reference_density + +coriolis = HydrostaticSphericalCoriolis(scheme=Oceananigans.Coriolis.EENConserving()) + +ocean = ocean_simulation(grid; momentum_advection, tracer_advection, free_surface, + reference_density = 1035, + equation_of_state, + coriolis, + radiative_forcing = nothing, + timestepper = :QuasiAdamsBashforth2, + closure = (catke_closure, horiz_closure, vert_viscosity)) + +set!(ocean.model, T=Tini, S=Sini) + +# ## JRA55 forcing — same as MITgcm simulation + +atmos = JRA55PrescribedAtmosphere() +radiation = Radiation(ocean_emissivity=0.0, sea_ice_emissivity=0.0) + +coupled_model = OceanOnlyModel(ocean; atmosphere=atmos, radiation, ocean_heat_capacity = 3994.0) + +Δt = 1200 +stop_time = 360days +simulation = Simulation(coupled_model; Δt, stop_time) + +# ## Progress callback + +wall_time = Ref(time_ns()) + +function progress(sim) + model = sim.model.ocean.model + T = model.tracers.T + S = model.tracers.S + + Tmin, Tmax = minimum(T), maximum(T) + Smin, Smax = minimum(S), maximum(S) + ηm = mean(model.free_surface.displacement) + + elapsed = 1e-9 * (time_ns() - wall_time[]) + + @printf("iter %6d | day %7.1f | SST: [%6.2f, %5.2f] | SSS: [%5.2f, %5.2f] | mean(η): %.4e | wall: %s\n", + iteration(sim), time(sim) / 86400, + Tmin, Tmax, Smin, Smax, ηm, + prettytime(elapsed)) + + wall_time[] = time_ns() + return nothing +end + +add_callback!(simulation, progress, TimeInterval(10days)) + +# ## Run + +@info "Running Oceananigans + JRA55 simulation..." Δt stop_time +wall_time[] = time_ns() +run!(simulation) + +@info "Done!" diff --git a/ext/NumericalEarthMITgcmExt/NumericalEarthMITgcmExt.jl b/ext/NumericalEarthMITgcmExt/NumericalEarthMITgcmExt.jl new file mode 100644 index 000000000..d843d367b --- /dev/null +++ b/ext/NumericalEarthMITgcmExt/NumericalEarthMITgcmExt.jl @@ -0,0 +1,10 @@ +module NumericalEarthMITgcmExt + +using NumericalEarth +using MITgcm +using Oceananigans + +include("mitgcm_ocean_coupling.jl") +include("mitgcm_state_exchanger.jl") + +end # module NumericalEarthMITgcmExt diff --git a/ext/NumericalEarthMITgcmExt/mitgcm_ocean_coupling.jl b/ext/NumericalEarthMITgcmExt/mitgcm_ocean_coupling.jl new file mode 100644 index 000000000..49f78b880 --- /dev/null +++ b/ext/NumericalEarthMITgcmExt/mitgcm_ocean_coupling.jl @@ -0,0 +1,96 @@ +using Oceananigans: LatitudeLongitudeGrid, Periodic, Bounded, Flat, CPU, Field, + Face, Center + +import Oceananigans.TimeSteppers: time_step!, initialize! +import Oceananigans.Architectures: architecture +import Oceananigans.Fields: set! + +using NumericalEarth.EarthSystemModels: EarthSystemModel +import NumericalEarth.EarthSystemModels: default_nan_checker, + reference_density, + heat_capacity, + ocean_temperature, + ocean_salinity, + ocean_surface_salinity, + ocean_surface_temperature, + ocean_surface_velocities + +import Base: eltype + +using MITgcm: MITgcmOceanSimulation, MITgcmLibrary, + set_timestep!, get_timestep, step!, refresh_state!, + set_fu!, set_fv!, set_qnet!, set_empmr!, set_qsw!, set_saltflux! + +default_nan_checker(model::EarthSystemModel{<:Any, <:Any, <:MITgcmOceanSimulation}) = nothing +initialize!(::MITgcmOceanSimulation) = nothing + +architecture(model::EarthSystemModel{<:Any, <:Any, <:MITgcmOceanSimulation}) = CPU() +eltype(model::EarthSystemModel{<:Any, <:Any, <:MITgcmOceanSimulation}) = Float64 + +##### +##### Time stepping +##### + +""" + time_step!(ocean::MITgcmOceanSimulation, Δt) + +Advance the MITgcm ocean by `Δt` seconds. Sets all MITgcm timestep parameters +(deltaT, deltaTMom, deltaTClock, deltaTFreeSurf, dTtracerLev) to `Δt`, then +takes a single forward step. +""" +function time_step!(ocean::MITgcmOceanSimulation, Δt) + set_timestep!(ocean.library, Float64(Δt)) + step!(ocean.library) + refresh_state!(ocean) + return nothing +end + +reference_density(ocean::MITgcmOceanSimulation) = ocean.reference_density +heat_capacity(ocean::MITgcmOceanSimulation) = ocean.heat_capacity + +ocean_temperature(ocean::MITgcmOceanSimulation) = ocean.theta +ocean_salinity(ocean::MITgcmOceanSimulation) = ocean.salt + +ocean_surface_temperature(ocean::MITgcmOceanSimulation) = view(ocean.theta, :, :, 1) +ocean_surface_salinity(ocean::MITgcmOceanSimulation) = view(ocean.salt, :, :, 1) + +function ocean_surface_velocities(ocean::MITgcmOceanSimulation) + u_surface = view(ocean.uvel, :, :, 1) + v_surface = view(ocean.vvel, :, :, 1) + return u_surface, v_surface +end + +""" + surface_grid(ocean::MITgcmOceanSimulation) + +Construct an Oceananigans `LatitudeLongitudeGrid` from MITgcm's grid arrays. +Assumes the MITgcm grid is a regular lat-lon grid. +""" +function surface_grid(ocean::MITgcmOceanSimulation) + xc = ocean.xc + yc = ocean.yc + Nx = size(xc, 1) + Ny = size(xc, 2) + + # Extract 1D coordinate vectors (MITgcm stores 2D, but for lat-lon they are separable) + λc = xc[:, 1] # longitude centers + φc = yc[1, :] # latitude centers + + # Compute face (edge) coordinates from centers + # Assume uniform spacing (can be extended for stretched grids) + Δλ = length(λc) > 1 ? λc[2] - λc[1] : 1.0 + Δφ = length(φc) > 1 ? φc[2] - φc[1] : 1.0 + + λf = vcat(λc[1] - Δλ/2, [λc[i] + Δλ/2 for i in 1:Nx]) + φf = vcat(φc[1] - Δφ/2, [φc[j] + Δφ/2 for j in 1:Ny]) + + # Determine topology: periodic in longitude if grid spans ~360 degrees + lon_span = λf[end] - λf[1] + TX = lon_span >= 359.0 ? Periodic : Bounded + + return LatitudeLongitudeGrid(size = (Nx, Ny), + longitude = λf, + latitude = φf, + topology = (TX, Bounded, Flat), + halo = (2, 2)) +end diff --git a/ext/NumericalEarthMITgcmExt/mitgcm_state_exchanger.jl b/ext/NumericalEarthMITgcmExt/mitgcm_state_exchanger.jl new file mode 100644 index 000000000..28e45e311 --- /dev/null +++ b/ext/NumericalEarthMITgcmExt/mitgcm_state_exchanger.jl @@ -0,0 +1,154 @@ +using NumericalEarth.Oceans + +import NumericalEarth.EarthSystemModels.InterfaceComputations: + net_fluxes, + initialize!, + ComponentExchanger, + exchange_grid, + compute_sea_ice_ocean_fluxes! + +import NumericalEarth.EarthSystemModels: + interpolate_state!, + update_net_fluxes! + +import NumericalEarth.Oceans: get_radiative_forcing + +using Oceananigans.Fields: interior + +using MITgcm: MITgcmOceanSimulation, + set_fu!, set_fv!, set_qnet!, set_empmr!, set_qsw!, set_saltflux! + +##### +##### ComponentExchanger +##### + +function ComponentExchanger(ocean::MITgcmOceanSimulation, grid) + # MITgcm uses Arakawa C-grid: u at (Face, Center), v at (Center, Face) + state = (; u = Field{Face, Center, Nothing}(grid), + v = Field{Center, Face, Nothing}(grid), + T = Field{Center, Center, Nothing}(grid), + S = Field{Center, Center, Nothing}(grid)) + + return ComponentExchanger(state, nothing) +end + +exchange_grid(atmosphere, ocean::MITgcmOceanSimulation, sea_ice) = surface_grid(ocean) + +##### +##### Net fluxes container +##### + +@inline function net_fluxes(ocean::MITgcmOceanSimulation) + grid = surface_grid(ocean) + u = Field{Face, Center, Nothing}(grid) + v = Field{Center, Face, Nothing}(grid) + T = Field{Center, Center, Nothing}(grid) + S = Field{Center, Center, Nothing}(grid) + + return (; u, v, T, S) +end + +# ============================================================ +# State interpolation +# ============================================================ + +function interpolate_state!(exchanger, exchange_grid, ocean::MITgcmOceanSimulation, coupled_model) + u = exchanger.state.u + v = exchanger.state.v + T = exchanger.state.T + S = exchanger.state.S + + u_surf, v_surf = ocean_surface_velocities(ocean) + T_surf = ocean_surface_temperature(ocean) + S_surf = ocean_surface_salinity(ocean) + + Nx = size(ocean.xc, 1) + Ny = size(ocean.xc, 2) + + # u at (Face, Center): with periodic longitude, interior is (Nx, Ny) — direct match + u_interior = interior(u, :, :, 1) + u_interior .= u_surf + + # v at (Center, Face): with bounded latitude, interior is (Nx, Ny+1). + # MITgcm vVel(i,j) is at the southern face of cell (i,j), so maps to face indices 1:Ny. + # The Ny+1-th face (northern boundary) is set to zero. + v_interior = interior(v, :, :, 1) + v_interior[:, 1:Ny] .= v_surf + v_interior[:, Ny+1] .= 0 + + # T, S at (Center, Center): interior is (Nx, Ny) — direct match + interior(T, :, :, 1) .= T_surf + interior(S, :, :, 1) .= S_surf + + return nothing +end + +initialize!(exchanger::ComponentExchanger, grid, ::MITgcmOceanSimulation) = nothing + +get_radiative_forcing(ocean::MITgcmOceanSimulation) = nothing + +# MITgcm handles its own freezing/temperature limiting internally, +# so no-op the FreezingLimitedOceanTemperature sea-ice-ocean flux computation +using NumericalEarth.EarthSystemModels: EarthSystemModel, NoSeaIceInterface +using NumericalEarth.SeaIces: FreezingLimitedOceanTemperature + +const MITgcmFreezingLimited = EarthSystemModel{<:FreezingLimitedOceanTemperature, <:Any, <:MITgcmOceanSimulation, <:NoSeaIceInterface} +compute_sea_ice_ocean_fluxes!(::MITgcmFreezingLimited) = nothing + +# ============================================================ +# Flux update: coupled model → MITgcm surface forcing +# ============================================================ + +function update_net_fluxes!(coupled_model, ocean::MITgcmOceanSimulation) + + # Use the generic ocean flux assembler to compute net fluxes + # on the exchange grid (momentum, heat, freshwater) + exchange_grid = coupled_model.interfaces.exchanger.grid + Oceans.update_net_ocean_fluxes!(coupled_model, ocean, exchange_grid) + + net_ocean_fluxes = coupled_model.interfaces.net_fluxes.ocean + + Nx = size(ocean.xc, 1) + Ny = size(ocean.xc, 2) + + ρ₀ = ocean.reference_density + cₚ = ocean.heat_capacity + + # Extract assembled fluxes. + # NumericalEarth computes: + # τx, τy = kinematic stress (m²/s² = N/m² / ρ₀) + # Jᵀ = temperature tendency (K·m/s = W/m² / (ρ₀·cₚ)) + # Jˢ = salinity tendency (PSU·m/s) + # MITgcm expects: + # fu, fv = wind stress (N/m²) → multiply by ρ₀ + # Qnet = net heat flux (W/m², positive = ocean cooling) → multiply by ρ₀·cₚ + # EmPmR = freshwater flux (kg/m²/s) → derive from Jˢ (or set to 0 if not available) + # Qsw = shortwave (W/m²) → set to 0 (already included in Qnet) + # saltFlux = salt flux (g/m²/s) → derive from Jˢ + + τx = interior(net_ocean_fluxes.u, :, :, 1) + τy = interior(net_ocean_fluxes.v, :, :, 1) + JT = interior(net_ocean_fluxes.T, :, :, 1) + JS = interior(net_ocean_fluxes.S, :, :, 1) + + for j in 1:Ny, i in 1:Nx + ocean.fu[i, j] = - τx[i, j] * ρ₀ + ocean.fv[i, j] = - τy[i, j] * ρ₀ + ocean.qnet[i, j] = JT[i, j] * ρ₀ * cₚ + ocean.saltflux[i, j] = JS[i, j] * ρ₀ + end + + # These are not needed + fill!(ocean.empmr, 0) + fill!(ocean.qsw, 0) + + # Push to MITgcm + set_fu!(ocean.library, ocean.fu) + set_fv!(ocean.library, ocean.fv) + set_qnet!(ocean.library, ocean.qnet) + set_empmr!(ocean.library, ocean.empmr) + set_qsw!(ocean.library, ocean.qsw) + set_saltflux!(ocean.library, ocean.saltflux) + + return nothing +end diff --git a/src/Oceans/ocean_simulation.jl b/src/Oceans/ocean_simulation.jl index 88627bb1b..b648e2aac 100644 --- a/src/Oceans/ocean_simulation.jl +++ b/src/Oceans/ocean_simulation.jl @@ -116,6 +116,7 @@ end equation_of_state = TEOS10EquationOfState(; reference_density), boundary_conditions::NamedTuple = NamedTuple(), radiative_forcing = default_radiative_forcing(grid), + materialize_buoyancy_gradients = true, warn = true, verbose = false) @@ -197,6 +198,7 @@ function ocean_simulation(grid; tracer_advection = WENO(order=7), equation_of_state = TEOS10EquationOfState(; reference_density), boundary_conditions::NamedTuple = NamedTuple(), + materialize_buoyancy_gradients = true, radiative_forcing = default_radiative_forcing(grid), warn = true, verbose = false) @@ -289,6 +291,7 @@ function ocean_simulation(grid; # conditions even when a user-bc is supplied). boundary_conditions = merge(default_boundary_conditions, boundary_conditions) buoyancy = SeawaterBuoyancy(; gravitational_acceleration, equation_of_state) + bouyancy = Oceananigans.BuoyancyFormulations.BuoyancyForce(grid, buoyancy; materialize_gradients = materialize_buoyancy_gradients) if tracer_advection isa NamedTuple tracer_advection = with_tracers(tracers, tracer_advection, default_tracer_advection()) diff --git a/test/test_mitgcm.jl b/test/test_mitgcm.jl new file mode 100644 index 000000000..9aab27d1a --- /dev/null +++ b/test/test_mitgcm.jl @@ -0,0 +1,97 @@ +include("runtests_setup.jl") + +using Test +using NumericalEarth +using Oceananigans +using MITgcm + +# Path to pre-built library from MITgcm.jl examples +const MITGCM_JL_DIR = pkgdir(MITgcm) +const EXAMPLE_DIR = joinpath(MITGCM_JL_DIR, "examples", "global_oce_latlon") +const LIB_PATH = joinpath(EXAMPLE_DIR, Sys.isapple() ? "libmitgcm.dylib" : "libmitgcm.so") +const RUN_DIR = joinpath(EXAMPLE_DIR, "run") + +if !isfile(LIB_PATH) || !isdir(RUN_DIR) + @warn "Pre-built MITgcm library not found at $EXAMPLE_DIR. Skipping MITgcm tests." +else + +@testset "MITgcm ocean model interface" begin + # Test that the extension is available + MITgcmExt = Base.get_extension(NumericalEarth, :NumericalEarthMITgcmExt) + @test !isnothing(MITgcmExt) + + # Test creating a MITgcmOceanSimulation from pre-built library + ocean = MITgcmOceanSimulation(LIB_PATH, RUN_DIR) + @test ocean isa MITgcmOceanSimulation + + # Test dimensions + @test size(ocean.theta) == (90, 40, 15) + @test size(ocean.salt) == (90, 40, 15) + @test size(ocean.uvel) == (90, 40, 15) + @test size(ocean.vvel) == (90, 40, 15) + @test size(ocean.etan) == (90, 40) + @test size(ocean.xc) == (90, 40) + @test size(ocean.yc) == (90, 40) + @test length(ocean.rc) == 15 + @test length(ocean.drf) == 15 + + # Test basic interface functions + ρₒ = NumericalEarth.EarthSystemModels.reference_density(ocean) + cₚ = NumericalEarth.EarthSystemModels.heat_capacity(ocean) + @test ρₒ ≈ 1029.0 + @test cₚ ≈ 3994.0 + + # Test ocean state accessors + T = NumericalEarth.EarthSystemModels.ocean_temperature(ocean) + S = NumericalEarth.EarthSystemModels.ocean_salinity(ocean) + @test T === ocean.theta + @test S === ocean.salt + @test ndims(T) == 3 + @test ndims(S) == 3 + + T_surf = NumericalEarth.EarthSystemModels.ocean_surface_temperature(ocean) + S_surf = NumericalEarth.EarthSystemModels.ocean_surface_salinity(ocean) + @test size(T_surf) == (90, 40) + @test size(S_surf) == (90, 40) + + u_surf, v_surf = NumericalEarth.EarthSystemModels.ocean_surface_velocities(ocean) + @test size(u_surf) == (90, 40) + @test size(v_surf) == (90, 40) + + # Test surface grid construction + grid = MITgcmExt.surface_grid(ocean) + @test grid isa Oceananigans.Grids.LatitudeLongitudeGrid + + # Test time stepping + theta_before = copy(ocean.theta) + MITgcmExt.time_step!(ocean, 43200.0) # 12 hours + @test ocean.theta != theta_before # State should change + + # Test a few more steps + for _ in 1:3 + MITgcmExt.time_step!(ocean, 43200.0) + end + @test MITgcm.get_niter(ocean.library) == 4 + + # Test with PrescribedAtmosphere and EarthSystemModel + @testset "Coupled model with PrescribedAtmosphere" begin + grid = MITgcmExt.surface_grid(ocean) + Nx, Ny = size(ocean.xc) + + atmosphere = NumericalEarth.PrescribedAtmosphere(grid) + + coupled_model = NumericalEarth.EarthSystemModels.OceanOnlyModel(ocean; atmosphere) + @test coupled_model isa NumericalEarth.EarthSystemModels.EarthSystemModel + + # Initialize and step the coupled model + NumericalEarth.EarthSystemModels.initialize!(coupled_model) + NumericalEarth.EarthSystemModels.time_step!(coupled_model, 43200.0) + + @test MITgcm.get_niter(ocean.library) == 5 + end + + # Finalize + MITgcm.finalize!(ocean.library) +end + +end # if pre-built library exists