From d77bca8995e326478b2f43a59e2d0bdfec03c338 Mon Sep 17 00:00:00 2001 From: Julia Sloan Date: Fri, 13 Oct 2023 12:13:06 -0700 Subject: [PATCH] move folders to exp/ClimaCore --- Project.toml | 2 - docs/make.jl | 11 +- docs/src/couplerstate.md | 20 - docs/src/timestepping.md | 23 - .../ClimaCore/CoupledSims/coupled_sim.jl | 100 +- experiments/ClimaCore/Project.toml | 3 - experiments/ClimaCore/sea-ice/Manifest.toml | 1533 ----------------- experiments/ClimaCore/sea-ice/Project.toml | 16 - experiments/ClimaCore/sea-ice/README.md | 72 - experiments/ClimaCore/sea-ice/slab_ice.jl | 340 ---- .../ClimaCore/sea_breeze/Manifest.toml | 216 +-- experiments/ClimaCore/sea_breeze/Project.toml | 4 + experiments/ClimaCore/sea_breeze/atmos_rhs.jl | 37 +- experiments/ClimaCore/sea_breeze/land_rhs.jl | 15 +- experiments/ClimaCore/sea_breeze/ocean_rhs.jl | 15 +- experiments/ClimaCore/sea_breeze/run.jl | 36 +- .../tc1_heat-diffusion-with-slab/run.jl | 43 +- .../tc2_ekman-column-with-slab/run.jl | 19 +- src/ClimaCoupler.jl | 3 - src/CoupledSimulations/clock.jl | 14 - src/CoupledSimulations/coupled_simulation.jl | 64 - test/CoupledSimulations/clock.jl | 14 - test/CoupledSimulations/cplsolver.jl | 156 -- test/Project.toml | 2 + .../coupled_sims.jl} | 30 +- test/runtests.jl | 9 +- 26 files changed, 326 insertions(+), 2471 deletions(-) delete mode 100644 docs/src/couplerstate.md delete mode 100644 docs/src/timestepping.md rename src/CouplerState/coupler_state.jl => experiments/ClimaCore/CoupledSims/coupled_sim.jl (71%) delete mode 100644 experiments/ClimaCore/sea-ice/Manifest.toml delete mode 100644 experiments/ClimaCore/sea-ice/Project.toml delete mode 100644 experiments/ClimaCore/sea-ice/README.md delete mode 100644 experiments/ClimaCore/sea-ice/slab_ice.jl delete mode 100644 src/CoupledSimulations/clock.jl delete mode 100644 src/CoupledSimulations/coupled_simulation.jl delete mode 100644 test/CoupledSimulations/clock.jl delete mode 100644 test/CoupledSimulations/cplsolver.jl rename test/{CouplerState/cplstate_interface.jl => experiment_tests/coupled_sims.jl} (80%) diff --git a/Project.toml b/Project.toml index 501c96e2c..51ae77e02 100644 --- a/Project.toml +++ b/Project.toml @@ -17,7 +17,6 @@ JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" @@ -40,7 +39,6 @@ JLD2 = "0.4" NCDatasets = "0.11, 0.12" OrdinaryDiffEq = "5, 6" Plots = "1" -PrettyTables = "1, 2" SciMLBase = "1" StaticArrays = "1" SurfaceFluxes = "0.7" diff --git a/docs/make.jl b/docs/make.jl index d6de55f84..88c0a9063 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -56,16 +56,7 @@ experiment_pages = [ "Sea Breeze" => map(s -> "generated/sea_breeze/$(s)", readdir(joinpath(@__DIR__, "src/generated/sea_breeze"))), "AMIP" => map(s -> "generated/amip/$(s)", readdir(joinpath(@__DIR__, "src/generated/amip"))), ] -interface_pages = [ - "couplerstate.md", - "timestepping.md", - "regridder.md", - "conservation.md", - "utilities.md", - "bcreader.md", - "testhelper.md", - "timemanager.md", -] +interface_pages = ["regridder.md", "conservation.md", "utilities.md", "bcreader.md", "testhelper.md", "timemanager.md"] performance_pages = ["performance.md"] pages = Any[ diff --git a/docs/src/couplerstate.md b/docs/src/couplerstate.md deleted file mode 100644 index 66637e768..000000000 --- a/docs/src/couplerstate.md +++ /dev/null @@ -1,20 +0,0 @@ -# Coupler State - -The coupler provides a space to store information being passed between coupled model components at their boundaries. During this exchange, the coupler manages ancillary operations such as regridding, unit conversions, filtering, etc. - -The ClimaCoupler defines a type [`CouplerState`](@ref) for a _container_ variable -that holds information about the field boundary values that are being used to -couple components. Components can use a [`coupler_put!`](@ref) operation to -export a set of field values to a `CouplerState` variable. A [`coupler_get`](@ref) -operation is used to retrieve a set of field values from a `CplState` variable. -During this exchange, the coupler manages ancillary operations such as -regridding, unit conversions, or filtering. - -## Coupler Object API - -```@docs -ClimaCoupler.CouplerState -ClimaCoupler.coupler_add_field! -ClimaCoupler.coupler_put! -ClimaCoupler.coupler_get -``` diff --git a/docs/src/timestepping.md b/docs/src/timestepping.md deleted file mode 100644 index afdbb2978..000000000 --- a/docs/src/timestepping.md +++ /dev/null @@ -1,23 +0,0 @@ -# Coupled Simulations & Timestepping - -`ClimaCoupler.jl` organizes coupled models and their execution -via the [`CoupledSimulation`](@ref) interface. An implementation -of a [`CoupledSimulation`](@ref), like any CliMA simulation, must -implement a [`ClimaCoupler.step!`](@ref) method, which in this context specifies -the coupling scheme details (e.g. explicit, leap-frog, concurrent, etc...). - -Component models being coupled must provide three methods for use in a -[`CoupledSimulation`](@ref)'s [`ClimaCoupler.step!`](@ref) method: -- `step!`: advances the component model in time -- [`coupler_push!`](@ref): prepares and puts coupled fields from the model - into the coupler via `coupler_put!` calls -- [`coupler_pull!`](@ref): gets coupled fields from the coupler - via `coupler_get!` calls and prepares them to be ingested by the model. - -```@docs -ClimaCoupler.CoupledSimulation -ClimaCoupler.run! -ClimaCoupler.step! -ClimaCoupler.coupler_push! -ClimaCoupler.coupler_pull! -``` \ No newline at end of file diff --git a/src/CouplerState/coupler_state.jl b/experiments/ClimaCore/CoupledSims/coupled_sim.jl similarity index 71% rename from src/CouplerState/coupler_state.jl rename to experiments/ClimaCore/CoupledSims/coupled_sim.jl index 007480bd5..d5397c6b6 100644 --- a/src/CouplerState/coupler_state.jl +++ b/experiments/ClimaCore/CoupledSims/coupled_sim.jl @@ -6,6 +6,86 @@ export CouplerState export coupler_push!, coupler_pull!, coupler_put!, coupler_get, coupler_get! export coupler_add_field!, coupler_add_map! + +""" + AbstractSim + +An abstract type representing a model simulation. +""" +abstract type AbstractSim end + +abstract type AbstractAtmosSim <: AbstractSim end +name(::AbstractAtmosSim) = :atmos + +abstract type AbstractOceanSim <: AbstractSim end +name(::AbstractOceanSim) = :ocean + +abstract type AbstractLandSim <: AbstractSim end +name(::AbstractLandSim) = :land + +abstract type AbstractCoupledSim <: AbstractSim end +name(::AbstractCoupledSim) = :coupled + +""" + CoupledSim + +A subtype of the abstract type `AbstractCoupledSim` representing a model simulation. +""" +struct CoupledSim{CS, S, CPL, L, C} <: AbstractCoupledSim + "The coupled time-stepping scheme" + coupler_solver::CS + "The component simulations" + sims::S + "The coupler" + coupler::CPL + "Diagnostic logger" + logger::L + "Clock" + clock::C +end + +""" + run!(::CoupledSim) + +A simple outer timestepping loop for coupled system runs. + +This will be formalized when the `run!` functionality for component +models is implemented so to have a consistent interface. +""" +function run!(sim::CoupledSim) + clock = sim.clock + while !stop_time_exceeded(clock) + step!(sim, clock.dt) + tick!(clock) + end +end + +""" + step!(sim, dt) + +Advances a simulation `sim` by `dt`. + +Note that `dt` is not necessarily the simulation's timestep length; +a simuation could take several shorter steps that total to `dt`. +""" +function step!(sim::AbstractSim, dt) end + +""" + Clock{T} + +Manages a simulation's time information. +""" +mutable struct Clock{T} + time::T # current simulation time + dt::T # simulation timestep + stop_time::T # simulation end time +end + +tick!(clock::Clock) = (clock.time += clock.dt) + +stop_time_exceeded(clock::Clock) = (clock.time >= clock.stop_time) + + mutable struct CplFieldInfo{DT, MD} # the coupled data data::DT @@ -31,7 +111,7 @@ _fields(coupler::CouplerState) = getfield(coupler, :coupled_fields) Type for holding coupler "state". This is the namespace through which coupled components communicate. Its role is to provide a level of indirection so that components remain modular -and so that any data communication, interpolation, reindexing/unit conversions and filtering +and so that any data communication, interpolation, reindexing/unit conversions and filtering etc... can be embeded in the intermdediate coupling layer. A field is exported by one component and imported by one or more other components. @@ -47,7 +127,7 @@ end fieldvalue, ) -Add a field to the coupler that is accessible with key `fieldname`. +Add a field to the coupler that is accessible with key `fieldname`. # Arguments - `coupler`: coupler object the field is added to. @@ -58,7 +138,7 @@ function coupler_add_field!( coupler::CouplerState, fieldname::Symbol, fieldvalue; - write_sim::AbstractSimulation, + write_sim::AbstractSim, metadata = nothing, ) push!(coupler.coupled_fields, fieldname => CplFieldInfo(fieldvalue, name(write_sim), metadata)) @@ -71,7 +151,7 @@ end map::Operators.LinearRemap ) -Add a map to the coupler that is accessible with key `mapname`. +Add a map to the coupler that is accessible with key `mapname`. # Arguments - `coupler`: coupler object the field is added to. @@ -87,7 +167,7 @@ end Sets coupler field `fieldname` to `fieldvalue`. """ -function coupler_put!(coupler::CouplerState, fieldname::Symbol, fieldvalue, source_sim::AbstractSimulation) +function coupler_put!(coupler::CouplerState, fieldname::Symbol, fieldvalue, source_sim::AbstractSim) cplfield = coupler.coupled_fields[fieldname] @assert cplfield.write_sim == name(source_sim) "$fieldname can only be written to by $(cplfield.write_sim)." @@ -109,7 +189,7 @@ them for the coupler. function coupler_push!(coupler::CouplerState, model) end """ - coupler_get!(target_field::ClimaCore.Fields.Field, coupler::CouplerState, fieldname::Symbol, target_sim::AbstractSimulation) + coupler_get!(target_field::ClimaCore.Fields.Field, coupler::CouplerState, fieldname::Symbol, target_sim::AbstractSim) Retrieve data array corresponding to `fieldname`, remap and store in `target_field`. """ @@ -117,7 +197,7 @@ function coupler_get!( target_field::ClimaCore.Fields.Field, coupler::CouplerState, fieldname::Symbol, - target_sim::AbstractSimulation, + target_sim::AbstractSim, ) cplfield = coupler.coupled_fields[fieldname] map = get_remap_operator(coupler, name(target_sim), cplfield.write_sim) @@ -125,7 +205,7 @@ function coupler_get!( end """ - coupler_get(coupler::CouplerState, fieldname::Symbol [, target_sim::AbstractSimulation]) + coupler_get(coupler::CouplerState, fieldname::Symbol [, target_sim::AbstractSim]) Retrieve data array corresponding to `fieldname`. @@ -136,7 +216,7 @@ function coupler_get(coupler::CouplerState, fieldname::Symbol) return cplfield.data end -function coupler_get(coupler::CouplerState, fieldname::Symbol, target_sim::AbstractSimulation) +function coupler_get(coupler::CouplerState, fieldname::Symbol, target_sim::AbstractSim) cplfield = coupler.coupled_fields[fieldname] map = get_remap_operator(coupler, name(target_sim), cplfield.write_sim) return Operators.remap(map, cplfield.data) @@ -176,5 +256,5 @@ function Base.show(io::IO, coupler::CouplerState) data[i, :] = [k] end header = (["Field Name"], [""]) - pretty_table(data, header = header) + PrettyTables.pretty_table(data, header = header) end diff --git a/experiments/ClimaCore/Project.toml b/experiments/ClimaCore/Project.toml index 13b691138..e7b9560b6 100644 --- a/experiments/ClimaCore/Project.toml +++ b/experiments/ClimaCore/Project.toml @@ -6,7 +6,6 @@ DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -LandHydrology = "f224512b-7ae7-4422-9a84-30035e16ed2d" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" Oceananigans = "9e8cae18-63c1-5223-a75c-80ca9d6e9a09" @@ -18,10 +17,8 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" [compat] -DiffEqCallbacks = "2.23" IntervalSets = "0.6" OrdinaryDiffEq = "6.15" SciMLBase = "1.40" -StaticArrays = "1.4" TerminalLoggers = "0.1" UnPack = "1.0" diff --git a/experiments/ClimaCore/sea-ice/Manifest.toml b/experiments/ClimaCore/sea-ice/Manifest.toml deleted file mode 100644 index f6f96a783..000000000 --- a/experiments/ClimaCore/sea-ice/Manifest.toml +++ /dev/null @@ -1,1533 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.7.1" -manifest_format = "2.0" - -[[deps.AbstractFFTs]] -deps = ["ChainRulesCore", "LinearAlgebra"] -git-tree-sha1 = "6f1d9bc1c08f9f4a8fa92e3ea3cb50153a1b40d4" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.1.0" - -[[deps.AbstractTrees]] -git-tree-sha1 = "03e0550477d86222521d254b741d470ba17ea0b5" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.3.4" - -[[deps.Adapt]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "af92965fb30777147966f58acb05da51c5616b5f" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "3.3.3" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" - -[[deps.ArnoldiMethod]] -deps = ["LinearAlgebra", "Random", "StaticArrays"] -git-tree-sha1 = "62e51b39331de8911e4a7ff6f5aaf38a5f4cc0ae" -uuid = "ec485272-7323-5ecc-a04f-4719b315124d" -version = "0.2.0" - -[[deps.ArrayInterface]] -deps = ["Compat", "IfElse", "LinearAlgebra", "Requires", "SparseArrays", "Static"] -git-tree-sha1 = "c933ce606f6535a7c7b98e1d86d5d1014f730596" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "5.0.7" - -[[deps.ArrayLayouts]] -deps = ["FillArrays", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "8b921542ad44cba67f1487e2226446597e0a90af" -uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "0.8.5" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[deps.BFloat16s]] -deps = ["LinearAlgebra", "Printf", "Random", "Test"] -git-tree-sha1 = "a598ecb0d717092b5539dbbe890c98bac842b072" -uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" -version = "0.2.0" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[deps.BitTwiddlingConvenienceFunctions]] -deps = ["Static"] -git-tree-sha1 = "28bbdbf0354959db89358d1d79d421ff31ef0b5e" -uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" -version = "0.1.3" - -[[deps.BlockArrays]] -deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra"] -git-tree-sha1 = "28c497806c05326e7cadac0c916980d5a9c0e905" -uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" -version = "0.16.14" - -[[deps.Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+0" - -[[deps.CEnum]] -git-tree-sha1 = "eb4cb44a499229b3b8426dcfb5dd85333951ff90" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.4.2" - -[[deps.CLIMAParameters]] -deps = ["Test"] -git-tree-sha1 = "17ece0add9940728f8120a1561fc3361be6a6f26" -uuid = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" -version = "0.4.3" - -[[deps.CPUSummary]] -deps = ["CpuId", "IfElse", "Static"] -git-tree-sha1 = "baaac45b4462b3b0be16726f38b789bf330fcb7a" -uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" -version = "0.1.21" - -[[deps.CUDA]] -deps = ["AbstractFFTs", "Adapt", "BFloat16s", "CEnum", "CompilerSupportLibraries_jll", "ExprTools", "GPUArrays", "GPUCompiler", "LLVM", "LazyArtifacts", "Libdl", "LinearAlgebra", "Logging", "Printf", "Random", "Random123", "RandomNumbers", "Reexport", "Requires", "SparseArrays", "SpecialFunctions", "TimerOutputs"] -git-tree-sha1 = "ba75320aaa092b3e17c020a2d8b9e0a572dbfa6a" -uuid = "052768ef-5323-5732-b1bb-66c8b64840ba" -version = "3.9.0" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.16.1+1" - -[[deps.Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[deps.Cassette]] -git-tree-sha1 = "063b2e77c5537a548c5bf2f44161f1d3e1ab3227" -uuid = "7057c7e9-c182-5462-911a-8362d720325c" -version = "0.3.10" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "9950387274246d08af38f6eef8cb5480862a435f" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.14.0" - -[[deps.ChangesOfVariables]] -deps = ["ChainRulesCore", "LinearAlgebra", "Test"] -git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1" -uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" -version = "0.1.2" - -[[deps.ClimaComms]] -deps = ["CUDA", "KernelAbstractions", "StaticArrays"] -git-tree-sha1 = "50fbb76557f11e28ec21ad2fbe5e7547f1b1f432" -uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" -version = "0.3.0" - -[[deps.ClimaCore]] -deps = ["Adapt", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DiffEqBase", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "IntervalSets", "LinearAlgebra", "RecursiveArrayTools", "RootSolvers", "Rotations", "SparseArrays", "Static", "StaticArrays", "Statistics", "UnPack"] -git-tree-sha1 = "5dbe75f49ca1d240530863a26e9ce790d3c39e57" -uuid = "d414da3d-4745-48bb-8d80-42e94e092884" -version = "0.10.0" - -[[deps.CloseOpenIntervals]] -deps = ["ArrayInterface", "Static"] -git-tree-sha1 = "f576084239e6bdf801007c80e27e2cc2cd963fe0" -uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" -version = "0.1.6" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"] -git-tree-sha1 = "12fc73e5e0af68ad3137b886e3f7c1eacfca2640" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.17.1" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.0" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.8" - -[[deps.CommonSolve]] -git-tree-sha1 = "68a0743f578349ada8bc911a5cbd5a2ef6ed6d1f" -uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" -version = "0.2.0" - -[[deps.CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[deps.Compat]] -deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] -git-tree-sha1 = "b153278a25dd42c65abbf4e62344f9d22e59191b" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "3.43.0" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" - -[[deps.ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f74e9d5388b8620b4cee35d4c5a618dd4dc547f4" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.3.0" - -[[deps.Contour]] -deps = ["StaticArrays"] -git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.5.7" - -[[deps.CpuId]] -deps = ["Markdown"] -git-tree-sha1 = "32d125af0fb8ec3f8935896122c5e345709909e5" -uuid = "adafc99b-e345-5852-983c-f28acb93d879" -version = "0.3.0" - -[[deps.CubedSphere]] -deps = ["Elliptic", "Printf", "Rotations", "TaylorSeries", "Test"] -git-tree-sha1 = "f66fabd1ee5df59a7ba47c7873a6332c19e0c03f" -uuid = "7445602f-e544-4518-8976-18f8e8ae6cdb" -version = "0.2.0" - -[[deps.DEDataArrays]] -deps = ["ArrayInterface", "DocStringExtensions", "LinearAlgebra", "RecursiveArrayTools", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "5e5f8f363c8c9a2415ef9185c4e0ff6966c87d52" -uuid = "754358af-613d-5f8d-9788-280bf1605d4c" -version = "0.2.2" - -[[deps.DataAPI]] -git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.9.0" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.11" - -[[deps.DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[deps.DelimitedFiles]] -deps = ["Mmap"] -uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" - -[[deps.DensityInterface]] -deps = ["InverseFunctions", "Test"] -git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" -uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" -version = "0.4.0" - -[[deps.DiffEqBase]] -deps = ["ArrayInterface", "ChainRulesCore", "DEDataArrays", "DataStructures", "Distributions", "DocStringExtensions", "FastBroadcast", "ForwardDiff", "FunctionWrappers", "IterativeSolvers", "LabelledArrays", "LinearAlgebra", "Logging", "MuladdMacro", "NonlinearSolve", "Parameters", "PreallocationTools", "Printf", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "StaticArrays", "Statistics", "SuiteSparse", "ZygoteRules"] -git-tree-sha1 = "cde20558d9a50ebef5f173aaa0e6ece8ca563c93" -uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" -version = "6.83.1" - -[[deps.DiffResults]] -deps = ["StaticArrays"] -git-tree-sha1 = "c18e98cba888c6c25d1c3b048e4b3380ca956805" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.0.3" - -[[deps.DiffRules]] -deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "dd933c4ef7b4c270aacd4eb88fa64c147492acf0" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.10.0" - -[[deps.Distances]] -deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.7" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[deps.Distributions]] -deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] -git-tree-sha1 = "5a4168170ede913a2cd679e53c2123cb4b889795" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.53" - -[[deps.DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.8.6" - -[[deps.Downloads]] -deps = ["ArgTools", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" - -[[deps.DualNumbers]] -deps = ["Calculus", "NaNMath", "SpecialFunctions"] -git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" -uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" -version = "0.6.8" - -[[deps.EarCut_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d" -uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" -version = "2.2.3+0" - -[[deps.Elliptic]] -git-tree-sha1 = "71c79e77221ab3a29918aaf6db4f217b89138608" -uuid = "b305315f-e792-5b7a-8f41-49f472929428" -version = "1.0.1" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bad72f730e9e91c08d9427d5e8db95478a3c323d" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.4.8+0" - -[[deps.ExponentialUtilities]] -deps = ["ArrayInterface", "GenericSchur", "LinearAlgebra", "Printf", "Requires", "SparseArrays", "libblastrampoline_jll"] -git-tree-sha1 = "951c44b4af9d1e061d5cf789a30881471604c14c" -uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" -version = "1.14.0" - -[[deps.ExprTools]] -git-tree-sha1 = "56559bbef6ca5ea0c0818fa5c90320398a6fbf8d" -uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.8" - -[[deps.FFMPEG]] -deps = ["FFMPEG_jll"] -git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" -uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" -version = "0.4.1" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "d8a578692e3077ac998b50c0217dfd67f21d1e5f" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.0+0" - -[[deps.FastBroadcast]] -deps = ["LinearAlgebra", "Polyester", "Static"] -git-tree-sha1 = "b6bf57ec7a3f294c97ae46124705a9e6b906a209" -uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" -version = "0.1.15" - -[[deps.FastClosures]] -git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" -uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" -version = "0.3.2" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "80ced645013a5dbdc52cf70329399c35ce007fae" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.13.0" - -[[deps.FillArrays]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] -git-tree-sha1 = "246621d23d1f43e3b9c368bf3b72b2331a27c286" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "0.13.2" - -[[deps.FiniteDiff]] -deps = ["ArrayInterface", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays"] -git-tree-sha1 = "56956d1e4c1221000b7781104c58c34019792951" -uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.11.0" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.4" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.93+0" - -[[deps.Formatting]] -deps = ["Printf"] -git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" -uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" -version = "0.4.2" - -[[deps.ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions", "StaticArrays"] -git-tree-sha1 = "1bd6fc0c344fc0cbee1f42f8d2e7ec8253dda2d2" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.25" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.10.4+0" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.10+0" - -[[deps.FunctionWrappers]] -git-tree-sha1 = "241552bc2209f0fa068b6415b1942cc0aa486bcc" -uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" -version = "1.1.2" - -[[deps.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[deps.GLFW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] -git-tree-sha1 = "51d2dfe8e590fbd74e7a842cf6d13d8a2f45dc01" -uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" -version = "3.3.6+0" - -[[deps.GPUArrays]] -deps = ["Adapt", "LLVM", "LinearAlgebra", "Printf", "Random", "Serialization", "Statistics"] -git-tree-sha1 = "c783e8883028bf26fb05ed4022c450ef44edd875" -uuid = "0c68f7d7-f131-5f86-a1c3-88cf8149b2d7" -version = "8.3.2" - -[[deps.GPUCompiler]] -deps = ["ExprTools", "InteractiveUtils", "LLVM", "Libdl", "Logging", "TimerOutputs", "UUIDs"] -git-tree-sha1 = "556190e1e0ea3e37d83059fc9aa576f1e2104375" -uuid = "61eb1bfa-7361-4325-ad38-22787b887f55" -version = "0.14.1" - -[[deps.GR]] -deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] -git-tree-sha1 = "af237c08bda486b74318c8070adb96efa6952530" -uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" -version = "0.64.2" - -[[deps.GR_jll]] -deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "cd6efcf9dc746b06709df14e462f0a3fe0786b1e" -uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" -version = "0.64.2+0" - -[[deps.GaussQuadrature]] -deps = ["SpecialFunctions"] -git-tree-sha1 = "45bf52a9fb04350d8771ad694772c18c878683b6" -uuid = "d54b0c1a-921d-58e0-8e36-89d8069c0969" -version = "0.5.7" - -[[deps.GenericSchur]] -deps = ["LinearAlgebra", "Printf"] -git-tree-sha1 = "fb69b2a645fa69ba5f474af09221b9308b160ce6" -uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" -version = "0.5.3" - -[[deps.GeometryBasics]] -deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "83ea630384a13fc4f002b77690bc0afeb4255ac9" -uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.2" - -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" - -[[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.68.3+2" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.14+0" - -[[deps.Graphs]] -deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "57c021de207e234108a6f1454003120a1bf350c4" -uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.6.0" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.HTTP]] -deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] -git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "0.9.17" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] -git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "2.8.1+1" - -[[deps.HostCPUFeatures]] -deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] -git-tree-sha1 = "18be5268cf415b5e27f34980ed25a7d34261aa83" -uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" -version = "0.1.7" - -[[deps.Hwloc]] -deps = ["Hwloc_jll"] -git-tree-sha1 = "92d99146066c5c6888d5a3abc871e6a214388b91" -uuid = "0e44f5e4-bd66-52a0-8798-143a42290a1d" -version = "2.0.0" - -[[deps.Hwloc_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "303d70c961317c4c20fafaf5dbe0e6d610c38542" -uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" -version = "2.7.1+0" - -[[deps.IfElse]] -git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" -uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" -version = "0.1.1" - -[[deps.Inflate]] -git-tree-sha1 = "f5fc07d4e706b84f72d54eedcc1c13d92fb0871c" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.2" - -[[deps.IniFile]] -git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" -uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" -version = "0.5.1" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[deps.IntervalSets]] -deps = ["Dates", "Statistics"] -git-tree-sha1 = "eb381d885e30ef859068fce929371a8a5d06a914" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.6.1" - -[[deps.InverseFunctions]] -deps = ["Test"] -git-tree-sha1 = "91b5dcf362c5add98049e6c29ee756910b03051d" -uuid = "3587e190-3f89-42d0-90ee-14403ec27112" -version = "0.1.3" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.1.1" - -[[deps.IterTools]] -git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.4.0" - -[[deps.IterativeSolvers]] -deps = ["LinearAlgebra", "Printf", "Random", "RecipesBase", "SparseArrays"] -git-tree-sha1 = "1169632f425f79429f245113b775a0e3d121457c" -uuid = "42fd0dbc-a981-5370-80f2-aaf504508153" -version = "0.9.2" - -[[deps.IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[deps.JLLWrappers]] -deps = ["Preferences"] -git-tree-sha1 = "abc9885a7ca2052a736a600f7fa66209f96506e1" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.4.1" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.3" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b53380851c6e6664204efb2e62cd24fa5c47e4ba" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "2.1.2+0" - -[[deps.KLU]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse_jll"] -git-tree-sha1 = "cae5e3dfd89b209e01bcd65b3a25e74462c67ee0" -uuid = "ef3ab10e-7fda-4108-b977-705223b18434" -version = "0.3.0" - -[[deps.KernelAbstractions]] -deps = ["Adapt", "Cassette", "InteractiveUtils", "MacroTools", "SpecialFunctions", "StaticArrays", "UUIDs"] -git-tree-sha1 = "cb7d8b805413025a5bc866fc036b426223ffc059" -uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -version = "0.7.2" - -[[deps.Krylov]] -deps = ["LinearAlgebra", "Printf", "SparseArrays"] -git-tree-sha1 = "82f5afb342a5624dc4651981584a841f6088166b" -uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" -version = "0.8.0" - -[[deps.KrylovKit]] -deps = ["LinearAlgebra", "Printf"] -git-tree-sha1 = "49b0c1dd5c292870577b8f58c51072bd558febb9" -uuid = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" -version = "0.5.4" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.1+0" - -[[deps.LERC_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" -uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "3.0.0+1" - -[[deps.LLVM]] -deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] -git-tree-sha1 = "c9b86064be5ae0f63e50816a5a90b08c474507ae" -uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "4.9.1" - -[[deps.LLVMExtra_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] -git-tree-sha1 = "5558ad3c8972d602451efe9d81c78ec14ef4f5ef" -uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.14+2" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.1+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.0" - -[[deps.LabelledArrays]] -deps = ["ArrayInterface", "ChainRulesCore", "LinearAlgebra", "MacroTools", "StaticArrays"] -git-tree-sha1 = "fbd884a02f8bf98fd90c53c1c9d2b21f9f30f42a" -uuid = "2ee39098-c373-598a-b85f-a56591580800" -version = "1.8.0" - -[[deps.Latexify]] -deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] -git-tree-sha1 = "6f14549f7760d84b2db7a9b10b88cd3cc3025730" -uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" -version = "0.15.14" - -[[deps.LayoutPointers]] -deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static"] -git-tree-sha1 = "b651f573812d6c36c22c944dd66ef3ab2283dfa1" -uuid = "10f19ff3-798f-405d-979b-55457f8fc047" -version = "0.1.6" - -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" - -[[deps.LeftChildRightSiblingTrees]] -deps = ["AbstractTrees"] -git-tree-sha1 = "b864cb409e8e445688bc478ef87c0afe4f6d1f8d" -uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" -version = "0.1.3" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" - -[[deps.LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.2+1" - -[[deps.Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] -git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.7+0" - -[[deps.Libglvnd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] -git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" -uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" -version = "1.3.0+3" - -[[deps.Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.42.0+0" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.16.1+1" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.35.0+0" - -[[deps.Libtiff_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "c9551dd26e31ab17b86cbd00c2ede019c08758eb" -uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.3.0+1" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.36.0+0" - -[[deps.LineSearches]] -deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] -git-tree-sha1 = "f27132e551e959b3667d8c93eae90973225032dd" -uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" -version = "7.1.1" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[deps.LinearSolve]] -deps = ["ArrayInterface", "DocStringExtensions", "IterativeSolvers", "KLU", "Krylov", "KrylovKit", "LinearAlgebra", "RecursiveFactorization", "Reexport", "Requires", "SciMLBase", "Setfield", "SparseArrays", "SuiteSparse", "UnPack"] -git-tree-sha1 = "6eb8e10ed29b85673495c29bd77ee0dfa8929977" -uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" -version = "1.15.0" - -[[deps.LogExpFunctions]] -deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "a970d55c2ad8084ca317a4658ba6ce99b7523571" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.12" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[deps.LoopVectorization]] -deps = ["ArrayInterface", "CPUSummary", "ChainRulesCore", "CloseOpenIntervals", "DocStringExtensions", "ForwardDiff", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "SIMDDualNumbers", "SLEEFPirates", "SpecialFunctions", "Static", "ThreadingUtilities", "UnPack", "VectorizationBase"] -git-tree-sha1 = "4acc35e95bf18de5e9562d27735bef0950f2ed74" -uuid = "bdcacae8-1622-11e9-2a5c-532679323890" -version = "0.12.108" - -[[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.9" - -[[deps.ManualMemory]] -git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" -uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" -version = "0.1.8" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] -git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.0.3" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" - -[[deps.Measures]] -git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" -uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" -version = "0.3.1" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.0.2" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" - -[[deps.MuladdMacro]] -git-tree-sha1 = "c6190f9a7fc5d9d5915ab29f2134421b12d24a68" -uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" -version = "0.2.2" - -[[deps.NLSolversBase]] -deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] -git-tree-sha1 = "50310f934e55e5ca3912fb941dec199b49ca9b68" -uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" -version = "7.8.2" - -[[deps.NLsolve]] -deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"] -git-tree-sha1 = "019f12e9a1a7880459d0173c182e6a99365d7ac1" -uuid = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" -version = "4.5.1" - -[[deps.NaNMath]] -git-tree-sha1 = "b086b7ea07f8e38cf122f5016af580881ac914fe" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "0.3.7" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" - -[[deps.NonlinearSolve]] -deps = ["ArrayInterface", "FiniteDiff", "ForwardDiff", "IterativeSolvers", "LinearAlgebra", "RecursiveArrayTools", "RecursiveFactorization", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "UnPack"] -git-tree-sha1 = "aeebff6a2a23506e5029fd2248a26aca98e477b3" -uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" -version = "0.3.16" - -[[deps.OffsetArrays]] -deps = ["Adapt"] -git-tree-sha1 = "043017e0bdeff61cfbb7afeb558ab29536bbb5ed" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.10.8" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ab05aa4cc89736e95915b01e7279e61b1bfe33b8" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "1.1.14+0" - -[[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.5+0" - -[[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.4.1" - -[[deps.OrdinaryDiffEq]] -deps = ["Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastClosures", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "NonlinearSolve", "Polyester", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "SparseArrays", "SparseDiffTools", "StaticArrays", "UnPack"] -git-tree-sha1 = "8031a288c9b418664a3dfbac36e464a3f61ace73" -uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -version = "6.10.0" - -[[deps.PCRE_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" -uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" -version = "8.44.0+0" - -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "e8185b83b9fc56eb6456200e873ce598ebc7f262" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.7" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" - -[[deps.Parsers]] -deps = ["Dates"] -git-tree-sha1 = "3b429f37de37f1fc603cc1de4a799dc7fbe4c0b6" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.3.0" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.40.1+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" - -[[deps.PlotThemes]] -deps = ["PlotUtils", "Statistics"] -git-tree-sha1 = "8162b2f8547bc23876edd0c5181b27702ae58dce" -uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" -version = "3.0.0" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "bb16469fd5224100e422f0b027d26c5a25de1200" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.2.0" - -[[deps.Plots]] -deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] -git-tree-sha1 = "6f2dd1cf7a4bbf4f305a0d8750e351cb46dfbe80" -uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.27.6" - -[[deps.Polyester]] -deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "8d95a735921204f5d551ac300b20d802a150433a" -uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.6.8" - -[[deps.PolyesterWeave]] -deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] -git-tree-sha1 = "7e597df97e46ffb1c8adbaddfa56908a7a20194b" -uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" -version = "0.1.5" - -[[deps.PreallocationTools]] -deps = ["Adapt", "ArrayInterface", "ForwardDiff", "LabelledArrays"] -git-tree-sha1 = "6c138c8510111fa47b5d2ed8ada482d97e279bee" -uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" -version = "0.2.4" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "47e5f437cc0e7ef2ce8406ce1e7e24d44915f88d" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.3.0" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.ProgressLogging]] -deps = ["Logging", "SHA", "UUIDs"] -git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" -uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" -version = "0.1.4" - -[[deps.Qt5Base_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] -git-tree-sha1 = "c6c0f690d0cc7caddb74cef7aa847b824a16b256" -uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" -version = "5.15.3+1" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.4.2" - -[[deps.Quaternions]] -deps = ["DualNumbers", "LinearAlgebra", "Random"] -git-tree-sha1 = "b327e4db3f2202a4efafe7569fcbe409106a1f75" -uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0" -version = "0.5.6" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[deps.Random]] -deps = ["SHA", "Serialization"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[deps.Random123]] -deps = ["Random", "RandomNumbers"] -git-tree-sha1 = "afeacaecf4ed1649555a19cb2cad3c141bbc9474" -uuid = "74087812-796a-5b5d-8853-05524746bad3" -version = "1.5.0" - -[[deps.RandomNumbers]] -deps = ["Random", "Requires"] -git-tree-sha1 = "043da614cc7e95c703498a491e2c21f58a2b8111" -uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" -version = "1.5.3" - -[[deps.RecipesBase]] -git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.2.1" - -[[deps.RecipesPipeline]] -deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] -git-tree-sha1 = "dc1e451e15d90347a7decc4221842a022b011714" -uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.5.2" - -[[deps.RecursiveArrayTools]] -deps = ["Adapt", "ArrayInterface", "ChainRulesCore", "DocStringExtensions", "FillArrays", "LinearAlgebra", "RecipesBase", "Requires", "StaticArrays", "Statistics", "ZygoteRules"] -git-tree-sha1 = "bfe14f127f3e7def02a6c2b1940b39d0dabaa3ef" -uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "2.26.3" - -[[deps.RecursiveFactorization]] -deps = ["LinearAlgebra", "LoopVectorization", "Polyester", "StrideArraysCore", "TriangularSolve"] -git-tree-sha1 = "a9a852c7ebb08e2a40e8c0ab9830a744fa283690" -uuid = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" -version = "0.2.10" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "cdbd3b1338c72ce29d9584fdbe9e9b70eeb5adca" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "0.1.3" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.0" - -[[deps.Rmath]] -deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.7.0" - -[[deps.Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.3.0+0" - -[[deps.RootSolvers]] -deps = ["DocStringExtensions", "ForwardDiff"] -git-tree-sha1 = "08c746c1b621e88953650133e46428bfecc11058" -uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" -version = "0.3.0" - -[[deps.Rotations]] -deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays", "Statistics"] -git-tree-sha1 = "3177100077c68060d63dd71aec209373c3ec339b" -uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc" -version = "1.3.1" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" - -[[deps.SIMDDualNumbers]] -deps = ["ForwardDiff", "IfElse", "SLEEFPirates", "VectorizationBase"] -git-tree-sha1 = "62c2da6eb66de8bb88081d20528647140d4daa0e" -uuid = "3cdde19b-5bb0-4aaf-8931-af3e248e098b" -version = "0.1.0" - -[[deps.SIMDTypes]] -git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" -uuid = "94e857df-77ce-4151-89e5-788b33177be4" -version = "0.1.0" - -[[deps.SLEEFPirates]] -deps = ["IfElse", "Static", "VectorizationBase"] -git-tree-sha1 = "ac399b5b163b9140f9c310dfe9e9aaa225617ff6" -uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" -version = "0.6.32" - -[[deps.SciMLBase]] -deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "RecipesBase", "RecursiveArrayTools", "StaticArrays", "Statistics", "Tables", "TreeViews"] -git-tree-sha1 = "f03796a588eba66f6bcc63cfdeda89b4a339ce4e" -uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -version = "1.30.0" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.1.0" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[deps.Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "Requires"] -git-tree-sha1 = "38d88503f695eb0301479bc9b0d4320b378bafe5" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "0.8.2" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.0.1" - -[[deps.SparseArrays]] -deps = ["LinearAlgebra", "Random"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - -[[deps.SparseDiffTools]] -deps = ["Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "Requires", "SparseArrays", "StaticArrays", "VertexSafeGraphs"] -git-tree-sha1 = "314a07e191ea4a5ea5a2f9d6b39f03833bde5e08" -uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" -version = "1.21.0" - -[[deps.SpecialFunctions]] -deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "cbf21db885f478e4bd73b286af6e67d1beeebe4c" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "1.8.4" - -[[deps.Static]] -deps = ["IfElse"] -git-tree-sha1 = "87e9954dfa33fd145694e42337bdd3d5b07021a6" -uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" -version = "0.6.0" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "Random", "Statistics"] -git-tree-sha1 = "cd56bf18ed715e8b09f06ef8c6b781e6cdc49911" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.4.4" - -[[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "c82aaa13b44ea00134f8c9c89819477bd3986ecd" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.3.0" - -[[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "8977b17906b0a1cc74ab2e3a05faa16cf08a8291" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.33.16" - -[[deps.StatsFuns]] -deps = ["ChainRulesCore", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "5950925ff997ed6fb3e985dcce8eb1ba42a0bbe7" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "0.9.18" - -[[deps.StrideArraysCore]] -deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "Requires", "SIMDTypes", "Static", "ThreadingUtilities"] -git-tree-sha1 = "df8fc9d0407a77241c529cc2ef97ba2e3436ff51" -uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" -version = "0.3.2" - -[[deps.StructArrays]] -deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"] -git-tree-sha1 = "57617b34fa34f91d536eb265df67c2d4519b8b98" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.5" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "Pkg", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" - -[[deps.TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[deps.Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits", "Test"] -git-tree-sha1 = "5ce79ce186cc678bbb5c5681ca3379d1ddae11a1" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.7.0" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" - -[[deps.TaylorSeries]] -deps = ["InteractiveUtils", "LinearAlgebra", "Markdown", "Requires", "SparseArrays"] -git-tree-sha1 = "66f4d1993bae49eeba21a1634b5f65782585a42c" -uuid = "6aa5eb33-94cf-58f4-a9d0-e4b2c4fc25ea" -version = "0.10.13" - -[[deps.TerminalLoggers]] -deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] -git-tree-sha1 = "62846a48a6cd70e63aa29944b8c4ef704360d72f" -uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -version = "0.1.5" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.ThreadingUtilities]] -deps = ["ManualMemory"] -git-tree-sha1 = "f8629df51cab659d70d2e5618a430b4d3f37f2c3" -uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" -version = "0.5.0" - -[[deps.TimerOutputs]] -deps = ["ExprTools", "Printf"] -git-tree-sha1 = "11db03dd5bbc0d2b57a570d228a0f34538c586b1" -uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" -version = "0.5.17" - -[[deps.TreeViews]] -deps = ["Test"] -git-tree-sha1 = "8d0d7a3fe2f30d6a7f833a5f19f7c7a5b396eae6" -uuid = "a2a6695c-b41b-5b7d-aed9-dbfdeacea5d7" -version = "0.3.0" - -[[deps.TriangularSolve]] -deps = ["CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "LoopVectorization", "Polyester", "Static", "VectorizationBase"] -git-tree-sha1 = "b8d08f55b02625770c09615d96927b3a8396925e" -uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" -version = "0.1.11" - -[[deps.URIs]] -git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.3.0" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[deps.UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.Unzip]] -git-tree-sha1 = "34db80951901073501137bdbc3d5a8e7bbd06670" -uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" -version = "0.1.2" - -[[deps.VectorizationBase]] -deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "Hwloc", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static"] -git-tree-sha1 = "9d1b533f597d87ce9b4abd36a2ce4664f08e08ed" -uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" -version = "0.21.29" - -[[deps.VertexSafeGraphs]] -deps = ["Graphs"] -git-tree-sha1 = "8351f8d73d7e880bfc042a8b6922684ebeafb35c" -uuid = "19fa3120-7c27-5ec5-8db8-b0b0aa330d6f" -version = "0.2.0" - -[[deps.Wayland_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" -uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" -version = "1.19.0+0" - -[[deps.Wayland_protocols_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4528479aa01ee1b3b4cd0e6faef0e04cf16466da" -uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" -version = "1.25.0+0" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.9.12+0" - -[[deps.XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.34+0" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.6.9+4" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.9+4" - -[[deps.Xorg_libXcursor_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" -uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" -version = "1.2.0+4" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.3+4" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.4+4" - -[[deps.Xorg_libXfixes_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" -uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" -version = "5.0.3+4" - -[[deps.Xorg_libXi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] -git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" -uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" -version = "1.7.10+4" - -[[deps.Xorg_libXinerama_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] -git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" -uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" -version = "1.1.4+4" - -[[deps.Xorg_libXrandr_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] -git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" -uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" -version = "1.5.2+4" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.10+4" - -[[deps.Xorg_libpthread_stubs_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" -uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" -version = "0.1.0+3" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.13.0+3" - -[[deps.Xorg_libxkbfile_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] -git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" -uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" -version = "1.1.0+4" - -[[deps.Xorg_xcb_util_image_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" -uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] -git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" -uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_keysyms_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" -uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" -version = "0.4.0+1" - -[[deps.Xorg_xcb_util_renderutil_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" -uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" -version = "0.3.9+1" - -[[deps.Xorg_xcb_util_wm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] -git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" -uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" -version = "0.4.1+1" - -[[deps.Xorg_xkbcomp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] -git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" -uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" -version = "1.4.2+4" - -[[deps.Xorg_xkeyboard_config_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] -git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" -uuid = "33bec58e-1273-512f-9401-5d533626f822" -version = "2.27.0+4" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.4.0+3" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" - -[[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e45044cd873ded54b6a5bac0eb5c971392cf1927" -uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" -version = "1.5.2+0" - -[[deps.ZygoteRules]] -deps = ["MacroTools"] -git-tree-sha1 = "8c1a8e4dfacb1fd631745552c8db35d0deb09ea0" -uuid = "700de1a5-db45-46bc-99cf-38207098b444" -version = "0.2.2" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.1+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl", "OpenBLAS_jll"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.2+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.38+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+1" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" - -[[deps.xkbcommon_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] -git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6" -uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" -version = "0.9.1+5" diff --git a/experiments/ClimaCore/sea-ice/Project.toml b/experiments/ClimaCore/sea-ice/Project.toml deleted file mode 100644 index a763f0cbe..000000000 --- a/experiments/ClimaCore/sea-ice/Project.toml +++ /dev/null @@ -1,16 +0,0 @@ -[deps] -CLIMAParameters = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" -ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884" -DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" -KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" -LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" -OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd" -SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" -Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -TerminalLoggers = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" -UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" diff --git a/experiments/ClimaCore/sea-ice/README.md b/experiments/ClimaCore/sea-ice/README.md deleted file mode 100644 index 2b945e840..000000000 --- a/experiments/ClimaCore/sea-ice/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# **Simple Sea Ice Model** - -# Semtner's Zero-layer Model - -Sea ice is approximated as a model that does not occupy a particular gridpoint between the mixed layer (ocean) and the atmosphere. It is essentially implemented in each domain column as an ODE, with no horizontal transport between the columns. In the absence of ice, the sea-ice model reduces to the slab ocean formulation. The ice is assumed to have a negligible heat capacity (so there is no energy storage due to internal temperature changes of the ice). The only storage changes arise from the ice thickness changes, which result from temperature differences at the ice surface or at the ice base. - -We followed the FMS implementation as in [Zhang et al 22](https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2021MS002671), which can be found on [GitHub](https://github.com/sally-xiyue/fms-idealized/blob/sea_ice_v1.0/exp/sea_ice/srcmods/mixed_layer.f90) and is itself a modification of the 0-layer model of [Semtner 1976](https://www.atmosp.physics.utoronto.ca/people/guido/PHY2502/articles/seaice-landice/AJSemtner_1976.pdf) (appendix). Chronologically, the algorithm follows these steps, with all fluxes defined positive upward: - -## 1. Ice thickness, $h_i$ -$$ -L_i \frac{dh_i}{dt} = F_{atm} - F_{base} -$$ -- with the latent heat of fusion, $L_i=3 \times 10^8$ J m$^{-3}$, and where the (upward-pointing) flux into the atmosphere is -$$ -F_{atm} = F_{rad} + F_{SH} + F_{LH} \approx \lambda (-{T_{sfc}} - T_{atm}) -$$ -- where the latter approximation was used for testing in earlier prototypes. $F_{atm}$ will be obtained from the atmospheric model (via the coupler). The flux at the ice base from the mixed layer is -$$ -F_{base} = F_0(T_{ml} - T_{melt}) -$$ -- where $T_{melt} = 273.16$ K is the freezing temperature, and the basal heat coefficient $F_0 = 120$ W m$^{-2}$ K$^{-1}$. - -## 2. Ocean mixed layer temperature, $T_{ml}$ -- $T_{ml}$ is the standard slab ocean formulation in ice-free conditions: -$$ -\rho_w c_w h_{ml}\frac{dT_{ml}}{dt} = - F_{atm} -$$ -- while ice-covered conditions require that: -$$ -\rho_w c_w h_{ml}\frac{dT_{ml}}{dt} = - F_{base} -$$ - -## 3. Transitions between ice free and ice covered conditions -- If the updated $T_{ml}^{t+1} < T_{melt}$, set $T_{ml}^{t+1} = T_{melt}$ and grow ice ($h_i^{t+1}$) due to the corresponding energy deficit. -- If the updated $h_i^{t+1} <= 0$ from a non-zero $h_i^t$, adjust $h_i^{t+1} = 0$ and use the surplus energy to warm the mixed layer. - -## 4. Surface temperature ($T_s$) -- $T_s$ is determined implicitly using a balance between $F_{atm}(T_s)$ and the conductive heat flux through the ice slab, $F_{ice}$: -$$ -F_{atm} = F_{ice} = k_i \frac{T_{melt} - T_s}{h_i} -$$ -- where $k_i = 2$ W m$^{-2}$ k$^{-1}$ is the thermal conductivity of ice. -- currently the implicit solve is implemented as one Newton iteration: -$$ -T_s^{t+1} = T_s + \frac{F}{dF /d T_s} = T_s^{t} + \frac{- F_{atm}^t + F_{ice}^{t+1}}{k_i/h_i^{t+1} + d F_{atm}^t / d T_s^t} -$$ -- where $h_i^{t+1}$ is the updated $h^i$ from the previous section, and $d F_{atm}^t / d T_s^t$ needs to be supplied from the atmosphere model (or crudely calculated in the coupler, given $T_s$, turbulent diffusivities and transfer coefficients, and atmos state). -- Where $T_s^{t+1} > T_{melt}$, we set $T_s^{t+1} = T_{melt}$. Where there is no ice $T_s^{t+1} = T_{ml}^{t+1}$. - -## 5. Update ice mask -- `mask = 1` if ice and `mask = 0` if no ice - -# Q flux (optional) -- We can add an additional flux to the RHS of the $T_{ml}$ equations in (2), which corresponds to a more realistic ocean heating, coarsely mimicking otherwise neglected ocean dynamics, such as lateral advection, convection and diffusion. This is especially needed to improve low latitude oceanic forcing. - -- An analytic formulation can be written as: -$$ -Q = Q_0(1-2\phi^2/w_\phi^2) \frac{exp(- (\phi^2/w_\phi^2))}{cos(\phi)} -$$ -- where $\phi$ is latitude in radians, $Q_0$ is the amplitude of the equatorial heating and $w_\phi$ the width of the heating in radians. - -# Alternatives - -## [Semtner 1976](https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/2021MS002671) 3-layer model -- Semtner (1976) developed a simple model for the evolution ice (2 layers) and snow (1 layer) temperatures, which is represented by a 1D diffusve process also accounting for radiation, melting and energy release from brine poskets and accumulating snow. -- Main formation of sea ice - energy fluxes from vertical boundaries and heat storage in brine pockets. The vertical processes retain the central role. -- Semtner 1976 found that the 0-layer model is broadly comparable in terms of accuracy as the 3-layer model - -## Ocean-based dynamical sea-ice model -- to be coordinated after AMIP - - diff --git a/experiments/ClimaCore/sea-ice/slab_ice.jl b/experiments/ClimaCore/sea-ice/slab_ice.jl deleted file mode 100644 index 8da4ff343..000000000 --- a/experiments/ClimaCore/sea-ice/slab_ice.jl +++ /dev/null @@ -1,340 +0,0 @@ -# # Heat Equation + Slab Tutorial - -# - load external packages: -import LinearAlgebra, UnPack -import ClimaCore: Fields, Domains, Topologies, Meshes, DataLayouts, Operators, Geometry, Spaces - -using Base: show_supertypes -using OrdinaryDiffEq: ODEProblem, solve, SSPRK33 - -using Logging: global_logger -using TerminalLoggers: TerminalLogger - -using RecursiveArrayTools - -using OrdinaryDiffEq - -using Statistics - -#src ## Setup Logging Information -global_logger(TerminalLogger()) -const CI = !isnothing(get(ENV, "CI", nothing)) - -# ## Define Parameters -# - Global Constants -const FT = Float64; - -# - Experiment-specific Parameters -parameters = ( - ## atmos parameters - zmin_atm = FT(0.0), # height of atm stack bottom [m] - zmax_atm = FT(1.0), # height of atm stack top [m] - n = 15, # number of elements in atm stack - μ = FT(0.0001), # diffusion coefficient [m^2 / s] - T_top = FT(280.0), # fixed temperature at the top of the domain_atm [K] - ρc_ml = FT(4e6), # density times heat transfer coefficient for mixed layer [J / m2 / K ] - F0_base = FT(120), # ice base transfer coefficient [W / m2 / K] - T_base = FT(273.16), # ice base temperature [K] - L_ice = FT(3e8), # latent heat coefficient for ice [J / m3] - h_ml = FT(1), # mixed layer depth [m] - T_freeze = FT(273.16), # temperature at freezing point [K] - k_ice = FT(2), # thermal conductivity of ice [W / m / K] - ## coupling parameters - λ = FT(0.001), # coupling coefficient (J / K / s / m2) -) - -# ## Define Model Functions - -# - Model 1 (atm) Equations -""" - ∑tendencies_atm!(du, u, (parameters, T_sfc), t) - -Heat diffusion equation - dT/dt = ∇ μ ∇ T - where - (- μ ∇ T) = 0 at z = zmax_atm - (- μ ∇ T) = F_sfc at z = zmin_atm - -We also use this model to calculate and accumulate the downward surface fluxes, F_sfc: - F_sfc = - λ * (T_sfc - T1) - d(F_integrated)/dt = F_sfc - where - F_integrated is reset to 0 at the beginning of each coupling cycle - T1 = atm temperature near the surface (here assumed equal to the first model level) -""" -function ∑tendencies_atm!(du, u, p, t) - - FT = eltype(u) - T = u.T # u.x = vector of prognostic variables from DifferentialEquations - F_sfc = calculate_flux(p.Ya.T_sfc[1], parent(T)[1], p.p) - - ## set BCs - - bcs_bottom = Operators.SetValue(Geometry.WVector(F_sfc ./ p.p.λ)) - bcs_top = Operators.SetValue(Geometry.WVector(FT(0))) - - gradc2f = Operators.GradientC2F() - gradf2c = Operators.DivergenceF2C(bottom = bcs_bottom, top = bcs_top) # # Neumann BC (face-to-center) - ## tendency calculations - @. du.T = gradf2c(p.p.μ * gradc2f(T)) # dT/dt - du.F .= -F_sfc[1] # d(F_integrated)/dt - -end - -get_∂F_atm∂T_sfc(p) = -p.λ # TODO: in GCM this will be: 4 σ T_sfc^3 + ||uh|| ρ cp (C_H + L(q_sat1 - q_sat) * dT^(-1)) - -# - Model 2 (ice) Equations -""" - solve_ice!(dT_sfc, T_sfc, (parameters, F_accumulated), t) - -slab RHS with an implicit solve ice and explicit (forward Euler) solve for ocean - -""" -function solve_ice!(integ, Δt) - - Y = integ.u - Ya = integ.p.Ya - p = integ.p.p - - FT = eltype(Y) - ocean_qflux = FT(0) - - # prognostic - T_ml = Y.T_ml - T_sfc = Y.T_sfc - h_ice = Y.h_ice - - # auxiliary - F_atm = Ya.F_atm - - ∂F_atm∂T_sfc = get_∂F_atm∂T_sfc(p) # this will be passed from atmos/SF.jl - - ΔT_ml = similar(F_atm) - Δh_ice = similar(F_atm) - F_ice = similar(F_atm) - ΔT_sfc = similar(F_atm) - - # ice thickness and mixed layer temperature changes due to atmosphereic and ocean fluxes - if h_ice[1] > 0 # ice-covered - @. ΔT_ml = -(p.F0_base * (T_ml - p.T_base) + ocean_qflux) * Δt / (p.h_ml * p.ρc_ml) - @. Δh_ice = (F_atm - p.F0_base * (T_ml - p.T_base)) * Δt / p.L_ice - else # ice-free - @. ΔT_ml = -(F_atm + ocean_qflux) * Δt / (p.h_ml * p.ρc_ml) - @. Δh_ice = 0 - end - - # adjust if transition to ice-covered - if (T_ml[1] + ΔT_ml[1] < p.T_freeze) - @. Δh_ice = Δh_ice - (T_ml + ΔT_ml - p.T_freeze) * (p.h_ml * p.ρc_ml) / p.L_ice - @. ΔT_ml = p.T_freeze - T_ml - end - - # adjust if transition to ice-free - if ((h_ice[1] > 0) & (h_ice[1] + Δh_ice[1] <= 0)) - @. ΔT_ml = ΔT_ml - (h_ice + Δh_ice) * p.L_ice / (p.h_ml * p.ρc_ml) - @. Δh_ice = -h_ice - end - - # solve for T_sfc - if (h_ice[1] + Δh_ice[1] > 0) # surface is ice-covered - # if ice covered, solve implicity (for now one Newton iteration: ΔT_s = - F(T_s) / dF(T_s)/dT_s ) - @. F_ice = p.k_ice / (h_ice + Δh_ice) * (p.T_base - T_sfc) - @. ΔT_sfc = (-F_atm + F_ice) / (p.k_ice / (h_ice + Δh_ice) + ∂F_atm∂T_sfc) - if (T_sfc[1] + ΔT_sfc[1] > p.T_freeze) - @. ΔT_sfc = p.T_freeze - T_sfc - end - # surface is ice-covered, so update T_sfc as ice surface temperature - @. Y.T_sfc += ΔT_sfc - else # ice-free, so update T_sfc as mixed layer temperature - @. Y.T_sfc = T_ml + ΔT_ml - end - - # update state - @. Y.T_ml += ΔT_ml - @. Y.h_ice += Δh_ice - - @. Ya.ice_mask = h_ice[1] > 0 ? h_ice[1] * FT(1) : h_ice[1] * FT(0) - - return nothing -end - -function ∑tendencies_ice_stub(du, u, p, t) - dY = du - FT = eltype(dY) - - solve_ice!((; u = u, p = p), p.Δt) # timestepping outside of DeffEq (but DeffEq still used here for saving vars in `integ.sol`) - - @. dY.T_ml = FT(0) - @. dY.h_ice = FT(0) - @. dY.T_sfc = FT(0) - -end - -# - Surface Flux Calculation (coarse bulk formula) -calculate_flux(T_sfc, T1, parameters) = -parameters.λ * (T_sfc - T1); - -# - Coupler Communication Functions -# These functions export / import / transform variables -# These functions are now just place holders for coupler transformations (e.g. regridding, masking, etc) -coupler_get(x) = copy(x); -coupler_put(x) = copy(x); - -# ## Model Initialization -# - initialize atm model domain and grid -domain_atm = Domains.IntervalDomain( - Geometry.ZPoint{FT}(parameters.zmin_atm), - Geometry.ZPoint{FT}(parameters.zmax_atm); - boundary_tags = (:bottom, :top), -); -mesh_atm = Meshes.IntervalMesh(domain_atm, nelems = parameters.n); # struct, allocates face boundaries to 5,6: atmos -center_space_atm = Spaces.CenterFiniteDifferenceSpace(mesh_atm); # collection of the above, discretises space into FD and provides coords - -# - initialize prognostic variables, either as ClimaCore's Field objects or as Arrays -T_atm_0 = Fields.ones(FT, center_space_atm) .* FT(265); -Y_atm = Fields.FieldVector(T = T_atm_0, F = [FT(0)]) -Y_ice = Fields.FieldVector(T_sfc = [parameters.T_freeze], h_ice = [FT(0)], T_ml = [parameters.T_freeze]) - -# - initialize auxiliary variables -ics_aux = (; atm = (; T_sfc = copy(Y_ice.T_sfc)), ice = (; ice_mask = [FT(0)], F_atm = [FT(0)])) - -# - specify timestepping information -stepping = (; - Δt_min = 0.01, - timerange = (0.0, 10.0), - Δt_coupler = 0.01, - odesolver = Euler(), #SSPRK33(), - nsteps_atm = 1, # number of timesteps of atm per coupling cycle - nsteps_ice = 1, # number of timesteps of ice per coupling cycle -); - -# ## Define the sequential coupling loop -function coupler_solve!(stepping, ics_aux, parameters) - t = 0.0 - Δt_min = stepping.Δt_min - Δt_coupler = stepping.Δt_coupler - t_start = stepping.timerange[1] - t_end = stepping.timerange[2] - - ## SETUP ATMOS - ## put all prognostic variable arrays into a vector and ensure that solve can partition them - prob_atm = ODEProblem(∑tendencies_atm!, Y_atm, (t_start, t_end), (; p = parameters, Ya = ics_aux.atm)) - integ_atm = init(prob_atm, stepping.odesolver, dt = Δt_min, saveat = 1 * Δt_min) - - ## SETUP ICE - prob_ice = - ODEProblem(∑tendencies_ice_stub, Y_ice, (t_start, t_end), (; p = parameters, Ya = ics_aux.ice, Δt = Δt_coupler)) - integ_ice = init(prob_ice, Euler(), dt = Δt_coupler, saveat = 1 * Δt_coupler) - - ## coupler stepping - for t in (t_start:Δt_coupler:t_end) - - ## STEP ATMOS - ## pre_atmos - integ_atm.u.F .= [0.0] # surface flux to be accumulated - integ_atm.p.Ya.T_sfc .= coupler_get(integ_ice.u.T_sfc) # integ_atm.p is the parameter vector of an ODEProblem from DifferentialEquations - - ## run atmos - ## NOTE: use (t - integ_atm.t) here instead of Δt_coupler to avoid accumulating roundoff error in our timestepping. - OrdinaryDiffEq.step!(integ_atm, Δt_coupler, true) - - # ## no post_atmos - - ## STEP ICE - ## pre_ice - - integ_ice.p.Ya.F_atm .= coupler_get(integ_atm.u.F) / Δt_coupler - Δt_coupler_ice = Δt_coupler - - ## run ice - OrdinaryDiffEq.step!(integ_ice, Δt_coupler_ice, true) - - # ## no post ice - - end - - return integ_atm, integ_ice -end; - -# ## Run the Coupler Model Simulation -integ_atm, integ_ice = coupler_solve!(stepping, ics_aux, parameters); -sol_atm, sol_ice = integ_atm.sol, integ_ice.sol; - -# ## Postprocessing and Visualization - -# Each integrator output (`sol_atm`, `sol_ice`), contains the DifferentialEquations variable `.u` (the name is hard coded). - -ENV["GKSwstype"] = "nul" -import Plots -Plots.GRBackend() - -show_plots = isdefined(Main, :SHOWPLOTS) ? SHOWPLOTS : true - -path = joinpath(dirname(@__FILE__), "images/") -mkpath(path); - -# - Vertical profile at start and end -t0_ = parent(sol_atm.u[1].T)[:, 1]; -tend_ = parent(sol_atm.u[end].T)[:, 1]; -z_centers = parent(Fields.coordinate_field(center_space_atm))[:, 1]; -show_plots ? -Plots.png( - Plots.plot( - [t0_ tend_], - z_centers, - title = "model 1: atm", - labels = ["t=0" "t=end"], - xlabel = "T (K)", - ylabel = "z (m)", - ), - joinpath(path, "tc1_f1.png"), -) : nothing -# ![](images/tc1_f1.png) - -# - Conservation: absolute "energy" of both models with time -# convert to the same units (analogous to energy conservation, assuming that is both domains density=1 and thermal capacity=1) -ice_sfc_h_t = [sum(parent(u.h_ice)[:]) for u in sol_ice.u] .* parameters.h_ml * parameters.L_ice; -ice_sfc_u_t = [sum(parent(u.T_sfc)[:]) for u in sol_ice.u] .* parameters.h_ml * parameters.ρc_ml .- ice_sfc_h_t; -atm_sum_u_t = - [sum(parent(u.T)[:]) for u in sol_atm.u] .* (parameters.zmax_atm .- parameters.zmin_atm) ./ parameters.n .* parameters.λ; -v1 = ice_sfc_u_t .- ice_sfc_u_t[1]; -v2 = atm_sum_u_t .- atm_sum_u_t[1]; -show_plots ? -Plots.png( - Plots.plot( - sol_ice.t, - [v1 v2 v1 + v2], - labels = ["ice" "atm" "tot"], - xlabel = "time (s)", - ylabel = "pseudo-energy (J / m2)", - ), - joinpath(path, "tc1_f2.png"), -) : nothing -# ![](images/tc1_f2.png) - -# - Conservation: relative error with time -total = atm_sum_u_t + ice_sfc_u_t; -rel_error = (total .- total[1]) / mean(total); -show_plots ? -Plots.png( - Plots.plot(sol_ice.t, rel_error, labels = ["tot"], xlabel = "time (s)", ylabel = "relative error"), - joinpath(path, "tc1_f3.png"), -) : nothing -# ![](images/tc1_f3.png) - -#src # - Animation -#src anim = Plots.@animate for u in sol_atm.u -#src Plots.plot(u.x[1], xlim=(220,280)) -#src end -#src Plots.mp4(anim, joinpath(path, "heat.mp4"), fps = 10) -#src -#src function linkfig(figpath, alt = "") -#src # buildkite-agent upload figpath -#src # link figure in logs if we are running on CI -#src if get(ENV, "BUILDKITE", "") == "true" -#src artifact_url = "artifact://$figpath" -#src print("\033]1338;url='$(artifact_url)';alt='$(alt)'\a\n") -#src end -#src end -#src -#src dirname = "heat" -#src linkfig("output/$(dirname)/heat_end.png", "Heat End Simulation") diff --git a/experiments/ClimaCore/sea_breeze/Manifest.toml b/experiments/ClimaCore/sea_breeze/Manifest.toml index ddc366622..396ab78e4 100644 --- a/experiments/ClimaCore/sea_breeze/Manifest.toml +++ b/experiments/ClimaCore/sea_breeze/Manifest.toml @@ -2,7 +2,7 @@ julia_version = "1.9.3" manifest_format = "2.0" -project_hash = "4aa4c869f9d982e7450ef4fd4b4c13c84420cf0d" +project_hash = "958db4ba0fe5b026c200104ff4c7954a607192d8" [[deps.ADTypes]] git-tree-sha1 = "5d2e21d7b0d8c22f67483ef95ebdc39c0e6b6003" @@ -87,9 +87,9 @@ version = "0.1.29" [[deps.ArrayLayouts]] deps = ["FillArrays", "LinearAlgebra"] -git-tree-sha1 = "0d61921af2799487b80453a44abb57db7a0c1381" +git-tree-sha1 = "9a731850434825d183af39c6e6cd0a1c32dd7e20" uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" -version = "1.4.1" +version = "1.4.2" weakdeps = ["SparseArrays"] [deps.ArrayLayouts.extensions] @@ -177,9 +177,9 @@ version = "0.1.2" [[deps.CLIMAParameters]] deps = ["DocStringExtensions", "TOML", "Test"] -git-tree-sha1 = "9872c4383d3c212096b2750bf1c2237a4670a3af" +git-tree-sha1 = "e1820c154d02ba381e9a91ea7a5870b282d32abc" uuid = "6eacf6c3-8458-43b9-ae03-caf5306d3d53" -version = "0.7.20" +version = "0.7.22" [[deps.CPUSummary]] deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] @@ -236,22 +236,22 @@ uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" version = "1.16.0" [[deps.ClimaAtmos]] -deps = ["ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "CLIMAParameters", "CUDA", "ClimaComms", "ClimaCore", "ClimaTimeSteppers", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "Distributions", "DocStringExtensions", "FastGaussQuadrature", "ImageFiltering", "Insolation", "Interpolations", "IntervalSets", "JLD2", "LambertW", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "OrdinaryDiffEq", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "TerminalLoggers", "Test", "Thermodynamics", "YAML"] -git-tree-sha1 = "fcb42f37a086e343b9e949261f2ec1cd4388cc5e" +deps = ["ArgParse", "ArtifactWrappers", "Artifacts", "AtmosphericProfilesLibrary", "CLIMAParameters", "CUDA", "ClimaComms", "ClimaCore", "ClimaTimeSteppers", "CloudMicrophysics", "Colors", "Dates", "Dierckx", "DiffEqBase", "DiffEqCallbacks", "Distributions", "DocStringExtensions", "FastGaussQuadrature", "ImageFiltering", "Insolation", "Interpolations", "IntervalSets", "JLD2", "Krylov", "LambertW", "LinearAlgebra", "Logging", "NCDatasets", "NVTX", "OrdinaryDiffEq", "Pkg", "Printf", "RRTMGP", "Random", "RootSolvers", "SciMLBase", "StaticArrays", "Statistics", "StatsBase", "SurfaceFluxes", "TerminalLoggers", "Test", "Thermodynamics", "YAML"] +git-tree-sha1 = "88db61f3c30d4e16bfe38e7844f818ab738b0bb5" uuid = "b2c96348-7fb7-4fe0-8da9-78d88439e717" -version = "0.16.0" +version = "0.16.2" [[deps.ClimaComms]] deps = ["CUDA", "MPI"] -git-tree-sha1 = "6cbe1b835f91033e6326a92ac1a1f6a8c9b2215f" +git-tree-sha1 = "88613e2098c9aaf134ac01a2139fac835661bd04" uuid = "3a4d1b5c-c61d-41fd-a00a-5873ba7a1b0d" -version = "0.5.3" +version = "0.5.5" [[deps.ClimaCore]] deps = ["Adapt", "BandedMatrices", "BlockArrays", "CUDA", "ClimaComms", "CubedSphere", "DataStructures", "DocStringExtensions", "ForwardDiff", "GaussQuadrature", "GilbertCurves", "HDF5", "InteractiveUtils", "IntervalSets", "LinearAlgebra", "PkgVersion", "RecursiveArrayTools", "Requires", "RootSolvers", "SparseArrays", "Static", "StaticArrays", "Statistics", "UnPack"] -git-tree-sha1 = "6841faabcaf23af38190e92abdb5eec3e6f8601d" +git-tree-sha1 = "c6f1342543def2fbb6d18ea910470a85411dda39" uuid = "d414da3d-4745-48bb-8d80-42e94e092884" -version = "0.10.50" +version = "0.10.52" [[deps.ClimaCoreTempestRemap]] deps = ["ClimaCore", "Dates", "LinearAlgebra", "NCDatasets", "PkgVersion", "TempestRemap_jll", "Test"] @@ -260,22 +260,22 @@ uuid = "d934ef94-cdd4-4710-83d6-720549644b70" version = "0.3.5" [[deps.ClimaCoupler]] -deps = ["CLIMAParameters", "ClimaAtmos", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "ClimaLSM", "Dates", "DocStringExtensions", "Insolation", "JLD2", "NCDatasets", "OrdinaryDiffEq", "Plots", "PrettyTables", "SciMLBase", "StaticArrays", "Statistics", "SurfaceFluxes", "TempestRemap_jll", "TerminalLoggers", "Thermodynamics", "UnPack"] +deps = ["CLIMAParameters", "ClimaAtmos", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "ClimaLSM", "Dates", "DocStringExtensions", "Insolation", "JLD2", "NCDatasets", "OrdinaryDiffEq", "Plots", "SciMLBase", "StaticArrays", "Statistics", "SurfaceFluxes", "TempestRemap_jll", "TerminalLoggers", "Thermodynamics", "UnPack"] path = "../../.." uuid = "4ade58fe-a8da-486c-bd89-46df092ec0c7" version = "0.1.0" [[deps.ClimaLSM]] -deps = ["ArtifactWrappers", "CFTime", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "Dates", "DiffEqCallbacks", "DocStringExtensions", "IntervalSets", "JLD2", "LinearAlgebra", "NCDatasets", "StaticArrays", "SurfaceFluxes", "Thermodynamics", "UnPack"] -git-tree-sha1 = "370d0b4511be7e9f6126f5c6c91f07db1a25e142" +deps = ["ArtifactWrappers", "CFTime", "ClimaComms", "ClimaCore", "ClimaCoreTempestRemap", "Dates", "DocStringExtensions", "IntervalSets", "JLD2", "LinearAlgebra", "NCDatasets", "SciMLBase", "StaticArrays", "SurfaceFluxes", "Thermodynamics", "UnPack"] +git-tree-sha1 = "82b641a85ce0847fbf5fc6a131dd38cf6e5b6761" uuid = "7884a58f-fab6-4fd0-82bb-ecfedb2d8430" -version = "0.3.2" +version = "0.3.3" [[deps.ClimaTimeSteppers]] -deps = ["CUDA", "ClimaComms", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "KernelAbstractions", "Krylov", "LinearAlgebra", "LinearOperators", "SciMLBase", "StaticArrays"] -git-tree-sha1 = "54b602435b0107b6c2dfe7664e0f7ff5fc78fb91" +deps = ["CUDA", "ClimaComms", "Colors", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "KernelAbstractions", "Krylov", "LinearAlgebra", "LinearOperators", "NVTX", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "0294e5f032a1d578094431082600e864eb8554cf" uuid = "595c0a79-7f3d-439a-bc5a-b232dc3bde79" -version = "0.7.7" +version = "0.7.14" [[deps.CloseOpenIntervals]] deps = ["Static", "StaticArrayInterface"] @@ -284,10 +284,10 @@ uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" version = "0.1.12" [[deps.CloudMicrophysics]] -deps = ["DocStringExtensions", "SpecialFunctions", "Thermodynamics"] -git-tree-sha1 = "8e98d1f3ffb1e2171bf472afcedfd77f74e85026" +deps = ["CLIMAParameters", "DocStringExtensions", "ForwardDiff", "KernelAbstractions", "RootSolvers", "SpecialFunctions", "Thermodynamics"] +git-tree-sha1 = "153238dfeb7bed07fa8f10c535d78e2340f3c882" uuid = "6a9e3e04-43cd-43ba-94b9-e8782df3c71b" -version = "0.10.3" +version = "0.14.0" [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] @@ -336,9 +336,9 @@ version = "0.3.0" [[deps.Compat]] deps = ["UUIDs"] -git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" +git-tree-sha1 = "8a62af3e248a8c4bad6b32cbbe663ae02275e32c" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.9.0" +version = "4.10.0" weakdeps = ["Dates", "LinearAlgebra"] [deps.Compat.extensions] @@ -354,6 +354,11 @@ git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" version = "0.3.2" +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + [[deps.ConcurrentUtilities]] deps = ["Serialization", "Sockets"] git-tree-sha1 = "5372dbbf8f0bdb8c700db5367132925c0771ef7e" @@ -466,9 +471,9 @@ version = "6.130.0" [[deps.DiffEqCallbacks]] deps = ["DataStructures", "DiffEqBase", "ForwardDiff", "Functors", "LinearAlgebra", "Markdown", "NLsolve", "Parameters", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] -git-tree-sha1 = "42424e81924d4f463c6f8db8ce2978d51ba0aeaf" +git-tree-sha1 = "acc53f895588767cbb296d3d8581ebd203524a2e" uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" -version = "2.30.0" +version = "2.33.0" [deps.DiffEqCallbacks.weakdeps] OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" @@ -488,12 +493,13 @@ version = "1.15.1" [[deps.Distances]] deps = ["LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "b6def76ffad15143924a2199f72a5cd883a2e8a9" +git-tree-sha1 = "5225c965635d8c21168e32a12954675e7bea1151" uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.9" -weakdeps = ["SparseArrays"] +version = "0.10.10" +weakdeps = ["ChainRulesCore", "SparseArrays"] [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" DistancesSparseArraysExt = "SparseArrays" [[deps.Distributed]] @@ -502,9 +508,9 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" [[deps.Distributions]] deps = ["FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns", "Test"] -git-tree-sha1 = "938fe2981db009f531b6332e31c58e9584a2f9bd" +git-tree-sha1 = "3d5873f811f582873bb9871fc9c451784d5dc8c7" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.100" +version = "0.25.102" [deps.Distributions.extensions] DistributionsChainRulesCoreExt = "ChainRulesCore" @@ -541,6 +547,12 @@ git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" version = "1.0.4" +[[deps.EnzymeCore]] +deps = ["Adapt"] +git-tree-sha1 = "3250001c57b9a3e18e1e5a257fb9ec2c012286c6" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.5.3" + [[deps.EpollShim_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" @@ -602,9 +614,9 @@ version = "3.3.10+0" [[deps.FastBroadcast]] deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] -git-tree-sha1 = "aa9925a229d45fe3018715238956766fa21804d1" +git-tree-sha1 = "9d77cb1caf03e67514ba60bcfc47c6e131b1950c" uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" -version = "0.2.6" +version = "0.2.7" [[deps.FastClosures]] git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" @@ -793,9 +805,9 @@ version = "1.3.14+0" [[deps.Graphs]] deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] -git-tree-sha1 = "1cf1d7dcb4bc32d7b4a5add4232db3750c27ecb4" +git-tree-sha1 = "899050ace26649433ef1af25bc17a815b3db52b7" uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" -version = "1.8.0" +version = "1.9.0" [[deps.Grisu]] git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" @@ -804,9 +816,9 @@ version = "1.0.2" [[deps.HDF5]] deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"] -git-tree-sha1 = "ec7df74b7b2022e8252a8bfd4ec23411491adc3b" +git-tree-sha1 = "26407bd1c60129062cec9da63dc7d08251544d53" uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f" -version = "0.17.0" +version = "0.17.1" weakdeps = ["MPI"] [deps.HDF5.extensions] @@ -866,9 +878,9 @@ uuid = "6a3955dd-da59-5b1f-98d4-e7296123deb5" version = "0.7.8" [[deps.Inflate]] -git-tree-sha1 = "5cd07aab533df5170988219191dfad0519391428" +git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.3" +version = "0.1.4" [[deps.Insolation]] deps = ["Artifacts", "Dates", "DelimitedFiles", "Interpolations"] @@ -914,9 +926,9 @@ version = "1.0.0" [[deps.JLD2]] deps = ["FileIO", "MacroTools", "Mmap", "OrderedCollections", "Pkg", "Printf", "Reexport", "Requires", "TranscodingStreams", "UUIDs"] -git-tree-sha1 = "773125c999b4ebfe31e679593c8af7f43f401f1c" +git-tree-sha1 = "c11d691a0dc8e90acfa4740d293ade57f68bfdbb" uuid = "033835bb-8acc-5ee8-8aae-3f567f8a3819" -version = "0.4.34" +version = "0.4.35" [[deps.JLFzf]] deps = ["Pipe", "REPL", "Random", "fzf_jll"] @@ -959,13 +971,11 @@ deps = ["Adapt", "Atomix", "InteractiveUtils", "LinearAlgebra", "MacroTools", "P git-tree-sha1 = "4c5875e4c228247e1c2b087669846941fb6e0118" uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" version = "0.9.8" +weakdeps = ["EnzymeCore"] [deps.KernelAbstractions.extensions] EnzymeExt = "EnzymeCore" - [deps.KernelAbstractions.weakdeps] - EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" - [[deps.Krylov]] deps = ["LinearAlgebra", "Printf", "SparseArrays"] git-tree-sha1 = "17e462054b42dcdda73e9a9ba0c67754170c88ae" @@ -992,15 +1002,15 @@ version = "3.0.0+1" [[deps.LLVM]] deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"] -git-tree-sha1 = "a9d2ce1d5007b1e8f6c5b89c5a31ff8bd146db5c" +git-tree-sha1 = "4ea2928a96acfcf8589e6cd1429eff2a3a82c366" uuid = "929cbde3-209d-540e-8aea-75f648917ca0" -version = "6.2.1" +version = "6.3.0" [[deps.LLVMExtra_jll]] deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl", "TOML"] -git-tree-sha1 = "7ca6850ae880cc99b59b88517545f91a52020afa" +git-tree-sha1 = "e7c01b69bcbcb93fd4cbc3d0fea7d229541e18d2" uuid = "dad2f222-ce93-54a1-a47d-0025e8a3acab" -version = "0.0.25+0" +version = "0.0.26+0" [[deps.LLVMOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -1147,26 +1157,30 @@ uuid = "5c8ed15e-5a4c-59e4-a42b-c7e8811fb125" version = "2.5.2" [[deps.LinearSolve]] -deps = ["ArrayInterface", "DocStringExtensions", "EnumX", "FastLapackInterface", "GPUArraysCore", "InteractiveUtils", "KLU", "Krylov", "Libdl", "LinearAlgebra", "PrecompileTools", "Preferences", "RecursiveFactorization", "Reexport", "Requires", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Sparspak", "SuiteSparse", "UnPack"] -git-tree-sha1 = "69cbd612e6e67ba2f8121bc8725bc9d04d803599" +deps = ["ArrayInterface", "ConcreteStructs", "DocStringExtensions", "EnumX", "EnzymeCore", "FastLapackInterface", "GPUArraysCore", "InteractiveUtils", "KLU", "Krylov", "Libdl", "LinearAlgebra", "MKL_jll", "PrecompileTools", "Preferences", "RecursiveFactorization", "Reexport", "Requires", "SciMLBase", "SciMLOperators", "Setfield", "SparseArrays", "Sparspak", "SuiteSparse", "UnPack"] +git-tree-sha1 = "435ab14ca589757a0feae6e3e347bc37addda42d" uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" -version = "2.5.1" +version = "2.9.2" [deps.LinearSolve.extensions] + LinearSolveBlockDiagonalsExt = "BlockDiagonals" LinearSolveCUDAExt = "CUDA" + LinearSolveEnzymeExt = "Enzyme" LinearSolveHYPREExt = "HYPRE" LinearSolveIterativeSolversExt = "IterativeSolvers" + LinearSolveKernelAbstractionsExt = "KernelAbstractions" LinearSolveKrylovKitExt = "KrylovKit" - LinearSolveMKLExt = "MKL_jll" LinearSolveMetalExt = "Metal" LinearSolvePardisoExt = "Pardiso" [deps.LinearSolve.weakdeps] + BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" - MKL_jll = "856f044c-d86e-5d09-b602-aeab76dc8ba7" Metal = "dde4c033-4e86-420c-a63e-0dd931031962" Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" @@ -1191,9 +1205,9 @@ uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" [[deps.LoggingExtras]] deps = ["Dates", "Logging"] -git-tree-sha1 = "0d097476b6c381ab7906460ef1ef1638fbce1d91" +git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.0.2" +version = "1.0.3" [[deps.LoopVectorization]] deps = ["ArrayInterface", "ArrayInterfaceCore", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] @@ -1282,9 +1296,9 @@ version = "0.3.2" [[deps.MicrosoftMPI_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "a8027af3d1743b3bfae34e54872359fdebb31422" +git-tree-sha1 = "a7023883872e52bc29bcaac74f19adf39347d2d5" uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf" -version = "10.1.3+4" +version = "10.1.4+0" [[deps.Missings]] deps = ["DataAPI"] @@ -1357,10 +1371,10 @@ uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" [[deps.NonlinearSolve]] -deps = ["ArrayInterface", "DiffEqBase", "EnumX", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "PrecompileTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseDiffTools", "StaticArraysCore", "UnPack"] -git-tree-sha1 = "ee53089df81a6bdf3c06c17cf674e90931b10a73" +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "EnumX", "FiniteDiff", "ForwardDiff", "LineSearches", "LinearAlgebra", "LinearSolve", "PrecompileTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SparseArrays", "SparseDiffTools", "StaticArraysCore", "UnPack"] +git-tree-sha1 = "445a7ba86794e1f8ee9da3b3b7becf284e2625fd" uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" -version = "1.10.0" +version = "2.1.0" [[deps.OffsetArrays]] deps = ["Adapt"] @@ -1392,9 +1406,9 @@ version = "0.8.1+0" [[deps.OpenMPI_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"] -git-tree-sha1 = "f3080f4212a8ba2ceb10a34b938601b862094314" +git-tree-sha1 = "e25c1778a98e34219a00455d6e4384e017ea9762" uuid = "fe0851c0-eecd-5654-98d4-656369965a5c" -version = "4.1.5+0" +version = "4.1.6+0" [[deps.OpenSSL]] deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] @@ -1427,9 +1441,9 @@ version = "1.6.2" [[deps.OrdinaryDiffEq]] deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "IfElse", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "LoopVectorization", "MacroTools", "MuladdMacro", "NLsolve", "NonlinearSolve", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLNLSolve", "SciMLOperators", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "SparseDiffTools", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] -git-tree-sha1 = "ba3ed480f991b846cf9a8118d3370d9752e7166d" +git-tree-sha1 = "def999a7447854f0e9ca9fdda235e04a65916b76" uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" -version = "6.55.0" +version = "6.58.0" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] @@ -1438,14 +1452,14 @@ version = "10.42.0+0" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "67eae2738d63117a196f497d7db789821bce61d1" +git-tree-sha1 = "fcf8fd477bd7f33cb8dbb1243653fb0d415c256c" uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.17" +version = "0.11.25" [[deps.PackageExtensionCompat]] -git-tree-sha1 = "f9b1e033c2b1205cf30fd119f4e50881316c1923" +git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" -version = "1.0.1" +version = "1.0.2" weakdeps = ["Requires", "TOML"] [[deps.PaddedViews]] @@ -1522,9 +1536,9 @@ version = "1.39.0" [[deps.Polyester]] deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] -git-tree-sha1 = "d4c9ebdc6528a4aaf7cfcf43b482e927267b400d" +git-tree-sha1 = "398f91235beaac50445557c937ecb0145d171842" uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" -version = "0.7.6" +version = "0.7.8" [[deps.PolyesterWeave]] deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] @@ -1586,9 +1600,9 @@ version = "6.5.2+2" [[deps.QuadGK]] deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "eeab25344bf9901146c0200a7ca64ea479f8bf5c" +git-tree-sha1 = "9ebcd48c498668c7fa0e97a9cae873fbee7bfee1" uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.9.0" +version = "2.9.1" [[deps.REPL]] deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] @@ -1596,9 +1610,9 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" [[deps.RRTMGP]] deps = ["Adapt", "CUDA", "ClimaComms", "DocStringExtensions", "GaussQuadrature", "Random", "StaticArrays"] -git-tree-sha1 = "87ddffcc9520b7d721a03e2755412d8d6b674d5f" +git-tree-sha1 = "52a01d4a1963925ec60c76413d8c557e153c5e5e" uuid = "a01a1ee8-cea4-48fc-987c-fc7878d79da1" -version = "0.9.1" +version = "0.9.2" [[deps.Random]] deps = ["SHA", "Serialization"] @@ -1640,9 +1654,9 @@ version = "0.6.12" [[deps.RecursiveArrayTools]] deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "IteratorInterfaceExtensions", "LinearAlgebra", "RecipesBase", "Requires", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "Tables"] -git-tree-sha1 = "d7087c013e8a496ff396bae843b1e16d9a30ede8" +git-tree-sha1 = "fa453b42ba1623bd2e70260bf44dac850a3430a7" uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" -version = "2.38.10" +version = "2.39.0" [deps.RecursiveArrayTools.extensions] RecursiveArrayToolsMeasurementsExt = "Measurements" @@ -1669,9 +1683,9 @@ version = "1.2.2" [[deps.RelocatableFolders]] deps = ["SHA", "Scratch"] -git-tree-sha1 = "90bc7a7c96410424509e4263e277e43250c05691" +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.0" +version = "1.0.1" [[deps.Requires]] deps = ["UUIDs"] @@ -1692,10 +1706,10 @@ uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" version = "0.4.0+0" [[deps.RootSolvers]] -deps = ["DocStringExtensions", "ForwardDiff"] -git-tree-sha1 = "9fb3462240d2898be5d4acf8925e47f70ec64d07" +deps = ["ForwardDiff"] +git-tree-sha1 = "833d9914e748ca9329b762a82ec912897975f8d8" uuid = "7181ea78-2dcb-4de3-ab41-2b8ab5a31e74" -version = "0.3.5" +version = "0.4.1" [[deps.RuntimeGeneratedFunctions]] deps = ["ExprTools", "SHA", "Serialization"] @@ -1732,9 +1746,9 @@ version = "1.98.1" [[deps.SciMLNLSolve]] deps = ["DiffEqBase", "LineSearches", "NLsolve", "Reexport", "SciMLBase"] -git-tree-sha1 = "9dfc8e9e3d58c0c74f1a821c762b5349da13eccf" +git-tree-sha1 = "765b788339abd7d983618c09cfc0192e2b6b15fd" uuid = "e9a6253c-8580-4d32-9898-8661bb511710" -version = "0.1.8" +version = "0.1.9" [[deps.SciMLOperators]] deps = ["ArrayInterface", "DocStringExtensions", "Lazy", "LinearAlgebra", "Setfield", "SparseArrays", "StaticArraysCore", "Tricks"] @@ -1774,9 +1788,9 @@ version = "1.1.0" [[deps.SimpleNonlinearSolve]] deps = ["ArrayInterface", "DiffEqBase", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "PackageExtensionCompat", "PrecompileTools", "Reexport", "SciMLBase", "StaticArraysCore"] -git-tree-sha1 = "20aa9831d654bab67ed561e78917047143ecb9bf" +git-tree-sha1 = "4d53b83af904049c493daaf2a225bcae994a3c59" uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" -version = "0.1.19" +version = "0.1.20" [deps.SimpleNonlinearSolve.extensions] SimpleNonlinearSolveNNlibExt = "NNlib" @@ -1815,10 +1829,10 @@ deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [[deps.SparseDiffTools]] -deps = ["ADTypes", "Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "PackageExtensionCompat", "Reexport", "SciMLOperators", "Setfield", "SparseArrays", "StaticArrayInterface", "StaticArrays", "Tricks", "UnPack", "VertexSafeGraphs"] -git-tree-sha1 = "42d131931906bf4f0af97a7113c8456d0a8aff9d" +deps = ["ADTypes", "Adapt", "ArrayInterface", "Compat", "DataStructures", "FiniteDiff", "ForwardDiff", "Graphs", "LinearAlgebra", "PackageExtensionCompat", "Random", "Reexport", "SciMLOperators", "Setfield", "SparseArrays", "StaticArrayInterface", "StaticArrays", "Tricks", "UnPack", "VertexSafeGraphs"] +git-tree-sha1 = "336fd944a1bbb8873bfa8171387608ca93317d68" uuid = "47a9eef4-7e08-11e9-0b38-333d64bd3804" -version = "2.6.0" +version = "2.8.0" [deps.SparseDiffTools.extensions] SparseDiffToolsEnzymeExt = "Enzyme" @@ -1871,9 +1885,9 @@ weakdeps = ["OffsetArrays", "StaticArrays"] [[deps.StaticArrays]] deps = ["LinearAlgebra", "Random", "StaticArraysCore"] -git-tree-sha1 = "51621cca8651d9e334a659443a74ce50a3b6dfab" +git-tree-sha1 = "0adf069a2a490c47273727e029371b31d44b72b2" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.6.3" +version = "1.6.5" weakdeps = ["Statistics"] [deps.StaticArrays.extensions] @@ -1897,9 +1911,9 @@ version = "1.7.0" [[deps.StatsBase]] deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "d1bf48bfcc554a3761a133fe3a9bb01488e06916" +git-tree-sha1 = "1d77abd07f617c4868c33d4f5b9e1dbb2643c9cf" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.33.21" +version = "0.34.2" [[deps.StatsFuns]] deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] @@ -1943,10 +1957,10 @@ uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" version = "5.10.1+6" [[deps.SurfaceFluxes]] -deps = ["DocStringExtensions", "KernelAbstractions", "RootSolvers", "StaticArrays", "Thermodynamics"] -git-tree-sha1 = "d6a2fc6e439c8cef9d0c04a0929090bb2218ba85" +deps = ["DocStringExtensions", "KernelAbstractions", "Logging", "RootSolvers", "StaticArrays", "Thermodynamics"] +git-tree-sha1 = "0f82dcffc203c9d4a8ea54cb0b05ec5730117744" uuid = "49b00bb7-8bd4-4f2b-b78c-51cd0450215f" -version = "0.6.3" +version = "0.7.2" [[deps.SymbolicIndexingInterface]] deps = ["DocStringExtensions"] @@ -2017,9 +2031,9 @@ version = "1.0.1" [[deps.Thermodynamics]] deps = ["DocStringExtensions", "KernelAbstractions", "Random", "RootSolvers"] -git-tree-sha1 = "dd055cd2ef16f8d373a7dc833f4ddf72165524c5" +git-tree-sha1 = "2de4b5ccc71baf3578959928c295a2fa13105db7" uuid = "b60c26fb-14c3-4610-9d3e-2d17fe7ff00c" -version = "0.10.2" +version = "0.11.2" [[deps.ThreadingUtilities]] deps = ["ManualMemory"] @@ -2052,9 +2066,9 @@ uuid = "d5829a12-d9aa-46ab-831f-fb7c9ab06edf" version = "0.1.19" [[deps.Tricks]] -git-tree-sha1 = "aadb748be58b492045b4f56166b5188aa63ce549" +git-tree-sha1 = "eae1bb484cd63b36999ee58be2de6c178105112f" uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" -version = "0.1.7" +version = "0.1.8" [[deps.TruncatedStacktraces]] deps = ["InteractiveUtils", "MacroTools", "Preferences"] @@ -2159,9 +2173,9 @@ version = "0.5.5" [[deps.XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "04a51d15436a572301b5abbb9d099713327e9fc4" +git-tree-sha1 = "24b81b59bd35b3c42ab84fa589086e19be919916" uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.10.4+0" +version = "2.11.5+0" [[deps.XSLT_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] diff --git a/experiments/ClimaCore/sea_breeze/Project.toml b/experiments/ClimaCore/sea_breeze/Project.toml index 0316adc15..a792ed7be 100644 --- a/experiments/ClimaCore/sea_breeze/Project.toml +++ b/experiments/ClimaCore/sea_breeze/Project.toml @@ -7,6 +7,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" @@ -16,3 +17,6 @@ UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" [extras] CPUSummary = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" + +[compat] +PrettyTables = "2" diff --git a/experiments/ClimaCore/sea_breeze/atmos_rhs.jl b/experiments/ClimaCore/sea_breeze/atmos_rhs.jl index 95c8748c8..b93181811 100644 --- a/experiments/ClimaCore/sea_breeze/atmos_rhs.jl +++ b/experiments/ClimaCore/sea_breeze/atmos_rhs.jl @@ -23,23 +23,23 @@ Total Energy (possibly replace potential temperature equation with total energy \frac{\partial \rho e_{tot}}{\partial t} + \nabla \cdot ((\rho e_{tot} + p )\vec{u}) = \nabla \cdot (\kappa \rho \nabla h_{tot}), ``` -where ``h_{tot}`` is the total specific enthalpy given by internal and potential energy contributions. +where ``h_{tot}`` is the total specific enthalpy given by internal and potential energy contributions. -Tracer transport: +Tracer transport: ```math \frac{\partial \rho \chi}{\partial t} + \nabla \cdot (\rho \chi \vec{u}) = \nabla \cdot (\kappa \rho \nabla \chi) + S(\chi, ...). ``` Diffusion (Constant Viscosity): -The simplest model to represent diffusive processes is a constant-viscosity model, with +The simplest model to represent diffusive processes is a constant-viscosity model, with prescribed kinematic viscosity ``\nu`` such that the stress tensor can be modelled by ```math \rho\tau = -2\rho\nu\nabla u. ``` Smagorinsky Closure: -The Smagorinsky closure is an eddy-viscosity model that captures the effect of energy -transfer to the smallest scales of motion in the flow. +The Smagorinsky closure is an eddy-viscosity model that captures the effect of energy +transfer to the smallest scales of motion in the flow. ```math \begin{aligned} \rho\tau &= -2\rho\nu\vec{S}, \\ @@ -50,14 +50,14 @@ transfer to the smallest scales of motion in the flow. with $\Delta_{x,y,z}$ the grid lengthscale (sometimes approximated as a geometric average ``\Delta = (\Delta_x\Delta_y\Delta_z)^{1/3}``), $\nu$ is a spatially varying kinematic viscosity -that depends on the local shear, ``\vec{S}`` the symmetric rate-of-strain tensor, -``\tau`` the diffusive momentum flux tensor. In stratified flows, we can apply a correction -to the eddy viscosity to account for buoyancy effects. Thermal diffusivities are related to the modelled eddy-viscosity +that depends on the local shear, ``\vec{S}`` the symmetric rate-of-strain tensor, +``\tau`` the diffusive momentum flux tensor. In stratified flows, we can apply a correction +to the eddy viscosity to account for buoyancy effects. Thermal diffusivities are related to the modelled eddy-viscosity through the turbulent Prandtl number which takes a typical value of ``Pr_{t}= 1/3`` such that ``\kappa_{2} = \nu/Pr_{t}``. -Tendencies for fourth-order hyperdiffusion are included in the `rhs!` construction, but the -coefficient ``\kappa_{4}`` is ``0`` in this demonstrative case. Hyperdiffusive -tendencies are typically included as a scale-selective diffusion mechanism for high-frequency noise +Tendencies for fourth-order hyperdiffusion are included in the `rhs!` construction, but the +coefficient ``\kappa_{4}`` is ``0`` in this demonstrative case. Hyperdiffusive +tendencies are typically included as a scale-selective diffusion mechanism for high-frequency noise (e.g. stabilization in GCMs). Consider components of the viscous stress tensor in three dimensions: @@ -78,7 +78,7 @@ Consider components of the viscous stress tensor in three dimensions: \end{aligned} ``` -Assume terms in the ``y``-direction are neglected (2-dimensional simplicfication). The contributions to the momentum equation are then given by: +Assume terms in the ``y``-direction are neglected (2-dimensional simplicfication). The contributions to the momentum equation are then given by: ```math \begin{aligned} (\rho u): \partial_{x} (\rho \tau_{xx}) + \partial_{z}(\rho\tau_{xz}) &= \partial_x \Big(2\nu \frac{\partial u}{\partial x}\Big) + \partial_z\Big(\nu \frac{\partial u}{\partial z}\Big) + \partial_z\Big(\nu \frac{\partial w}{\partial x}\Big), \\ @@ -113,6 +113,9 @@ global_logger(TerminalLogger()) using ClimaCoupler +# Load coupled simulation code +include("../CoupledSims/coupled_sim.jl") + ## set up function space function hvspace_2D(xlim = (-π, π), zlim = (0, 4π), helem = 20, velem = 20, npoly = 1) FT = Float64 @@ -321,11 +324,11 @@ end # ## Coupled Atmos Wrappers ## Atmos Simulation - later to live in ClimaAtmos -struct AtmosSimulation <: ClimaCoupler.AbstractAtmosSimulation +struct AtmosSim <: AbstractAtmosSim integrator::Any end -function AtmosSimulation(Y_init, t_start, dt, t_end, timestepper, p, saveat, callbacks = CallbackSet()) +function AtmosSim(Y_init, t_start, dt, t_end, timestepper, p, saveat, callbacks = CallbackSet()) atm_prob = ODEProblem(atm_rhs!, Y_init, (t_start, t_end), p) atm_integ = init( @@ -338,14 +341,14 @@ function AtmosSimulation(Y_init, t_start, dt, t_end, timestepper, p, saveat, cal callback = callbacks, ) - return AtmosSimulation(atm_integ) + return AtmosSim(atm_integ) end -function ClimaCoupler.coupler_push!(coupler::ClimaCoupler.CouplerState, atmos::AtmosSimulation) +function coupler_push!(coupler::CouplerState, atmos::AtmosSim) coupler_put!(coupler, :F_sfc, atmos.integrator.u.F_sfc, atmos) end -function ClimaCoupler.coupler_pull!(atmos::AtmosSimulation, coupler::ClimaCoupler.CouplerState) +function coupler_pull!(atmos::AtmosSim, coupler::CouplerState) ## reset flux accumulator atmos.integrator.u.F_sfc .= 0.0 # reset surface flux to be accumulated diff --git a/experiments/ClimaCore/sea_breeze/land_rhs.jl b/experiments/ClimaCore/sea_breeze/land_rhs.jl index 98cd15a0c..33f4891fe 100644 --- a/experiments/ClimaCore/sea_breeze/land_rhs.jl +++ b/experiments/ClimaCore/sea_breeze/land_rhs.jl @@ -1,5 +1,8 @@ # # Land Model +# Load coupled simulation code +include("../CoupledSims/coupled_sim.jl") + #= ## Slab Land ODE For our land component, we solve a simple slab land ODE: @@ -14,7 +17,7 @@ function lnd_rhs!(du, u, (parameters, F_accumulated), t) """ Slab layer equation d(T_lnd)/dt = - (F_accumulated + G) / (h_lnd * ρ_lnd * c_lnd) - where + where F_accumulated = F_integrated / Δt_coupler """ @unpack lnd_h, lnd_ρ, lnd_c = parameters @@ -59,21 +62,21 @@ end # ## Coupled Land Wrappers ## Land Simulation - later to live in ClimaLSM -struct LandSimulation <: ClimaCoupler.AbstractLandSimulation +struct LandSim <: AbstractLandSim integrator::Any end -function LandSimulation(Y_init, t_start, dt, t_end, timestepper, p, saveat, callbacks = CallbackSet()) +function LandSim(Y_init, t_start, dt, t_end, timestepper, p, saveat, callbacks = CallbackSet()) lnd_prob = ODEProblem(lnd_rhs!, Y_init, (t_start, t_end), p) lnd_integ = init(lnd_prob, timestepper, dt = dt, saveat = saveat, callback = callbacks) - return LandSimulation(lnd_integ) + return LandSim(lnd_integ) end -function ClimaCoupler.coupler_push!(coupler::ClimaCoupler.CouplerState, land::LandSimulation) +function coupler_push!(coupler::CouplerState, land::LandSim) coupler_put!(coupler, :T_sfc_land, land.integrator.u.T_sfc, land) end -function ClimaCoupler.coupler_pull!(land::LandSimulation, coupler::ClimaCoupler.CouplerState) +function coupler_pull!(land::LandSim, coupler::CouplerState) coupler_get!(land.integrator.p.F_sfc, coupler, :F_sfc, land) land.integrator.p.F_sfc ./= coupler.Δt_coupled end diff --git a/experiments/ClimaCore/sea_breeze/ocean_rhs.jl b/experiments/ClimaCore/sea_breeze/ocean_rhs.jl index 8d51d1eb0..14c8accf3 100644 --- a/experiments/ClimaCore/sea_breeze/ocean_rhs.jl +++ b/experiments/ClimaCore/sea_breeze/ocean_rhs.jl @@ -1,5 +1,8 @@ # # Ocean Model +# Load coupled simulation code +include("../CoupledSims/coupled_sim.jl") + #= ## Slab Ocean ODE For our ocean component, we solve a simple slab ocean ODE just as we did for the land: @@ -14,7 +17,7 @@ function ocn_rhs!(du, u, (parameters, F_accumulated), t) """ Slab layer equation d(T_sfc)/dt = - (F_accumulated) / (h_ocn * ρ_ocn * c_ocn) - where + where F_accumulated = F_integrated / Δt_coupler """ @unpack ocn_h, ocn_ρ, ocn_c = parameters @@ -59,21 +62,21 @@ end # ## Coupled Ocean Wrappers ## Ocean Simulation - Later to live in Oceananigans -struct OceanSimulation <: ClimaCoupler.AbstractOceanSimulation +struct OceanSim <: AbstractOceanSim integrator::Any end -function OceanSimulation(Y_init, t_start, dt, t_end, timestepper, p, saveat, callbacks = CallbackSet()) +function OceanSim(Y_init, t_start, dt, t_end, timestepper, p, saveat, callbacks = CallbackSet()) ocn_prob = ODEProblem(ocn_rhs!, Y_init, (t_start, t_end), p) ocn_integ = init(ocn_prob, timestepper, dt = dt, saveat = saveat, callback = callbacks) - return OceanSimulation(ocn_integ) + return OceanSim(ocn_integ) end -function ClimaCoupler.coupler_push!(coupler::ClimaCoupler.CouplerState, ocean::OceanSimulation) +function coupler_push!(coupler::CouplerState, ocean::OceanSim) coupler_put!(coupler, :T_sfc_ocean, ocean.integrator.u.T_sfc, ocean) end -function ClimaCoupler.coupler_pull!(ocean::OceanSimulation, coupler::ClimaCoupler.CouplerState) +function coupler_pull!(ocean::OceanSim, coupler::CouplerState) coupler_get!(ocean.integrator.p.F_sfc, coupler, :F_sfc, ocean) ocean.integrator.p.F_sfc ./= coupler.Δt_coupled end diff --git a/experiments/ClimaCore/sea_breeze/run.jl b/experiments/ClimaCore/sea_breeze/run.jl index 8d6a77ca2..f2e889691 100644 --- a/experiments/ClimaCore/sea_breeze/run.jl +++ b/experiments/ClimaCore/sea_breeze/run.jl @@ -13,8 +13,11 @@ In this tutorial we demonstrate the coupling of three component models of the ClimaCoupler interface are used and discussed. =# +# Load utilities for running coupled simulation +include("../CoupledSims/coupled_sim.jl") + import SciMLBase: step! #hide -using OrdinaryDiffEq: ODEProblem, solve, SSPRK33, savevalues! #hide +using OrdinaryDiffEq: ODEProblem, SSPRK33, savevalues! #hide import ClimaCore.Utilities: PlusHalf #hide import ClimaCore.Spaces as Spaces using DiffEqCallbacks #hide @@ -157,31 +160,26 @@ lnd_F_sfc = Fields.zeros(lnd_domain) #= ## Simulations -Each component is wrapped as a `Simulation`, which contains both the model (tendency) -and the time-stepping information (solver, step size, etc). Simulations are the standard +Each component is wrapped as a `Sim`, which contains both the model (tendency) +and the time-stepping information (solver, step size, etc). Sims are the standard structures that the coupler works with, enabling dispatch of coupler methods. -Here, we create three simulations: `AtmosSimulation`, `OceanSimulation`, and `LandSimulation`. +Here, we create three simulations: `AtmosSim`, `OceanSim`, and `LandSim`. =# atm_Y = Fields.FieldVector(Yc = atm_Y_default.Yc, ρw = atm_Y_default.ρw, F_sfc = atm_F_sfc) atm_p = (cpl_p = cpl_parameters, T_sfc = atm_T_sfc, bc = atm_bc) -atmos = AtmosSimulation(atm_Y, t_start, Δt_coupled / atm_nsteps, t_end, SSPRK33(), atm_p, saveat, dss_callback) +atmos = AtmosSim(atm_Y, t_start, Δt_coupled / atm_nsteps, t_end, SSPRK33(), atm_p, saveat, dss_callback) ocn_Y = Fields.FieldVector(T_sfc = ocn_Y_default.T_sfc) ocn_p = (cpl_parameters, F_sfc = ocn_F_sfc) -ocean = OceanSimulation(ocn_Y, t_start, Δt_coupled / ocn_nsteps, t_end, SSPRK33(), ocn_p, saveat) +ocean = OceanSim(ocn_Y, t_start, Δt_coupled / ocn_nsteps, t_end, SSPRK33(), ocn_p, saveat) lnd_Y = Fields.FieldVector(T_sfc = lnd_Y_default.T_sfc) lnd_p = (cpl_parameters, F_sfc = lnd_F_sfc) -land = LandSimulation(lnd_Y, t_start, Δt_coupled / lnd_nsteps, t_end, SSPRK33(), lnd_p, saveat) +land = LandSim(lnd_Y, t_start, Δt_coupled / lnd_nsteps, t_end, SSPRK33(), lnd_p, saveat) # Additionally, we create a coupled simulation that contains the component simulations # and the coupled time-stepping information. -struct AOLCoupledSimulation{ - A <: AtmosSimulation, - O <: OceanSimulation, - L <: LandSimulation, - C <: ClimaCoupler.CouplerState, -} <: ClimaCoupler.AbstractCoupledSimulation +struct AOLCoupledSim{A <: AtmosSim, O <: OceanSim, L <: LandSim, C <: CouplerState} <: AbstractCoupledSim ## Atmosphere Simulation atmos::A ## Ocean Simulation @@ -193,15 +191,15 @@ struct AOLCoupledSimulation{ end #= -`step!` is a key method within the Simulations interface. It advances a simulation +`step!` is a key method within the Sims interface. It advances a simulation to the specified `t_stop`, with that simulation advancing by its own internal step size to reach the specified time. Each simulation type should specify its own step method, allowing components to have different time integration backends. Here, all components are using OrdinaryDiffEq integrators and can share the same `step!` method. =# -function step!(sim::ClimaCoupler.AbstractSimulation, t_stop) +function step!(sim::AbstractSim, t_stop) Δt = t_stop - sim.integrator.t - step!(sim.integrator, Δt, true) + SciMLBase.step!(sim.integrator) end #= @@ -217,7 +215,7 @@ methods and can be updated via the `coupler_put!` methods. Similarly, the `coupler_add_map!` method registers remapping operators in the coupler. To provide automatic remapping, there is a strict name convention for remap operators: a map -from SimulationA to SimulationB (where `ClimaCoupler.name` returns `:simA` and `:simB`, +from SimA to SimB (where `ClimaCoupler.name` returns `:simA` and `:simB`, respectively) must be named `simA_to_simB` so that the correct operator can be used. Here, the models are coupled through heat transfer at the surface. This heat flux is @@ -239,7 +237,7 @@ for (name, map) in pairs(maps) coupler_add_map!(coupler, name, map) end -sim = AOLCoupledSimulation(atmos, ocean, land, coupler) +sim = AOLCoupledSim(atmos, ocean, land, coupler) #= @@ -265,7 +263,7 @@ coupling time step, $$F_{integ} = \int_{\Delta t_{coupler}} F_{sfc} dt$$ where $F_{integ}$ has units of $J m^{-2}$. =# -function cpl_run(simulation::AOLCoupledSimulation) +function cpl_run(simulation::AOLCoupledSim) @info "Run model" @unpack atmos, ocean, land, coupler = simulation Δt_coupled = coupler.Δt_coupled diff --git a/experiments/ClimaCore/tc1_heat-diffusion-with-slab/run.jl b/experiments/ClimaCore/tc1_heat-diffusion-with-slab/run.jl index f5bdb50ad..8c79e41b6 100644 --- a/experiments/ClimaCore/tc1_heat-diffusion-with-slab/run.jl +++ b/experiments/ClimaCore/tc1_heat-diffusion-with-slab/run.jl @@ -1,12 +1,12 @@ # # Heat Equation + Slab Tutorial # In this tutorial, we demonstrate simple sequential coupling -# of two PDE models using the `ClimaCore.jl` backends. +# of two PDE models using the `ClimaCore.jl` backends. # # Model 1 # Model 1 represents a simplified atmosphere (atm) # and solves the [heat -# equation](https://en.wikipedia.org/wiki/Heat_equation) +# equation](https://en.wikipedia.org/wiki/Heat_equation) # in a one-column domain: # `` @@ -16,7 +16,7 @@ # with top and bottom boundary conditions set to fixed-temperature (non-zero Dirichlet) and fixed-flux (non-zero Neumann) conditions, respectively: # `` -# T_{top} = 280 K, \,\,\,\,\,\,\, \frac{∂ T_{bottom}}{∂ t} = - ∇ F_{sfc} +# T_{top} = 280 K, \,\,\,\,\,\,\, \frac{∂ T_{bottom}}{∂ t} = - ∇ F_{sfc} # `` # where @@ -32,7 +32,7 @@ # \frac{dT_{sfc}}{dt} = - (F_{accumulated} + G ) / h_{lnd} # `` -# where +# where # `` # F_{accumulated} = {F_{integrated}} / Δt_{coupler} @@ -47,11 +47,11 @@ # # Coupling and Flux Calculation -# We use this Model 1 (usually this is done by the model with the shortest timestep) +# We use this Model 1 (usually this is done by the model with the shortest timestep) # to calculate and accumulate the downward surface fluxes, `F_sfc`: # `` -# F_{sfc} = - λ (T_{sfc} - T1) +# F_{sfc} = - λ (T_{sfc} - T1) # `` # `` @@ -62,16 +62,16 @@ # - `T1` is the atm temperature near the surface (here assumed equal to the first model level) # - `λ` a constant relaxation timescale -# Note that in a more realistic setup the above equations would be weighted by their domains' densities and thermal heat capacities, so that the thermal flux would have the units of W m$^{-2}$. +# Note that in a more realistic setup the above equations would be weighted by their domains' densities and thermal heat capacities, so that the thermal flux would have the units of W m$^{-2}$. # Here we assume these are unity for both domains. # Sequential coupling has the following steps: # 1) pre-Model 1: supply Model 1 with `T_sfc` for the `F_sfc` calculation; reset `F_integrated` to zero # 2) run Model 1: step forward for all Model 1 timesteps within one coupling cycle using `F_sfc` as the bottom boundary condition; accumulate `F_integrated` at each (sub-)step -# 3) post-Model 1: pass `F_integrated` into coupler and convert to `F_accumulated` for the correct units. -# 4) pre-Model 2: supply Model 2 with `F_accumulated` +# 3) post-Model 1: pass `F_integrated` into coupler and convert to `F_accumulated` for the correct units. +# 4) pre-Model 2: supply Model 2 with `F_accumulated` # 5) run Model 2: step forward for all Model 2 timesteps within one coupling cycle; -# 6) post-Model 2: state variable, `T_sfc` of Model 2 into coupler. +# 6) post-Model 2: state variable, `T_sfc` of Model 2 into coupler. # 7) repeat steps 1-6 for all coupling timesteps. # # Implementation @@ -98,6 +98,9 @@ using OrdinaryDiffEq using Statistics +# Load utilities for coupling +include("../CoupledSims/coupled_sim.jl") + #src ## Setup Logging Information global_logger(TerminalLogger()) #src const CI = !isnothing(get(ENV, "CI", nothing)) #src @@ -109,17 +112,17 @@ const FT = Float64; # - Experiment-specific Parameters parameters = ( ## atmos parameters - zmin_atm = FT(0.0), # height of atm stack bottom [m] + zmin_atm = FT(0.0), # height of atm stack bottom [m] zmax_atm = FT(1.0), # height of atm stack top [m] - n = 15, # number of elements in atm stack + n = 15, # number of elements in atm stack μ = FT(0.0001), # diffusion coefficient [m^2 / s] T_top = FT(280.0), # fixed temperature at the top of the domain_atm [K] T_atm_ini = FT(280.0), # initial condition of at temperature (isothermal) [K] ## slab parameters - h_lnd = FT(0.5), # depth of slab layer [m] + h_lnd = FT(0.5), # depth of slab layer [m] T_lnd_ini = FT(260.0), # initial condition of at temperature (isothermal) [K] - ## coupling parameters - λ = FT(1e-5), # transfer coefficient + ## coupling parameters + λ = FT(1e-5), # transfer coefficient ) @@ -136,7 +139,7 @@ Heat diffusion equation dT/dt = - ∇ F_sfc at z = zmin_atm We also use this model to calculate and accumulate the downward surface fluxes, F_sfc: - F_sfc = - λ * (T_sfc - T1) + F_sfc = - λ * (T_sfc - T1) d(F_integrated)/dt = F_sfc where F_integrated is reset to 0 at the beginning of each coupling cycle @@ -160,10 +163,10 @@ end # - Model 2 (lnd) Equations """ ∑tendencies_lnd!(dT_sfc, T_sfc, (parameters, F_accumulated), t) - + Slab layer equation lnd d(T_sfc)/dt = - (F_accumulated + G) / h_lnd - where + where F_accumulated = F_integrated / Δt_coupler """ function ∑tendencies_lnd!(dT_sfc, T_sfc, (parameters, F_accumulated), t) @@ -174,8 +177,8 @@ end # - Surface Flux Calculation (coarse bulk formula) calculate_flux(T_sfc, T1, parameters) = -parameters.λ * (T_sfc - T1); -# - Coupler Communication Functions -# These functions export / import / transform variables +# - Coupler Communication Functions +# These functions export / import / transform variables # These functions are now just place holders for coupler transformations (e.g. regridding, masking, etc) coupler_get_(x) = x; coupler_put_(x) = x; diff --git a/experiments/ClimaCore/tc2_ekman-column-with-slab/run.jl b/experiments/ClimaCore/tc2_ekman-column-with-slab/run.jl index 15f050995..7c2e744d3 100644 --- a/experiments/ClimaCore/tc2_ekman-column-with-slab/run.jl +++ b/experiments/ClimaCore/tc2_ekman-column-with-slab/run.jl @@ -26,7 +26,10 @@ const CI = !isnothing(get(ENV, "CI", nothing)) # general parameters const FT = Float64 -include("dummy_surface_fluxes.jl") # placeholder for SurfaceFluxes.jl +# Load utilities for coupling +include("../CoupledSims/coupled_sim.jl") +# Placeholder for SurfaceFluxes.jl +include("dummy_surface_fluxes.jl") ######## @@ -34,12 +37,12 @@ include("dummy_surface_fluxes.jl") # placeholder for SurfaceFluxes.jl ######## parameters = ( - # timestepping parameters + # timestepping parameters Δt_min = 0.02, # minimum model timestep [s] timerange = (0.0, 100.0), # start time and end time [s] odesolver = SSPRK33(), # timestepping method from DifferentialEquations.jl (used in both models here) - nsteps_atm = 1, # no. time steps of atm before coupling - nsteps_lnd = 1, # no. time steps of lnd before coupling + nsteps_atm = 1, # no. time steps of atm before coupling + nsteps_lnd = 1, # no. time steps of lnd before coupling saveat = 0.2, # interval at which to save diagnostics [s] # atmos domain @@ -254,7 +257,7 @@ function coupler_solve!(stepping, ics, parameters) # post land # coupler_put_land!(land_simulation, coupler) - # 1) store required land state (e.g., temperature) in the coupler + # 1) store required land state (e.g., temperature) in the coupler coupler_T_lnd .= coupler_put(integ_lnd.u) # update T_sfc end @@ -330,9 +333,9 @@ linkfig("output/$(dirname)/heat_end.png", "Heat End Simulation") # TODO here # - integrate ClimaCoupler.jl -# - revamp for 2D +# - revamp for 2D # - integrate SurfaceFluxes.jl -# - revamp for 2D +# - revamp for 2D # Questions / Comments -# +# diff --git a/src/ClimaCoupler.jl b/src/ClimaCoupler.jl index bcd40ca48..c4fb6d61d 100644 --- a/src/ClimaCoupler.jl +++ b/src/ClimaCoupler.jl @@ -6,9 +6,6 @@ Module for atmos-ocean-land coupled simulations. module ClimaCoupler include("Interfacer.jl") -include("CoupledSimulations/clock.jl") -include("CoupledSimulations/coupled_simulation.jl") -include("CouplerState/coupler_state.jl") include("../test/TestHelper.jl") include("Utilities.jl") include("TimeManager.jl") diff --git a/src/CoupledSimulations/clock.jl b/src/CoupledSimulations/clock.jl deleted file mode 100644 index 22f7cdc36..000000000 --- a/src/CoupledSimulations/clock.jl +++ /dev/null @@ -1,14 +0,0 @@ -""" - Clock{T} - -Manages a simulation's time information. -""" -mutable struct Clock{T} - time::T # current simulation time - dt::T # simulation timestep - stop_time::T # simulation end time -end - -tick!(clock::Clock) = (clock.time += clock.dt) - -stop_time_exceeded(clock::Clock) = (clock.time >= clock.stop_time) diff --git a/src/CoupledSimulations/coupled_simulation.jl b/src/CoupledSimulations/coupled_simulation.jl deleted file mode 100644 index c27a1bfb5..000000000 --- a/src/CoupledSimulations/coupled_simulation.jl +++ /dev/null @@ -1,64 +0,0 @@ -export CoupledSimulation, step!, run!, name - -""" - AbstractSimulation - -An abstract type representing a model simulation. -""" -abstract type AbstractSimulation end - -abstract type AbstractAtmosSimulation <: AbstractSimulation end -name(::AbstractAtmosSimulation) = :atmos - -abstract type AbstractOceanSimulation <: AbstractSimulation end -name(::AbstractOceanSimulation) = :ocean - -abstract type AbstractLandSimulation <: AbstractSimulation end -name(::AbstractLandSimulation) = :land - -abstract type AbstractCoupledSimulation <: AbstractSimulation end -name(::AbstractCoupledSimulation) = :coupled - -""" - CoupledSimulation - -A subtype of the abstract type `AbstractCoupledSimulation` representing a model simulation. -""" -struct CoupledSimulation{CS, S, CPL, L, C} <: AbstractCoupledSimulation - "The coupled time-stepping scheme" - coupler_solver::CS - "The component simulations" - simulations::S - "The coupler" - coupler::CPL - "Diagnostic logger" - logger::L - "Clock" - clock::C -end - -""" - run!(::CoupledSimulation) - -A simple outer timestepping loop for coupled system runs. - -This will be formalized when the `run!` functionality for component -models is implemented so to have a consistent interface. -""" -function run!(sim::CoupledSimulation) - clock = sim.clock - while !stop_time_exceeded(clock) - step!(sim, clock.dt) - tick!(clock) - end -end - -""" - step!(sim, dt) - -Advances a simulation `sim` by `dt`. - -Note that `dt` is not necessarily the simulation's timestep length; -a simuation could take several shorter steps that total to `dt`. -""" -function step!(sim::AbstractSimulation, dt) end diff --git a/test/CoupledSimulations/clock.jl b/test/CoupledSimulations/clock.jl deleted file mode 100644 index 163232fd0..000000000 --- a/test/CoupledSimulations/clock.jl +++ /dev/null @@ -1,14 +0,0 @@ -using Test -using ClimaCoupler: Clock, tick!, stop_time_exceeded - -@testset "Clock" begin - time_info = (start = 0.0, dt = 0.5, stop = 2.0) - clock = Clock(time_info...) - - tick!(clock) - @test clock.time == time_info.dt - while !stop_time_exceeded(clock) - tick!(clock) - end - @test clock.time == time_info.stop -end diff --git a/test/CoupledSimulations/cplsolver.jl b/test/CoupledSimulations/cplsolver.jl deleted file mode 100644 index e50480b21..000000000 --- a/test/CoupledSimulations/cplsolver.jl +++ /dev/null @@ -1,156 +0,0 @@ -using Test -using ClimaCoupler -using ClimateMachine.GenericCallbacks, ClimateMachine.ODESolvers -using Dates, Unitful, LinearAlgebra - -#= Coupled Oscillators -https://scholar.harvard.edu/files/schwartz/files/lecture3-coupled-oscillators.pdf - -Two coupled oscillators start from rest but with at least -one perturbed from equilibrium (hence, motion). In our simulation set up, -each individual mass is only aware of its own position, not that of the -other. Through the coupler, the force each mass exerts on the other is passed -to the other mass. A coupler is certainly not necessary to solve the problem, -we could set up a simple matrix system and also have an analytical solution, -however this is a good demonstration of the spectrum of coupling set ups: -from tight monolithic coupling (matrix system) to the black box (our coupler). - -| k κ k | -|~~~◯~~~◯~~~| -| m m | -| 1 2 | - -F11 = -kx1 - κx1 -F21 = κx2 -F11 + F21 = m x1'' - -F22 = -kx2 - κx2 -F12 = κx1 -F22 + F12 = m x2'' - -dx/dt = v; dv/dt = a = F/m -=# -@testset "Coupled Timestepping" begin - FT = Float64 - - function exact_sol(t, k, κ, m, x1_0, x2_0) - ωs, ωf = sqrt(k / m), sqrt((k + 2κ) / m) - As, Af = x1_0 + x2_0, x1_0 - x2_0 - x1 = 0.5 * (As * cos.(ωs .* t) + Af * cos.(ωf .* t)) - x2 = 0.5 * (As * cos.(ωs .* t) - Af * cos.(ωf .* t)) - return x1, x2 - end - - mutable struct RecordState - u::Vector{Any} - counter::Int - end - RecordState() = RecordState(Any[], 0) - - rs1, rs2 = RecordState(), RecordState() - - mutable struct SpringRHS{T} - v::T - F_in::T - end - - function (f!::SpringRHS)(du, u, p, t, args...; increment = false) - f!.v .= u[1] - du[1] = u[2] .+ increment * du[1] # u[1] is position - du[2] = (-(p.k + p.κ) * f!.v[1] + f!.F_in[1]) / p.m .+ increment * du[2] # u[2] is velocity - end - - p = (k = FT(4), κ = FT(2), m = FT(1)) - cdt = FT(0.01) - endtime = 20 - t = 0.0:(cdt * 10):endtime - nsteps1, nsteps2 = 2, 3 - - timestepper(f, state, nsteps) = LSRK54CarpenterKennedy(f, state, dt = cdt / nsteps, t0 = 0.0) - - function main(::Type{FT}) where {FT} - x1, x2 = [FT(1), FT(0)], [FT(0), FT(0)] # initial position & velocity - f1! = SpringRHS([FT(0)], [FT(0)]) - f2! = SpringRHS([FT(0)], [FT(0)]) - - # cb1, cb2: record total iterations for each model - cb1 = EveryXSimulationSteps(1) do - rs1.counter += 1 - end - cb2 = EveryXSimulationSteps(1) do - rs2.counter += 1 - end - - mass1 = CplModel(nothing, f1!, nothing, x1, timestepper(f1!, x1, nsteps1), nsteps1, cb1) - mass2 = CplModel(nothing, f2!, nothing, x2, timestepper(f2!, x2, nsteps2), nsteps2, cb2) - - coupler = CplState() - coupler_register!(coupler, :F12, [p.κ * x1[1]], nothing, DateTime(0), u"N") - coupler_register!(coupler, :F21, [p.κ * x2[1]], nothing, DateTime(0), u"N") - - comp1 = (pre_step = prestep1, component_model = mass1, post_step = poststep1) - comp2 = (pre_step = prestep2, component_model = mass2, post_step = poststep2) - components = (mass1 = comp1, mass2 = comp2) - cpl_solver = CplSolver(component_list = components, coupler = coupler, coupling_dt = cdt, t0 = 0.0) - - # set up coupler callbacks - # cb3, cb4: record state info with time. - push!(rs1.u, deepcopy(mass1.state[1])) - cb3 = EveryXSimulationSteps(10) do - push!(rs1.u, deepcopy(mass1.state[1])) - end - push!(rs2.u, deepcopy(mass2.state[1])) - cb4 = EveryXSimulationSteps(10) do - push!(rs2.u, deepcopy(mass2.state[1])) - end - cbvector = (cb3, cb4) - - return cpl_solver, cbvector - end - - # presteps: recv force from other mass - function prestep1(csolver) - mass1 = csolver.component_list.mass1.component_model - mass1.discretization.F_in .= coupler_get(csolver.coupler, :F21, nothing, DateTime(0), u"N") - end - - function prestep2(csolver) - mass2 = csolver.component_list.mass2.component_model - mass2.discretization.F_in .= coupler_get(csolver.coupler, :F12, nothing, DateTime(0), u"N") - end - - # poststeps: send force upon other mass - function poststep1(csolver) - mass1 = csolver.component_list.mass1.component_model - coupler_put!(csolver.coupler, :F12, p.κ * mass1.state[1], nothing, DateTime(0), u"N") - end - - function poststep2(csolver) - mass2 = csolver.component_list.mass2.component_model - coupler_put!(csolver.coupler, :F21, p.κ * mass2.state[1], nothing, DateTime(0), u"N") - end - - function run(cpl_solver, params, numberofsteps, cbvector) - solve!(nothing, cpl_solver, params; numberofsteps = numberofsteps, callbacks = cbvector) - end - - simulation, cbvector = main(FT) - nsteps = Int(endtime / cdt) - run(simulation, p, nsteps, cbvector) - - # subiteration execution - @test rs2.counter == (nsteps2 / nsteps1) * rs1.counter - # we solve the problem well enough (toggle plots on to check) - @test norm(exact_sol(t, p..., 1.0, 0.0)[1] .- rs1.u) <= 1e-1 - @test norm(exact_sol(t, p..., 1.0, 0.0)[2] .- rs2.u) <= 1e-1 -end - -# Quality Assurance Plotting -# using Plots -# p1 = plot(t, exact_sol(t, p..., 1.0, 0.0)[1], label="exact", -# xlabel="t", ylabel="x1", title="mass 1") -# plot!(t, rs1.u, label="sim", ls=:dash) -# p2 = plot(t, exact_sol(t, p..., 1.0, 0.0)[2], label="exact", -# xlabel="t", ylabel="x2", title="mass 2") -# plot!(t, rs2.u, label="sim", ls=:dash) -# plot(p1, p2, layout = (2, 1), legend = true, lw=3) diff --git a/test/Project.toml b/test/Project.toml index db548cf05..acd91714f 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -19,6 +19,7 @@ MPIPreferences = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267" NCDatasets = "85f8d34a-cbdd-5861-8df4-14fed0d494ab" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" @@ -37,6 +38,7 @@ IntervalSets = "0.5, 0.6, 0.7" MPI = "0.20" NCDatasets = "0.11, 0.12" Pkg = "1" +PrettyTables = "2" StaticArrays = "1" Unitful = "1" julia = "1.8" diff --git a/test/CouplerState/cplstate_interface.jl b/test/experiment_tests/coupled_sims.jl similarity index 80% rename from test/CouplerState/cplstate_interface.jl rename to test/experiment_tests/coupled_sims.jl index 02f9ba235..3c77d1c6c 100644 --- a/test/CouplerState/cplstate_interface.jl +++ b/test/experiment_tests/coupled_sims.jl @@ -4,15 +4,31 @@ using ClimaCoupler, Dates, Unitful using IntervalSets using ClimaCore: Domains, Meshes, Geometry, Topologies, Spaces, Fields, Operators -struct SimulationA{T} <: ClimaCoupler.AbstractSimulation +# Load file to test +include("../../experiments/ClimaCore/CoupledSims/coupled_sim.jl") + +@testset "Clock" begin + time_info = (start = 0.0, dt = 0.5, stop = 2.0) + clock = Clock(time_info...) + + tick!(clock) + @test clock.time == time_info.dt + while !stop_time_exceeded(clock) + tick!(clock) + end + @test clock.time == time_info.stop +end + + +struct SimA{T} <: AbstractSim data::T end -ClimaCoupler.name(::SimulationA) = :simA +name(::SimA) = :simA -struct SimulationB{T} <: ClimaCoupler.AbstractSimulation +struct SimB{T} <: AbstractSim data::T end -ClimaCoupler.name(::SimulationB) = :simB +name(::SimB) = :simB function spectral_space_2D(; n1 = 1, n2 = 1, Nij = 4) domain = Domains.RectangleDomain( @@ -36,8 +52,8 @@ end spaceA = spectral_space_2D() spaceB = spectral_space_2D(n1 = 2, n2 = 2) - simA = SimulationA(ones(spaceA)) - simB = SimulationB(zeros(spaceB)) + simA = SimA(ones(spaceA)) + simB = SimB(zeros(spaceB)) coupler = CouplerState(1.0) coupler_add_field!(coupler, :test1, simA.data; write_sim = simA) @@ -51,7 +67,7 @@ end @test simA.data === coupler_get(coupler, :test1) # test remapping - @test map === ClimaCoupler.get_remap_operator(coupler, ClimaCoupler.name(simB), ClimaCoupler.name(simA)) + @test map === get_remap_operator(coupler, name(simB), name(simA)) @test ones(spaceB) ≈ coupler_get(coupler, :test1, simB) target_field = zeros(spaceB) coupler_get!(target_field, coupler, :test1, simB) diff --git a/test/runtests.jl b/test/runtests.jl index dbf46b771..cea991b85 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -3,9 +3,6 @@ using SafeTestsets @safetestset "Aqua tests" begin include("aqua.jl") end -@safetestset "Clock tests" begin - include("CoupledSimulations/clock.jl") -end @safetestset "Interfacer tests" begin include("interfacer_tests.jl") end @@ -39,8 +36,8 @@ end @safetestset "Checkpointer tests" begin include("checkpointer_tests.jl") end -@safetestset "CouplerState tests" begin - include("CouplerState/cplstate_interface.jl") +@safetestset "experiment test: CoupledSims tests" begin + include("experiment_tests/coupled_sims.jl") end @safetestset "component test: bucket" begin include("component_model_tests/bucket_tests.jl") @@ -60,5 +57,3 @@ end @safetestset "debug diagnostics: amip plots" begin include("debug/debug_amip_plots.jl") end - -# include("CoupledSimulations/cplsolver.jl")