diff --git a/class15/Manifest.toml b/class15/Manifest.toml new file mode 100644 index 0000000..7d1e0aa --- /dev/null +++ b/class15/Manifest.toml @@ -0,0 +1,2893 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.12.1" +manifest_format = "2.0" +project_hash = "50ff98100c9133b2b2aa183c75dd13276e3bfdb8" + +[[deps.ADTypes]] +git-tree-sha1 = "8be2ae325471fc20b11c27bb34b518541d07dd3a" +uuid = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +version = "1.19.0" +weakdeps = ["ChainRulesCore", "ConstructionBase", "EnzymeCore"] + + [deps.ADTypes.extensions] + ADTypesChainRulesCoreExt = "ChainRulesCore" + ADTypesConstructionBaseExt = "ConstructionBase" + ADTypesEnzymeCoreExt = "EnzymeCore" + +[[deps.ASL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6252039f98492252f9e47c312c8ffda0e3b9e78d" +uuid = "ae81ac8f-d209-56e5-92de-9978fef736f9" +version = "0.1.3+0" + +[[deps.AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.3.2" + +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "3b86719127f50670efe356bc11073d84b4ed7a5d" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.42" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "7e35fca2bdfba44d797c53dfe63a51fabf39bfc0" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.4.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.AliasTables]] +deps = ["PtrArrays", "Random"] +git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" +version = "1.1.3" + +[[deps.AlmostBlockDiagonals]] +deps = ["ConcreteStructs"] +git-tree-sha1 = "743abe5e5fe8cff96dad4123f263c0d8eee281c0" +uuid = "a95523ee-d6da-40b5-98cc-27bc505739d5" +version = "0.1.10" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" + +[[deps.ArnoldiMethod]] +deps = ["LinearAlgebra", "Random", "StaticArrays"] +git-tree-sha1 = "d57bd3762d308bded22c3b82d033bff85f6195c6" +uuid = "ec485272-7323-5ecc-a04f-4719b315124d" +version = "0.4.0" + +[[deps.ArrayInterface]] +deps = ["Adapt", "LinearAlgebra"] +git-tree-sha1 = "d81ae5489e13bc03567d4fbbb06c546a5e53c857" +uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" +version = "7.22.0" + + [deps.ArrayInterface.extensions] + ArrayInterfaceBandedMatricesExt = "BandedMatrices" + ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" + ArrayInterfaceCUDAExt = "CUDA" + ArrayInterfaceCUDSSExt = ["CUDSS", "CUDA"] + ArrayInterfaceChainRulesCoreExt = "ChainRulesCore" + ArrayInterfaceChainRulesExt = "ChainRules" + ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" + ArrayInterfaceMetalExt = "Metal" + ArrayInterfaceReverseDiffExt = "ReverseDiff" + ArrayInterfaceSparseArraysExt = "SparseArrays" + ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" + ArrayInterfaceTrackerExt = "Tracker" + + [deps.ArrayInterface.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.ArrayLayouts]] +deps = ["FillArrays", "LinearAlgebra", "StaticArrays"] +git-tree-sha1 = "355ab2d61069927d4247cd69ad0e1f140b31e30d" +uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" +version = "1.12.0" +weakdeps = ["SparseArrays"] + + [deps.ArrayLayouts.extensions] + ArrayLayoutsSparseArraysExt = "SparseArrays" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.BandedMatrices]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "PrecompileTools"] +git-tree-sha1 = "4826c9fe6023a87029e54870ad1a9800c7ea6623" +uuid = "aae01518-5342-5314-be14-df237901396f" +version = "1.10.1" + + [deps.BandedMatrices.extensions] + BandedMatricesSparseArraysExt = "SparseArrays" + CliqueTreesExt = "CliqueTrees" + + [deps.BandedMatrices.weakdeps] + CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.BenchmarkTools]] +deps = ["Compat", "JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] +git-tree-sha1 = "7fecfb1123b8d0232218e2da0c213004ff15358d" +uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +version = "1.6.3" + +[[deps.BitFlags]] +git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" +uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" +version = "0.1.9" + +[[deps.BitTwiddlingConvenienceFunctions]] +deps = ["Static"] +git-tree-sha1 = "f21cfd4950cb9f0587d5067e69405ad2acd27b87" +uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" +version = "0.1.6" + +[[deps.BoundaryValueDiffEq]] +deps = ["ADTypes", "BoundaryValueDiffEqAscher", "BoundaryValueDiffEqCore", "BoundaryValueDiffEqFIRK", "BoundaryValueDiffEqMIRK", "BoundaryValueDiffEqMIRKN", "BoundaryValueDiffEqShooting", "DiffEqBase", "FastClosures", "ForwardDiff", "LinearAlgebra", "Reexport", "SciMLBase"] +git-tree-sha1 = "d6ec33e4516b2e790a64128afdb54f3b536667a7" +uuid = "764a87c0-6b3e-53db-9096-fe964310641d" +version = "5.18.0" + + [deps.BoundaryValueDiffEq.extensions] + BoundaryValueDiffEqODEInterfaceExt = "ODEInterface" + + [deps.BoundaryValueDiffEq.weakdeps] + ODEInterface = "54ca160b-1b9f-5127-a996-1867f4bc2a2c" + +[[deps.BoundaryValueDiffEqAscher]] +deps = ["ADTypes", "AlmostBlockDiagonals", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield"] +git-tree-sha1 = "47c833c459738a3f27c5b458ecf7832a4731ef4d" +uuid = "7227322d-7511-4e07-9247-ad6ff830280e" +version = "1.8.0" + +[[deps.BoundaryValueDiffEqCore]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "ConcreteStructs", "DiffEqBase", "ForwardDiff", "LineSearch", "LinearAlgebra", "Logging", "NonlinearSolveFirstOrder", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays", "SparseConnectivityTracer", "SparseMatrixColorings"] +git-tree-sha1 = "b7b4d8cc80f116eab2eb6124dba58ea7aef31b85" +uuid = "56b672f2-a5fe-4263-ab2d-da677488eb3a" +version = "1.11.1" + +[[deps.BoundaryValueDiffEqFIRK]] +deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] +git-tree-sha1 = "325e6981a414cfa5181218936c23f0e16dee8f08" +uuid = "85d9eb09-370e-4000-bb32-543851f73618" +version = "1.9.0" + +[[deps.BoundaryValueDiffEqMIRK]] +deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] +git-tree-sha1 = "da6ae5e564ad06ced4d7504929c58130558007dd" +uuid = "1a22d4ce-7765-49ea-b6f2-13c8438986a6" +version = "1.9.0" + +[[deps.BoundaryValueDiffEqMIRKN]] +deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] +git-tree-sha1 = "609c2d03ea024df0d475fee483b93cf0e87c29d6" +uuid = "9255f1d6-53bf-473e-b6bd-23f1ff009da4" +version = "1.8.0" + +[[deps.BoundaryValueDiffEqShooting]] +deps = ["ADTypes", "ArrayInterface", "BandedMatrices", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastAlmostBandedMatrices", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "SparseArrays"] +git-tree-sha1 = "ba9bd1f31b58bfd5e48a56da0a426bcbd3462546" +uuid = "ed55bfe0-3725-4db6-871e-a1dc9f42a757" +version = "1.9.0" + +[[deps.BracketingNonlinearSolve]] +deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "03100f03a58e14c60ba0a465e6f1ac9450eb495c" +uuid = "70df07ce-3d50-431d-a3e7-ca6ddb60ac1e" +version = "1.6.0" +weakdeps = ["ChainRulesCore", "ForwardDiff"] + + [deps.BracketingNonlinearSolve.extensions] + BracketingNonlinearSolveChainRulesCoreExt = ["ChainRulesCore", "ForwardDiff"] + BracketingNonlinearSolveForwardDiffExt = "ForwardDiff" + +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.CPUSummary]] +deps = ["CpuId", "IfElse", "PrecompileTools", "Preferences", "Static"] +git-tree-sha1 = "f3a21d7fc84ba618a779d1ed2fcca2e682865bab" +uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" +version = "0.2.7" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.5+0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "e4c6a16e77171a5f5e25e9646617ab1c276c5607" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.26.0" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.CloseOpenIntervals]] +deps = ["Static", "StaticArrayInterface"] +git-tree-sha1 = "05ba0d07cd4fd8b7a39541e31a7b0254704ea581" +uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" +version = "0.1.13" + +[[deps.CodecBzip2]] +deps = ["Bzip2_jll", "TranscodingStreams"] +git-tree-sha1 = "84990fa864b7f2b4901901ca12736e45ee79068c" +uuid = "523fee87-0ab8-5b00-afb7-3ecf72e48cfd" +version = "0.8.5" + +[[deps.CodecZlib]] +deps = ["TranscodingStreams", "Zlib_jll"] +git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +uuid = "944b1d66-785c-5afd-91f1-9de20f533193" +version = "0.7.8" + +[[deps.ColorSchemes]] +deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] +git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.31.0" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" +weakdeps = ["StyledStrings"] + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" +weakdeps = ["SpecialFunctions"] + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.1" + +[[deps.CommonMark]] +deps = ["PrecompileTools"] +git-tree-sha1 = "351d6f4eaf273b753001b2de4dffb8279b100769" +uuid = "a80b9123-70ca-4bc0-993e-6e3bcb318db6" +version = "0.9.1" + +[[deps.CommonSolve]] +git-tree-sha1 = "0eee5eb66b1cf62cd6ad1b460238e60e4b09400c" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.4" + +[[deps.CommonSubexpressions]] +deps = ["MacroTools"] +git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" +version = "0.3.1" + +[[deps.CommonWorldInvalidations]] +git-tree-sha1 = "ae52d1c52048455e85a387fbee9be553ec2b68d0" +uuid = "f70d9fcc-98c5-4d4a-abd7-e4cdeebd8ca8" +version = "1.0.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.18.1" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.3.0+1" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" + +[[deps.ConcreteStructs]] +git-tree-sha1 = "f749037478283d372048690eb3b5f92a79432b34" +uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471" +version = "0.2.3" + +[[deps.ConcurrentUtilities]] +deps = ["Serialization", "Sockets"] +git-tree-sha1 = "d9d26935a0bcffc87d2613ce14c527c99fc543fd" +uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" +version = "2.5.0" + +[[deps.Configurations]] +deps = ["ExproniconLite", "OrderedCollections", "TOML"] +git-tree-sha1 = "4358750bb58a3caefd5f37a4a0c5bfdbbf075252" +uuid = "5218b696-f38b-4ac9-8b61-a12ec717816d" +version = "0.17.6" + +[[deps.ConstructionBase]] +git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" +version = "1.6.0" + + [deps.ConstructionBase.extensions] + ConstructionBaseIntervalSetsExt = "IntervalSets" + ConstructionBaseLinearAlgebraExt = "LinearAlgebra" + ConstructionBaseStaticArraysExt = "StaticArrays" + + [deps.ConstructionBase.weakdeps] + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.Contour]] +git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.6.3" + +[[deps.CpuId]] +deps = ["Markdown"] +git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" +uuid = "adafc99b-e345-5852-983c-f28acb93d879" +version = "0.3.1" + +[[deps.DataAPI]] +git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.16.0" + +[[deps.DataStructures]] +deps = ["OrderedCollections"] +git-tree-sha1 = "e357641bb3e0638d353c4b29ea0e40ea644066a6" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.19.3" + +[[deps.DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.Dbus_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "473e9afc9cf30814eb67ffa5f2db7df82c3ad9fd" +uuid = "ee1fde0b-3d02-5ea6-8484-8dfef6360eab" +version = "1.16.2+0" + +[[deps.DelayDiffEq]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "FastBroadcast", "ForwardDiff", "LinearAlgebra", "Logging", "OrdinaryDiffEq", "OrdinaryDiffEqCore", "OrdinaryDiffEqDefault", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqFunctionMap", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqRosenbrock", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "SimpleUnPack", "SymbolicIndexingInterface"] +git-tree-sha1 = "76fa8e204712a38bb2d00590dd527468775df155" +uuid = "bcd4f6db-9728-5f36-b5f7-82caef46ccdb" +version = "5.61.1" + +[[deps.DelimitedFiles]] +deps = ["Mmap"] +git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" +version = "1.9.1" + +[[deps.DiffEqBase]] +deps = ["ArrayInterface", "ConcreteStructs", "DocStringExtensions", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"] +git-tree-sha1 = "410de4b89beab68dce2adfb342fb4e73d20871ac" +uuid = "2b5f629d-d688-5b77-993f-72d75c75574e" +version = "6.191.0" + + [deps.DiffEqBase.extensions] + DiffEqBaseCUDAExt = "CUDA" + DiffEqBaseChainRulesCoreExt = "ChainRulesCore" + DiffEqBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + DiffEqBaseForwardDiffExt = ["ForwardDiff"] + DiffEqBaseGTPSAExt = "GTPSA" + DiffEqBaseGeneralizedGeneratedExt = "GeneralizedGenerated" + DiffEqBaseMPIExt = "MPI" + DiffEqBaseMeasurementsExt = "Measurements" + DiffEqBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + DiffEqBaseMooncakeExt = "Mooncake" + DiffEqBaseReverseDiffExt = "ReverseDiff" + DiffEqBaseSparseArraysExt = "SparseArrays" + DiffEqBaseTrackerExt = "Tracker" + DiffEqBaseUnitfulExt = "Unitful" + + [deps.DiffEqBase.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + GeneralizedGenerated = "6b9d7cbe-bcb9-11e9-073f-15a7a543e2eb" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.DiffEqCallbacks]] +deps = ["ConcreteStructs", "DataStructures", "DiffEqBase", "DifferentiationInterface", "LinearAlgebra", "Markdown", "RecipesBase", "RecursiveArrayTools", "SciMLBase", "StaticArraysCore"] +git-tree-sha1 = "448d118c4a7763b041fc41cf91c85d23773f1dc2" +uuid = "459566f4-90b8-5000-8ac3-15dfb0a30def" +version = "4.10.1" + + [deps.DiffEqCallbacks.extensions] + DiffEqCallbacksFunctorsExt = "Functors" + + [deps.DiffEqCallbacks.weakdeps] + Functors = "d9f16b24-f501-4c13-a1f2-28368ffc5196" + +[[deps.DiffEqNoiseProcess]] +deps = ["DiffEqBase", "Distributions", "GPUArraysCore", "LinearAlgebra", "Markdown", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "ResettableStacks", "SciMLBase", "StaticArraysCore", "Statistics"] +git-tree-sha1 = "516d553f5deee7c55b2945b5edf05b6542837887" +uuid = "77a26b50-5914-5dd7-bc55-306e6241c503" +version = "5.24.1" + + [deps.DiffEqNoiseProcess.extensions] + DiffEqNoiseProcessReverseDiffExt = "ReverseDiff" + + [deps.DiffEqNoiseProcess.weakdeps] + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + +[[deps.DiffResults]] +deps = ["StaticArraysCore"] +git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" +version = "1.1.0" + +[[deps.DiffRules]] +deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] +git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" +version = "1.15.1" + +[[deps.DifferentialEquations]] +deps = ["BoundaryValueDiffEq", "DelayDiffEq", "DiffEqBase", "DiffEqCallbacks", "DiffEqNoiseProcess", "JumpProcesses", "LinearAlgebra", "LinearSolve", "NonlinearSolve", "OrdinaryDiffEq", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SteadyStateDiffEq", "StochasticDiffEq", "Sundials"] +git-tree-sha1 = "1df783c534cd0c4a865a397b1c4801771b5cbb07" +uuid = "0c46a032-eb83-5123-abaf-570d42b7fbaa" +version = "7.17.0" + +[[deps.DifferentiationInterface]] +deps = ["ADTypes", "LinearAlgebra"] +git-tree-sha1 = "80bd15222b3e8d0bc70d921d2201aa0084810ce5" +uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" +version = "0.7.12" + + [deps.DifferentiationInterface.extensions] + DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore" + DifferentiationInterfaceDiffractorExt = "Diffractor" + DifferentiationInterfaceEnzymeExt = ["EnzymeCore", "Enzyme"] + DifferentiationInterfaceFastDifferentiationExt = "FastDifferentiation" + DifferentiationInterfaceFiniteDiffExt = "FiniteDiff" + DifferentiationInterfaceFiniteDifferencesExt = "FiniteDifferences" + DifferentiationInterfaceForwardDiffExt = ["ForwardDiff", "DiffResults"] + DifferentiationInterfaceGPUArraysCoreExt = "GPUArraysCore" + DifferentiationInterfaceGTPSAExt = "GTPSA" + DifferentiationInterfaceMooncakeExt = "Mooncake" + DifferentiationInterfacePolyesterForwardDiffExt = ["PolyesterForwardDiff", "ForwardDiff", "DiffResults"] + DifferentiationInterfaceReverseDiffExt = ["ReverseDiff", "DiffResults"] + DifferentiationInterfaceSparseArraysExt = "SparseArrays" + DifferentiationInterfaceSparseConnectivityTracerExt = "SparseConnectivityTracer" + DifferentiationInterfaceSparseMatrixColoringsExt = "SparseMatrixColorings" + DifferentiationInterfaceStaticArraysExt = "StaticArrays" + DifferentiationInterfaceSymbolicsExt = "Symbolics" + DifferentiationInterfaceTrackerExt = "Tracker" + DifferentiationInterfaceZygoteExt = ["Zygote", "ForwardDiff"] + + [deps.DifferentiationInterface.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DiffResults = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" + Diffractor = "9f5e2b26-1114-432f-b630-d3fe2085c51c" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastDifferentiation = "eb9bf01b-bf85-4b60-bf87-ee5de06c00be" + FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" + FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" + GTPSA = "b27dd330-f138-47c5-815b-40db9dd9b6e8" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PolyesterForwardDiff = "98d1487c-24ca-40b6-b7ab-df2af84e126b" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + Symbolics = "0c5d862f-8b57-4792-8d23-62f2024744c7" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Distances]] +deps = ["LinearAlgebra", "Statistics", "StatsAPI"] +git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.12" +weakdeps = ["ChainRulesCore", "SparseArrays"] + + [deps.Distances.extensions] + DistancesChainRulesCoreExt = "ChainRulesCore" + DistancesSparseArraysExt = "SparseArrays" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.Distributions]] +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "3bc002af51045ca3b47d2e1787d6ce02e68b943a" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.122" + + [deps.Distributions.extensions] + DistributionsChainRulesCoreExt = "ChainRulesCore" + DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsTestExt = "Test" + + [deps.Distributions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.DocStringExtensions]] +git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.9.5" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.EnumX]] +git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" +version = "1.0.5" + +[[deps.EnzymeCore]] +git-tree-sha1 = "820f06722a87d9544f42679182eb0850690f9b45" +uuid = "f151be2c-9106-41f4-ab19-57ee4f262869" +version = "0.8.17" +weakdeps = ["Adapt"] + + [deps.EnzymeCore.extensions] + AdaptExt = "Adapt" + +[[deps.EpollShim_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d" +uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" +version = "0.0.20230411+1" + +[[deps.ExceptionUnwrapping]] +deps = ["Test"] +git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a" +uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" +version = "0.1.11" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.7.3+0" + +[[deps.ExponentialUtilities]] +deps = ["Adapt", "ArrayInterface", "GPUArraysCore", "GenericSchur", "LinearAlgebra", "PrecompileTools", "Printf", "SparseArrays", "libblastrampoline_jll"] +git-tree-sha1 = "cae251c76f353e32d32d76fae2fea655eab652af" +uuid = "d4d017d3-3776-5f7e-afef-a10c40355c18" +version = "1.27.0" +weakdeps = ["StaticArrays"] + + [deps.ExponentialUtilities.extensions] + ExponentialUtilitiesStaticArraysExt = "StaticArrays" + +[[deps.ExprTools]] +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" +uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" +version = "0.1.10" + +[[deps.ExpressionExplorer]] +git-tree-sha1 = "4a8c0a9eebf807ac42f0f6de758e60a20be25ffb" +uuid = "21656369-7473-754a-2065-74616d696c43" +version = "1.1.3" + +[[deps.ExproniconLite]] +git-tree-sha1 = "c13f0b150373771b0fdc1713c97860f8df12e6c2" +uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" +version = "0.10.14" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "95ecf07c2eea562b5adbd0696af6db62c0f52560" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.5" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "ccc81ba5e42497f4e76553a5545665eed577a663" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "8.0.0+0" + +[[deps.FastAlmostBandedMatrices]] +deps = ["ArrayInterface", "ArrayLayouts", "BandedMatrices", "ConcreteStructs", "LazyArrays", "LinearAlgebra", "MatrixFactorizations", "PrecompileTools", "Reexport"] +git-tree-sha1 = "9482a2b4face8ade73792c23a54796c79ed1bcbf" +uuid = "9d29842c-ecb8-4973-b1e9-a27b1157504e" +version = "0.1.5" + +[[deps.FastBroadcast]] +deps = ["ArrayInterface", "LinearAlgebra", "Polyester", "Static", "StaticArrayInterface", "StrideArraysCore"] +git-tree-sha1 = "ab1b34570bcdf272899062e1a56285a53ecaae08" +uuid = "7034ab61-46d4-4ed7-9d0f-46aef9175898" +version = "0.3.5" + +[[deps.FastClosures]] +git-tree-sha1 = "acebe244d53ee1b461970f8910c235b259e772ef" +uuid = "9aa1b823-49e4-5ca5-8b0f-3971ec8bab6a" +version = "0.3.2" + +[[deps.FastGaussQuadrature]] +deps = ["LinearAlgebra", "SpecialFunctions", "StaticArrays"] +git-tree-sha1 = "0044e9f5e49a57e88205e8f30ab73928b05fe5b6" +uuid = "442a2c76-b920-505d-bb47-c5924d526838" +version = "1.1.0" + +[[deps.FastPower]] +git-tree-sha1 = "e47c70bf430175e077d1955d7f04923504acc74c" +uuid = "a4df4552-cc26-4903-aec0-212e50a0e84b" +version = "1.2.0" + + [deps.FastPower.extensions] + FastPowerEnzymeExt = "Enzyme" + FastPowerForwardDiffExt = "ForwardDiff" + FastPowerMeasurementsExt = "Measurements" + FastPowerMonteCarloMeasurementsExt = "MonteCarloMeasurements" + FastPowerMooncakeExt = "Mooncake" + FastPowerReverseDiffExt = "ReverseDiff" + FastPowerTrackerExt = "Tracker" + + [deps.FastPower.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FillArrays]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "5bfcd42851cf2f1b303f51525a54dc5e98d408a3" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "1.15.0" +weakdeps = ["PDMats", "SparseArrays", "Statistics"] + + [deps.FillArrays.extensions] + FillArraysPDMatsExt = "PDMats" + FillArraysSparseArraysExt = "SparseArrays" + FillArraysStatisticsExt = "Statistics" + +[[deps.FiniteDiff]] +deps = ["ArrayInterface", "LinearAlgebra", "Setfield"] +git-tree-sha1 = "9340ca07ca27093ff68418b7558ca37b05f8aeb1" +uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" +version = "2.29.0" + + [deps.FiniteDiff.extensions] + FiniteDiffBandedMatricesExt = "BandedMatrices" + FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" + FiniteDiffSparseArraysExt = "SparseArrays" + FiniteDiffStaticArraysExt = "StaticArrays" + + [deps.FiniteDiff.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.17.1+0" + +[[deps.Format]] +git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" +version = "1.3.7" + +[[deps.ForwardDiff]] +deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] +git-tree-sha1 = "ba6ce081425d0afb2bedd00d9884464f764a9225" +uuid = "f6369f11-7733-5829-9624-2563aa707210" +version = "1.2.2" +weakdeps = ["StaticArrays"] + + [deps.ForwardDiff.extensions] + ForwardDiffStaticArraysExt = "StaticArrays" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.FunctionWrappers]] +git-tree-sha1 = "d62485945ce5ae9c0c48f124a84998d755bae00e" +uuid = "069b7b12-0de2-55c6-9aab-29f3d0a68a2e" +version = "1.1.3" + +[[deps.FunctionWrappersWrappers]] +deps = ["FunctionWrappers"] +git-tree-sha1 = "b104d487b34566608f8b4e1c39fb0b10aa279ff8" +uuid = "77dc65aa-8811-40c2-897b-53d922fa7daf" +version = "0.1.3" + +[[deps.Future]] +deps = ["Random"] +uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" + +[[deps.GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll", "libdecor_jll", "xkbcommon_jll"] +git-tree-sha1 = "fcb0584ff34e25155876418979d4c8971243bb89" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.4.0+2" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.GR]] +deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Qt6Wayland_jll", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] +git-tree-sha1 = "f52c27dd921390146624f3aab95f4e8614ad6531" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.73.18" + +[[deps.GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "4b0406b866ea9fdbaf1148bc9c0b887e59f9af68" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.73.18+0" + +[[deps.GenericSchur]] +deps = ["LinearAlgebra", "Printf"] +git-tree-sha1 = "a694e2a57394e409f7a11ee0977362a9fafcb8c7" +uuid = "c145ed77-6b09-5dd9-b285-bf645a82121e" +version = "0.5.6" + +[[deps.GettextRuntime_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] +git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" +uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" +version = "0.22.4+0" + +[[deps.Ghostscript_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Zlib_jll"] +git-tree-sha1 = "38044a04637976140074d0b0621c1edf0eb531fd" +uuid = "61579ee1-b43e-5ca0-a5da-69d92c66a64b" +version = "9.55.1+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "50c11ffab2a3d50192a228c313f05b5b5dc5acb2" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.86.0+0" + +[[deps.GracefulPkg]] +deps = ["Compat", "Pkg", "TOML"] +git-tree-sha1 = "9721d7ae22a51439656a73de721d973dbb9d3bad" +uuid = "828d9ff0-206c-6161-646e-6576656f7244" +version = "2.4.2" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.Graphs]] +deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"] +git-tree-sha1 = "7a98c6502f4632dbe9fb1973a4244eaa3324e84d" +uuid = "86223c79-3864-5bf0-83f7-82e725a168b6" +version = "1.13.1" + +[[deps.Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[deps.HTTP]] +deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] +git-tree-sha1 = "5e6fe50ae7f23d171f44e311c2960294aaa0beb5" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "1.10.19" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.1+0" + +[[deps.Hwloc_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XML2_jll", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "3d468106a05408f9f7b6f161d9e7715159af247b" +uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8" +version = "2.12.2+0" + +[[deps.HypergeometricFunctions]] +deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] +git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" +version = "0.3.28" + +[[deps.Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.5" + +[[deps.HypertextLiteral]] +deps = ["Tricks"] +git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.5" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "0ee181ec08df7d7c911901ea38baf16f755114dc" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "1.0.0" + +[[deps.IfElse]] +git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" +uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" +version = "0.1.1" + +[[deps.Inflate]] +git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" +version = "0.1.5" + +[[deps.IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2025.2.0+0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InverseFunctions]] +git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.17" +weakdeps = ["Dates", "Test"] + + [deps.InverseFunctions.extensions] + InverseFunctionsDatesExt = "Dates" + InverseFunctionsTestExt = "Test" + +[[deps.Ipopt]] +deps = ["Ipopt_jll", "LinearAlgebra", "OpenBLAS32_jll", "PrecompileTools"] +git-tree-sha1 = "84be69cbb8229dd4ac8776f37d4cfd0a16a44482" +uuid = "b6b21f68-93f8-5de0-b562-5493be1d77c9" +version = "1.12.1" +weakdeps = ["MathOptInterface"] + + [deps.Ipopt.extensions] + IpoptMathOptInterfaceExt = "MathOptInterface" + +[[deps.Ipopt_jll]] +deps = ["ASL_jll", "Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "MUMPS_seq_jll", "SPRAL_jll", "libblastrampoline_jll"] +git-tree-sha1 = "b33cbc78b8d4de87d18fcd705054a82e2999dbac" +uuid = "9cc047cb-c261-5740-88fc-0cf96f7bdcc7" +version = "300.1400.1900+0" + +[[deps.IrrationalConstants]] +git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.2.6" + +[[deps.IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[deps.JLFzf]] +deps = ["REPL", "Random", "fzf_jll"] +git-tree-sha1 = "82f7acdc599b65e0f8ccd270ffa1467c21cb647b" +uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" +version = "0.1.11" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.1" + +[[deps.JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.4" + +[[deps.JSON3]] +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "411eccfe8aba0814ffa0fdf4860913ed09c34975" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.3" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.Jieko]] +deps = ["ExproniconLite"] +git-tree-sha1 = "2f05ed29618da60c06a87e9c033982d4f71d0b6c" +uuid = "ae98c720-c025-4a4a-838c-29b094483192" +version = "0.2.1" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4255f0032eafd6451d707a51d5f0248b8a165e4d" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.3+0" + +[[deps.JuMP]] +deps = ["LinearAlgebra", "MacroTools", "MathOptInterface", "MutableArithmetics", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays"] +git-tree-sha1 = "d6ece925e8798b6f078731ab04ce82c5433b0d64" +uuid = "4076af6c-e467-56ae-b986-b466b2749572" +version = "1.29.2" + + [deps.JuMP.extensions] + JuMPDimensionalDataExt = "DimensionalData" + + [deps.JuMP.weakdeps] + DimensionalData = "0703355e-b756-11e9-17c0-8b28908087d0" + +[[deps.JuliaSyntaxHighlighting]] +deps = ["StyledStrings"] +uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" +version = "1.12.0" + +[[deps.JumpProcesses]] +deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "PoissonRandom", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "SymbolicIndexingInterface", "UnPack"] +git-tree-sha1 = "905a2a28770e23f3ed750306ef48eb8c46c3a002" +uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5" +version = "9.19.1" + + [deps.JumpProcesses.extensions] + JumpProcessesKernelAbstractionsExt = ["Adapt", "KernelAbstractions"] + + [deps.JumpProcesses.weakdeps] + Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + +[[deps.Krylov]] +deps = ["LinearAlgebra", "Printf", "SparseArrays"] +git-tree-sha1 = "d1fc961038207e43982851e57ee257adc37be5e8" +uuid = "ba0b0d4f-ebba-5204-a429-3ac8c609bfb7" +version = "0.10.2" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.3+0" + +[[deps.LERC_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +uuid = "88015f11-f218-50d7-93a8-a6af411a945d" +version = "4.0.1+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.8+0" + +[[deps.LRUCache]] +git-tree-sha1 = "5519b95a490ff5fe629c4a7aa3b3dfc9160498b3" +uuid = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637" +version = "1.6.2" +weakdeps = ["Serialization"] + + [deps.LRUCache.extensions] + SerializationExt = ["Serialization"] + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LaTeXStrings]] +git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.4.0" + +[[deps.Latexify]] +deps = ["Format", "Ghostscript_jll", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] +git-tree-sha1 = "44f93c47f9cd6c7e431f2f2091fcba8f01cd7e8f" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.16.10" + + [deps.Latexify.extensions] + DataFramesExt = "DataFrames" + SparseArraysExt = "SparseArrays" + SymEngineExt = "SymEngine" + TectonicExt = "tectonic_jll" + + [deps.Latexify.weakdeps] + DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" + tectonic_jll = "d7dd28d6-a5e6-559c-9131-7eb760cdacc5" + +[[deps.LayoutPointers]] +deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] +git-tree-sha1 = "a9eaadb366f5493a5654e843864c13d8b107548c" +uuid = "10f19ff3-798f-405d-979b-55457f8fc047" +version = "0.1.17" + +[[deps.LazilyInitializedFields]] +git-tree-sha1 = "0f2da712350b020bc3957f269c9caad516383ee0" +uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" +version = "1.3.0" + +[[deps.LazyArrays]] +deps = ["ArrayLayouts", "FillArrays", "LinearAlgebra", "MacroTools", "SparseArrays"] +git-tree-sha1 = "85829152db633948b418181ec33b8badaece9c3e" +uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" +version = "2.9.0" + + [deps.LazyArrays.extensions] + LazyArraysBandedMatricesExt = "BandedMatrices" + LazyArraysBlockArraysExt = "BlockArrays" + LazyArraysBlockBandedMatricesExt = "BlockBandedMatrices" + LazyArraysStaticArraysExt = "StaticArrays" + + [deps.LazyArrays.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" + BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" + +[[deps.LevyArea]] +deps = ["LinearAlgebra", "Random", "SpecialFunctions"] +git-tree-sha1 = "56513a09b8e0ae6485f34401ea9e2f31357958ec" +uuid = "2d8b4e74-eb68-11e8-0fb9-d5eb67b50637" +version = "1.0.0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.11.1+1" + +[[deps.LibGit2]] +deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.9.0+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "OpenSSL_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.3+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.4.7+0" + +[[deps.Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.7.1+1" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3acf07f130a76f87c041cfb2ff7d7284ca67b072" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.2+0" + +[[deps.Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.7.2+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2a7a12fc0a4e7fb773450d17975322aa77142106" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.2+0" + +[[deps.LineSearch]] +deps = ["ADTypes", "CommonSolve", "ConcreteStructs", "FastClosures", "LinearAlgebra", "MaybeInplace", "SciMLBase", "SciMLJacobianOperators", "StaticArraysCore"] +git-tree-sha1 = "97d502765cc5cf3a722120f50da03c2474efce04" +uuid = "87fe0de2-c867-4266-b59a-2f0a94fc965b" +version = "0.1.4" +weakdeps = ["LineSearches"] + + [deps.LineSearch.extensions] + LineSearchLineSearchesExt = "LineSearches" + +[[deps.LineSearches]] +deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] +git-tree-sha1 = "4adee99b7262ad2a1a4bbbc59d993d24e55ea96f" +uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" +version = "7.4.0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.12.0" + +[[deps.LinearSolve]] +deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "OpenBLAS_jll", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLLogging", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"] +git-tree-sha1 = "e00dff84aded96c3ec03cfe46ff8d13e0c5afc44" +uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" +version = "3.47.0" + + [deps.LinearSolve.extensions] + LinearSolveAMDGPUExt = "AMDGPU" + LinearSolveBLISExt = ["blis_jll", "LAPACK_jll"] + LinearSolveBandedMatricesExt = "BandedMatrices" + LinearSolveBlockDiagonalsExt = "BlockDiagonals" + LinearSolveCUDAExt = "CUDA" + LinearSolveCUDSSExt = "CUDSS" + LinearSolveCUSOLVERRFExt = ["CUSOLVERRF", "SparseArrays"] + LinearSolveCliqueTreesExt = ["CliqueTrees", "SparseArrays"] + LinearSolveEnzymeExt = "EnzymeCore" + LinearSolveFastAlmostBandedMatricesExt = "FastAlmostBandedMatrices" + LinearSolveFastLapackInterfaceExt = "FastLapackInterface" + LinearSolveForwardDiffExt = "ForwardDiff" + LinearSolveHYPREExt = "HYPRE" + LinearSolveIterativeSolversExt = "IterativeSolvers" + LinearSolveKernelAbstractionsExt = "KernelAbstractions" + LinearSolveKrylovKitExt = "KrylovKit" + LinearSolveMetalExt = "Metal" + LinearSolveMooncakeExt = "Mooncake" + LinearSolvePardisoExt = ["Pardiso", "SparseArrays"] + LinearSolveRecursiveFactorizationExt = "RecursiveFactorization" + LinearSolveSparseArraysExt = "SparseArrays" + LinearSolveSparspakExt = ["SparseArrays", "Sparspak"] + + [deps.LinearSolve.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + BlockDiagonals = "0a1fb500-61f7-11e9-3c65-f5ef3456f9f0" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" + CUSOLVERRF = "a8cc9031-bad2-4722-94f5-40deabb4245c" + CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FastAlmostBandedMatrices = "9d29842c-ecb8-4973-b1e9-a27b1157504e" + FastLapackInterface = "29a986be-02c6-4525-aec4-84b980013641" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + HYPRE = "b5ffcf37-a2bd-41ab-a3da-4bd9bc8ad771" + IterativeSolvers = "42fd0dbc-a981-5370-80f2-aaf504508153" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77" + LAPACK_jll = "51474c39-65e3-53ba-86ba-03b1b862ec14" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + Pardiso = "46dd5b70-b6fb-5a00-ae2d-e8fea33afaf2" + RecursiveFactorization = "f2c3362d-daeb-58d1-803e-2bc74f2840b4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + Sparspak = "e56a9233-b9d6-4f03-8d0f-1825330902ac" + blis_jll = "6136c539-28a5-5bf0-87cc-b183200dce32" + +[[deps.LogExpFunctions]] +deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.29" + + [deps.LogExpFunctions.extensions] + LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" + LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" + LogExpFunctionsInverseFunctionsExt = "InverseFunctions" + + [deps.LogExpFunctions.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" + InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.LoggingExtras]] +deps = ["Dates", "Logging"] +git-tree-sha1 = "f00544d95982ea270145636c181ceda21c4e2575" +uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" +version = "1.2.0" + +[[deps.METIS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "2eefa8baa858871ae7770c98c3c2a7e46daba5b4" +uuid = "d00139f3-1899-568f-a2f0-47f597d42d70" +version = "5.1.3+0" + +[[deps.MIMEs]] +git-tree-sha1 = "c64d943587f7187e751162b3b84445bbbd79f691" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "1.1.0" + +[[deps.MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] +git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2025.2.0+0" + +[[deps.MUMPS_seq_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "METIS_jll", "libblastrampoline_jll"] +git-tree-sha1 = "fc0c8442887b48c15aec2b1787a5fc812a99b2fd" +uuid = "d7ed1dd3-d0ae-5e8e-bfb4-87a502085b8d" +version = "500.800.100+0" + +[[deps.MacroTools]] +git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.16" + +[[deps.Malt]] +deps = ["Distributed", "Logging", "RelocatableFolders", "Serialization", "Sockets"] +git-tree-sha1 = "21ab3240653e26c8d54c1389779e260a48174be3" +uuid = "36869731-bdee-424d-aa32-cab38c994e3b" +version = "1.3.0" + +[[deps.ManualMemory]] +git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" +uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" +version = "0.1.8" + +[[deps.Markdown]] +deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.MarkdownLiteral]] +deps = ["CommonMark", "HypertextLiteral"] +git-tree-sha1 = "f7d73634acd573bf3489df1ee0d270a5d6d3a7a3" +uuid = "736d6165-7244-6769-4267-6b50796e6954" +version = "0.1.2" + +[[deps.MathOptInterface]] +deps = ["BenchmarkTools", "CodecBzip2", "CodecZlib", "DataStructures", "ForwardDiff", "JSON3", "LinearAlgebra", "MutableArithmetics", "NaNMath", "OrderedCollections", "PrecompileTools", "Printf", "SparseArrays", "SpecialFunctions", "Test"] +git-tree-sha1 = "a2cbab4256690aee457d136752c404e001f27768" +uuid = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" +version = "1.46.0" + +[[deps.MatrixFactorizations]] +deps = ["ArrayLayouts", "LinearAlgebra", "Printf", "Random"] +git-tree-sha1 = "3bb3cf4685f1c90f22883f4c4bb6d203fa882b79" +uuid = "a3b82374-2e81-5b9e-98ce-41277c0e4c87" +version = "3.1.3" +weakdeps = ["BandedMatrices"] + + [deps.MatrixFactorizations.extensions] + MatrixFactorizationsBandedMatricesExt = "BandedMatrices" + +[[deps.MaybeInplace]] +deps = ["ArrayInterface", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "54e2fdc38130c05b42be423e90da3bade29b74bd" +uuid = "bb5d69b7-63fc-4a16-80bd-7e42200c7bdb" +version = "0.1.4" +weakdeps = ["SparseArrays"] + + [deps.MaybeInplace.extensions] + MaybeInplaceSparseArraysExt = "SparseArrays" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] +git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.1.9" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "3cce3511ca2c6f87b19c34ffc623417ed2798cbd" +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.10+0" + +[[deps.Measures]] +git-tree-sha1 = "b513cedd20d9c914783d8ad83d08120702bf2c77" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.3" + +[[deps.Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.2.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.Moshi]] +deps = ["ExproniconLite", "Jieko"] +git-tree-sha1 = "53f817d3e84537d84545e0ad749e483412dd6b2a" +uuid = "2e0e35c7-a2e4-4343-998d-7ef72827ed2d" +version = "0.3.7" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2025.5.20" + +[[deps.MsgPack]] +deps = ["Serialization"] +git-tree-sha1 = "f5db02ae992c260e4826fe78c942954b48e1d9c2" +uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671" +version = "1.2.1" + +[[deps.MuladdMacro]] +git-tree-sha1 = "cac9cc5499c25554cba55cd3c30543cff5ca4fab" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.4" + +[[deps.MutableArithmetics]] +deps = ["LinearAlgebra", "SparseArrays", "Test"] +git-tree-sha1 = "22df8573f8e7c593ac205455ca088989d0a2c7a0" +uuid = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" +version = "1.6.7" + +[[deps.NLSolversBase]] +deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"] +git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df" +uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" +version = "7.10.0" + +[[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]] +deps = ["OpenLibm_jll"] +git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "1.1.3" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.3.0" + +[[deps.NonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "NonlinearSolveBase", "NonlinearSolveFirstOrder", "NonlinearSolveQuasiNewton", "NonlinearSolveSpectralMethods", "PrecompileTools", "Preferences", "Reexport", "SciMLBase", "SimpleNonlinearSolve", "StaticArraysCore", "SymbolicIndexingInterface"] +git-tree-sha1 = "1d091cfece012662b06d25c792b3a43a0804c47b" +uuid = "8913a72c-1f9b-4ce2-8d82-65094dcecaec" +version = "4.12.0" + + [deps.NonlinearSolve.extensions] + NonlinearSolveFastLevenbergMarquardtExt = "FastLevenbergMarquardt" + NonlinearSolveFixedPointAccelerationExt = "FixedPointAcceleration" + NonlinearSolveLeastSquaresOptimExt = "LeastSquaresOptim" + NonlinearSolveMINPACKExt = "MINPACK" + NonlinearSolveNLSolversExt = "NLSolvers" + NonlinearSolveNLsolveExt = ["NLsolve", "LineSearches"] + NonlinearSolvePETScExt = ["PETSc", "MPI", "SparseArrays"] + NonlinearSolveSIAMFANLEquationsExt = "SIAMFANLEquations" + NonlinearSolveSpeedMappingExt = "SpeedMapping" + NonlinearSolveSundialsExt = "Sundials" + + [deps.NonlinearSolve.weakdeps] + FastLevenbergMarquardt = "7a0df574-e128-4d35-8cbd-3d84502bf7ce" + FixedPointAcceleration = "817d07cb-a79a-5c30-9a31-890123675176" + LeastSquaresOptim = "0fc2ff8b-aaa3-5acd-a817-1944a5e08891" + LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" + MINPACK = "4854310b-de5a-5eb6-a2a5-c1dee2bd17f9" + MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195" + NLSolvers = "337daf1e-9722-11e9-073e-8b9effe078ba" + NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" + PETSc = "ace2c81b-2b5f-4b1e-a30d-d662738edfe0" + SIAMFANLEquations = "084e46ad-d928-497d-ad5e-07fa361a48c4" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SpeedMapping = "f1835b91-879b-4a3f-a438-e4baacf14412" + Sundials = "c3572dad-4567-51f8-b174-8c6c989267f4" + +[[deps.NonlinearSolveBase]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "CommonSolve", "Compat", "ConcreteStructs", "DifferentiationInterface", "EnzymeCore", "FastClosures", "LinearAlgebra", "Markdown", "MaybeInplace", "Preferences", "Printf", "RecursiveArrayTools", "SciMLBase", "SciMLJacobianOperators", "SciMLLogging", "SciMLOperators", "SciMLStructures", "Setfield", "StaticArraysCore", "SymbolicIndexingInterface", "TimerOutputs"] +git-tree-sha1 = "a72dc6e5bba0fd9bb3bd9cc4abade8552d9fc982" +uuid = "be0214bd-f91f-a760-ac4e-3421ce2b2da0" +version = "2.4.0" + + [deps.NonlinearSolveBase.extensions] + NonlinearSolveBaseBandedMatricesExt = "BandedMatrices" + NonlinearSolveBaseChainRulesCoreExt = "ChainRulesCore" + NonlinearSolveBaseEnzymeExt = ["ChainRulesCore", "Enzyme"] + NonlinearSolveBaseForwardDiffExt = "ForwardDiff" + NonlinearSolveBaseLineSearchExt = "LineSearch" + NonlinearSolveBaseLinearSolveExt = "LinearSolve" + NonlinearSolveBaseMooncakeExt = "Mooncake" + NonlinearSolveBaseReverseDiffExt = "ReverseDiff" + NonlinearSolveBaseSparseArraysExt = "SparseArrays" + NonlinearSolveBaseSparseMatrixColoringsExt = "SparseMatrixColorings" + NonlinearSolveBaseTrackerExt = "Tracker" + + [deps.NonlinearSolveBase.weakdeps] + BandedMatrices = "aae01518-5342-5314-be14-df237901396f" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + LineSearch = "87fe0de2-c867-4266-b59a-2f0a94fc965b" + LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.NonlinearSolveFirstOrder]] +deps = ["ADTypes", "ArrayInterface", "CommonSolve", "ConcreteStructs", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLJacobianOperators", "Setfield", "StaticArraysCore"] +git-tree-sha1 = "872c32bc8a524e1a51bfc0a0cf72ff2a2f886226" +uuid = "5959db7a-ea39-4486-b5fe-2dd0bf03d60d" +version = "1.10.0" + +[[deps.NonlinearSolveQuasiNewton]] +deps = ["ArrayInterface", "CommonSolve", "ConcreteStructs", "LinearAlgebra", "LinearSolve", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SciMLOperators", "StaticArraysCore"] +git-tree-sha1 = "21596ddee2e18c95bfe92803988611ab6daa9cfe" +uuid = "9a2c21bd-3a47-402d-9113-8faf9a0ee114" +version = "1.11.0" +weakdeps = ["ForwardDiff"] + + [deps.NonlinearSolveQuasiNewton.extensions] + NonlinearSolveQuasiNewtonForwardDiffExt = "ForwardDiff" + +[[deps.NonlinearSolveSpectralMethods]] +deps = ["CommonSolve", "ConcreteStructs", "LineSearch", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "eafd027b5cd768f19bb5de76c0e908a9065ddd36" +uuid = "26075421-4e9a-44e1-8bd1-420ed7ad02b2" +version = "1.6.0" +weakdeps = ["ForwardDiff"] + + [deps.NonlinearSolveSpectralMethods.extensions] + NonlinearSolveSpectralMethodsForwardDiffExt = "ForwardDiff" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.6+0" + +[[deps.OpenBLAS32_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "ece4587683695fe4c5f20e990da0ed7e83c351e7" +uuid = "656ef2d0-ae68-5445-9ca0-591084a874a2" +version = "0.3.29+0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.29+0" + +[[deps.OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" +version = "0.8.7+0" + +[[deps.OpenSSL]] +deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "NetworkOptions", "OpenSSL_jll", "Sockets"] +git-tree-sha1 = "386b47442468acfb1add94bf2d85365dea10cbab" +uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" +version = "1.6.0" + +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.5.1+0" + +[[deps.OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.6+0" + +[[deps.Optim]] +deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] +git-tree-sha1 = "61942645c38dd2b5b78e2082c9b51ab315315d10" +uuid = "429524aa-4258-5aef-a3af-852621145aeb" +version = "1.13.2" +weakdeps = ["MathOptInterface"] + + [deps.Optim.extensions] + OptimMOIExt = "MathOptInterface" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c392fc5dd032381919e3b22dd32d6443760ce7ea" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.5.2+0" + +[[deps.OrderedCollections]] +git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.1" + +[[deps.OrdinaryDiffEq]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "CommonSolve", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "ExponentialUtilities", "FastBroadcast", "FastClosures", "FillArrays", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "InteractiveUtils", "LineSearches", "LinearAlgebra", "LinearSolve", "Logging", "MacroTools", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqAdamsBashforthMoulton", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqDefault", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqExplicitRK", "OrdinaryDiffEqExponentialRK", "OrdinaryDiffEqExtrapolation", "OrdinaryDiffEqFIRK", "OrdinaryDiffEqFeagin", "OrdinaryDiffEqFunctionMap", "OrdinaryDiffEqHighOrderRK", "OrdinaryDiffEqIMEXMultistep", "OrdinaryDiffEqLinear", "OrdinaryDiffEqLowOrderRK", "OrdinaryDiffEqLowStorageRK", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqNordsieck", "OrdinaryDiffEqPDIRK", "OrdinaryDiffEqPRK", "OrdinaryDiffEqQPRK", "OrdinaryDiffEqRKN", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqSDIRK", "OrdinaryDiffEqSSPRK", "OrdinaryDiffEqStabilizedIRK", "OrdinaryDiffEqStabilizedRK", "OrdinaryDiffEqSymplecticRK", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "Polyester", "PreallocationTools", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "SimpleUnPack", "SparseArrays", "Static", "StaticArrayInterface", "StaticArrays", "TruncatedStacktraces"] +git-tree-sha1 = "89172157d16139165d470602f1e552484b357771" +uuid = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" +version = "6.103.0" + +[[deps.OrdinaryDiffEqAdamsBashforthMoulton]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqLowOrderRK", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "09aae1486c767caa6bce9de892455cbdf5a6fbc8" +uuid = "89bda076-bce5-4f1c-845f-551c83cdda9a" +version = "1.5.0" + +[[deps.OrdinaryDiffEqBDF]] +deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqSDIRK", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays", "TruncatedStacktraces"] +git-tree-sha1 = "ce8db53fd1e4e41c020fd53961e7314f75e4c21c" +uuid = "6ad6398a-0878-4a85-9266-38940aa047c8" +version = "1.10.1" + +[[deps.OrdinaryDiffEqCore]] +deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DocStringExtensions", "EnumX", "FastBroadcast", "FastClosures", "FastPower", "FillArrays", "FunctionWrappersWrappers", "InteractiveUtils", "LinearAlgebra", "Logging", "MacroTools", "MuladdMacro", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleUnPack", "Static", "StaticArrayInterface", "StaticArraysCore", "SymbolicIndexingInterface", "TruncatedStacktraces"] +git-tree-sha1 = "4b68f9ca0cfa68cb9ee544df96391d47ca0e62a9" +uuid = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" +version = "1.36.0" + + [deps.OrdinaryDiffEqCore.extensions] + OrdinaryDiffEqCoreEnzymeCoreExt = "EnzymeCore" + OrdinaryDiffEqCoreMooncakeExt = "Mooncake" + + [deps.OrdinaryDiffEqCore.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + +[[deps.OrdinaryDiffEqDefault]] +deps = ["ADTypes", "DiffEqBase", "EnumX", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqBDF", "OrdinaryDiffEqCore", "OrdinaryDiffEqRosenbrock", "OrdinaryDiffEqTsit5", "OrdinaryDiffEqVerner", "PrecompileTools", "Preferences", "Reexport", "SciMLBase"] +git-tree-sha1 = "7d5ddeee97e1bdcc848f1397cbc3d03bd57f33e7" +uuid = "50262376-6c5a-4cf5-baba-aaf4f84d72d7" +version = "1.8.0" + +[[deps.OrdinaryDiffEqDifferentiation]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqCore", "SciMLBase", "SciMLOperators", "SparseMatrixColorings", "StaticArrayInterface", "StaticArrays"] +git-tree-sha1 = "320b5f3e4e61ca0ad863c63c803f69973ba6efce" +uuid = "4302a76b-040a-498a-8c04-15b101fed76b" +version = "1.16.1" +weakdeps = ["SparseArrays"] + + [deps.OrdinaryDiffEqDifferentiation.extensions] + OrdinaryDiffEqDifferentiationSparseArraysExt = "SparseArrays" + +[[deps.OrdinaryDiffEqExplicitRK]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"] +git-tree-sha1 = "4c0633f587395d7aaec0679dc649eb03fcc74e73" +uuid = "9286f039-9fbf-40e8-bf65-aa933bdc4db0" +version = "1.4.0" + +[[deps.OrdinaryDiffEqExponentialRK]] +deps = ["ADTypes", "DiffEqBase", "ExponentialUtilities", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "RecursiveArrayTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "3b81416ff11e55ea0ae7b449efc818256d9d450b" +uuid = "e0540318-69ee-4070-8777-9e2de6de23de" +version = "1.8.0" + +[[deps.OrdinaryDiffEqExtrapolation]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "FastPower", "LinearSolve", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "9e1b11cf448a2c1bca640103c1c848a20aa2f967" +uuid = "becaefa8-8ca2-5cf9-886d-c06f3d2bd2c4" +version = "1.9.0" + +[[deps.OrdinaryDiffEqFIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "FastGaussQuadrature", "FastPower", "LinearAlgebra", "LinearSolve", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators"] +git-tree-sha1 = "b968d66de3de5ffcf18544bc202ca792bad20710" +uuid = "5960d6e9-dd7a-4743-88e7-cf307b64f125" +version = "1.16.0" + +[[deps.OrdinaryDiffEqFeagin]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "815b54211201ec42b8829e0275ab3c9632d16cbe" +uuid = "101fe9f7-ebb6-4678-b671-3a81e7194747" +version = "1.4.0" + +[[deps.OrdinaryDiffEqFunctionMap]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "fe750e4b8c1b1b9e1c1319ff2e052e83ad57b3ac" +uuid = "d3585ca7-f5d3-4ba6-8057-292ed1abd90f" +version = "1.5.0" + +[[deps.OrdinaryDiffEqHighOrderRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "42096f72136078fa02804515f1748ddeb1f0d47d" +uuid = "d28bc4f8-55e1-4f49-af69-84c1a99f0f58" +version = "1.5.0" + +[[deps.OrdinaryDiffEqIMEXMultistep]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Reexport", "SciMLBase"] +git-tree-sha1 = "a5dcd75959dada0005b1707a5ca9359faa1734ba" +uuid = "9f002381-b378-40b7-97a6-27a27c83f129" +version = "1.7.0" + +[[deps.OrdinaryDiffEqLinear]] +deps = ["DiffEqBase", "ExponentialUtilities", "LinearAlgebra", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators"] +git-tree-sha1 = "925fc0136e8128fd19abf126e9358ec1f997390f" +uuid = "521117fe-8c41-49f8-b3b6-30780b3f0fb5" +version = "1.6.0" + +[[deps.OrdinaryDiffEqLowOrderRK]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "3cc4987c8e4725276b55a52e08b56ded4862917e" +uuid = "1344f307-1e59-4825-a18e-ace9aa3fa4c6" +version = "1.6.0" + +[[deps.OrdinaryDiffEqLowStorageRK]] +deps = ["Adapt", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "StaticArrays"] +git-tree-sha1 = "e6bd0a7fb6643a57b06a90415608a81aaf7bd772" +uuid = "b0944070-b475-4768-8dec-fb6eb410534d" +version = "1.7.0" + +[[deps.OrdinaryDiffEqNonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "FastClosures", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MuladdMacro", "NonlinearSolve", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "PreallocationTools", "RecursiveArrayTools", "SciMLBase", "SciMLOperators", "SciMLStructures", "SimpleNonlinearSolve", "StaticArrays"] +git-tree-sha1 = "f59c1c07cfa674c1d3f5dd386c4274d9bc2be221" +uuid = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8" +version = "1.15.0" + +[[deps.OrdinaryDiffEqNordsieck]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqTsit5", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "c90aa7fa0d725472c4098096adf6a08266c2f682" +uuid = "c9986a66-5c92-4813-8696-a7ec84c806c8" +version = "1.4.0" + +[[deps.OrdinaryDiffEqPDIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Polyester", "Reexport", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "9d599d2eafdf74ab26ea6bf3feb28183a2ade143" +uuid = "5dd0a6cf-3d4b-4314-aa06-06d4e299bc89" +version = "1.6.0" + +[[deps.OrdinaryDiffEqPRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "Reexport", "SciMLBase"] +git-tree-sha1 = "8e35132689133255be6d63df4190b5fc97b6cf2b" +uuid = "5b33eab2-c0f1-4480-b2c3-94bc1e80bda1" +version = "1.4.0" + +[[deps.OrdinaryDiffEqQPRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "63fb643a956b27cd0e33a3c6d910c3c118082e0f" +uuid = "04162be5-8125-4266-98ed-640baecc6514" +version = "1.4.0" + +[[deps.OrdinaryDiffEqRKN]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "a31c41f9dbea7c7179c6e544c25c7e144d63868c" +uuid = "af6ede74-add8-4cfd-b1df-9a4dbb109d7a" +version = "1.5.0" + +[[deps.OrdinaryDiffEqRosenbrock]] +deps = ["ADTypes", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static"] +git-tree-sha1 = "f34bc2f58656843596d09a4c4de8c20724ebc2f1" +uuid = "43230ef6-c299-4910-a778-202eb28ce4ce" +version = "1.18.1" + +[[deps.OrdinaryDiffEqSDIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"] +git-tree-sha1 = "20caa72c004414435fb5769fadb711e96ed5bcd4" +uuid = "2d112036-d095-4a1e-ab9a-08536f3ecdbf" +version = "1.7.0" + +[[deps.OrdinaryDiffEqSSPRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "StaticArrays"] +git-tree-sha1 = "3bce87977264916bd92455754ab336faec68bf8a" +uuid = "669c94d9-1f4b-4b64-b377-1aa079aa2388" +version = "1.7.0" + +[[deps.OrdinaryDiffEqStabilizedIRK]] +deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqStabilizedRK", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "75abe7462f4b0b2a2463bb512c8a5458bbd39185" +uuid = "e3e12d00-db14-5390-b879-ac3dd2ef6296" +version = "1.6.0" + +[[deps.OrdinaryDiffEqStabilizedRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "SciMLBase", "StaticArrays"] +git-tree-sha1 = "7e94d3d1b3528b4bcf9e0248198ee0a2fd65a697" +uuid = "358294b1-0aab-51c3-aafe-ad5ab194a2ad" +version = "1.4.0" + +[[deps.OrdinaryDiffEqSymplecticRK]] +deps = ["DiffEqBase", "FastBroadcast", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "RecursiveArrayTools", "Reexport", "SciMLBase"] +git-tree-sha1 = "e8dd5ab225287947016dc144a5ded1fb83885638" +uuid = "fa646aed-7ef9-47eb-84c4-9443fc8cbfa8" +version = "1.7.0" + +[[deps.OrdinaryDiffEqTsit5]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "TruncatedStacktraces"] +git-tree-sha1 = "778c7d379265f17f40dbe9aaa6f6a2a08bc7fa3e" +uuid = "b1df2697-797e-41e3-8120-5422d3b24e4a" +version = "1.5.0" + +[[deps.OrdinaryDiffEqVerner]] +deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "Static", "TruncatedStacktraces"] +git-tree-sha1 = "185578fa7c38119d4318326f9375f1cba0f0ce53" +uuid = "79d7bb75-1356-48c1-b8c0-6832512096c2" +version = "1.6.0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.44.0+1" + +[[deps.PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "d922b4d80d1e12c658da7785e754f4796cc1d60d" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.36" +weakdeps = ["StatsBase"] + + [deps.PDMats.extensions] + StatsBaseExt = "StatsBase" + +[[deps.Pango_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1f7f9bbd5f7a2e5a9f7d96e51c9754454ea7f60b" +uuid = "36c8627f-9965-5494-a995-c6b170f724f3" +version = "1.56.4+0" + +[[deps.Parameters]] +deps = ["OrderedCollections", "UnPack"] +git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" +uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" +version = "0.12.3" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.3" + +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.12.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" + +[[deps.PlotThemes]] +deps = ["PlotUtils", "Statistics"] +git-tree-sha1 = "41031ef3a1be6f5bbbf3e8073f210556daeae5ca" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "3.3.0" + +[[deps.PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] +git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.4.4" + +[[deps.Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "TOML", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "12ce661880f8e309569074a61d3767e5756a199f" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.41.1" + + [deps.Plots.extensions] + FileIOExt = "FileIO" + GeometryBasicsExt = "GeometryBasics" + IJuliaExt = "IJulia" + ImageInTerminalExt = "ImageInTerminal" + UnitfulExt = "Unitful" + + [deps.Plots.weakdeps] + FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" + GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" + IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" + ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + +[[deps.Pluto]] +deps = ["Base64", "Configurations", "Dates", "Downloads", "ExpressionExplorer", "FileWatching", "GracefulPkg", "HTTP", "HypertextLiteral", "InteractiveUtils", "LRUCache", "Logging", "LoggingExtras", "MIMEs", "Malt", "Markdown", "MsgPack", "Pkg", "PlutoDependencyExplorer", "PrecompileSignatures", "PrecompileTools", "REPL", "Random", "RegistryInstances", "RelocatableFolders", "SHA", "Scratch", "Sockets", "TOML", "Tables", "URIs", "UUIDs"] +git-tree-sha1 = "1c1ce8bab7f044956fc12c355f5dff190afaa421" +uuid = "c3e4b0f8-55cb-11ea-2926-15256bba5781" +version = "0.20.20" + +[[deps.PlutoDependencyExplorer]] +deps = ["ExpressionExplorer", "InteractiveUtils", "Markdown"] +git-tree-sha1 = "c3e5073a977b1c58b2d55c1ec187c3737e64e6af" +uuid = "72656b73-756c-7461-726b-72656b6b696b" +version = "1.2.2" + +[[deps.PlutoTeachingTools]] +deps = ["Downloads", "HypertextLiteral", "Latexify", "Markdown", "PlutoUI"] +git-tree-sha1 = "dacc8be63916b078b592806acd13bb5e5137d7e9" +uuid = "661c6b06-c737-4d37-b85c-46df65de6f69" +version = "0.4.6" + +[[deps.PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Downloads", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] +git-tree-sha1 = "3faff84e6f97a7f18e0dd24373daa229fd358db5" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.73" + +[[deps.PoissonRandom]] +deps = ["LogExpFunctions", "Random"] +git-tree-sha1 = "67afbcbe9e184d6729a92a022147ed4cf972ca7b" +uuid = "e409e4f3-bfea-5376-8464-e040bb5c01ab" +version = "0.4.7" + +[[deps.Polyester]] +deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Static", "StaticArrayInterface", "StrideArraysCore", "ThreadingUtilities"] +git-tree-sha1 = "6f7cd22a802094d239824c57d94c8e2d0f7cfc7d" +uuid = "f517fe37-dbe3-4b94-8317-1923a5111588" +version = "0.7.18" + +[[deps.PolyesterWeave]] +deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] +git-tree-sha1 = "645bed98cd47f72f67316fd42fc47dee771aefcd" +uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" +version = "0.2.2" + +[[deps.PositiveFactorizations]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" +uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" +version = "0.2.4" + +[[deps.PreallocationTools]] +deps = ["Adapt", "ArrayInterface", "PrecompileTools"] +git-tree-sha1 = "c05b4c6325262152483a1ecb6c69846d2e01727b" +uuid = "d236fae5-4411-538c-8e31-a6e3d9e00b46" +version = "0.4.34" + + [deps.PreallocationTools.extensions] + PreallocationToolsForwardDiffExt = "ForwardDiff" + PreallocationToolsReverseDiffExt = "ReverseDiff" + PreallocationToolsSparseConnectivityTracerExt = "SparseConnectivityTracer" + + [deps.PreallocationTools.weakdeps] + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" + +[[deps.PrecompileSignatures]] +git-tree-sha1 = "18ef344185f25ee9d51d80e179f8dad33dc48eb1" +uuid = "91cefc8d-f054-46dc-8f8c-26e11d7c5411" +version = "3.0.3" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.3.3" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "0f27480397253da18fe2c12a4ba4eb9eb208bf3d" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.5.0" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.Profile]] +deps = ["StyledStrings"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +version = "1.11.0" + +[[deps.PtrArrays]] +git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" +version = "1.3.0" + +[[deps.Qt6Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] +git-tree-sha1 = "34f7e5d2861083ec7596af8b8c092531facf2192" +uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" +version = "6.8.2+2" + +[[deps.Qt6Declarative_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6ShaderTools_jll"] +git-tree-sha1 = "da7adf145cce0d44e892626e647f9dcbe9cb3e10" +uuid = "629bc702-f1f5-5709-abd5-49b8460ea067" +version = "6.8.2+1" + +[[deps.Qt6ShaderTools_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll"] +git-tree-sha1 = "9eca9fc3fe515d619ce004c83c31ffd3f85c7ccf" +uuid = "ce943373-25bb-56aa-8eca-768745ed7b5a" +version = "6.8.2+1" + +[[deps.Qt6Wayland_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Qt6Base_jll", "Qt6Declarative_jll"] +git-tree-sha1 = "8f528b0851b5b7025032818eb5abbeb8a736f853" +uuid = "e99dba38-086e-5de3-a5b1-6e4c66e897c3" +version = "6.8.2+2" + +[[deps.QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.11.2" + + [deps.QuadGK.extensions] + QuadGKEnzymeExt = "Enzyme" + + [deps.QuadGK.weakdeps] + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + +[[deps.REPL]] +deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.Random123]] +deps = ["Random", "RandomNumbers"] +git-tree-sha1 = "dbe5fd0b334694e905cb9fda73cd8554333c46e2" +uuid = "74087812-796a-5b5d-8853-05524746bad3" +version = "1.7.1" + +[[deps.RandomNumbers]] +deps = ["Random"] +git-tree-sha1 = "c6ec94d2aaba1ab2ff983052cf6a606ca5985902" +uuid = "e6cf234a-135c-5ec9-84dd-332b85af5143" +version = "1.6.0" + +[[deps.RecipesBase]] +deps = ["PrecompileTools"] +git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.3.4" + +[[deps.RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] +git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.6.12" + +[[deps.RecursiveArrayTools]] +deps = ["Adapt", "ArrayInterface", "DocStringExtensions", "GPUArraysCore", "LinearAlgebra", "RecipesBase", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "51bdb23afaaa551f923a0e990f7c44a4451a26f1" +uuid = "731186ca-8d62-57ce-b412-fbd966d074cd" +version = "3.39.0" + + [deps.RecursiveArrayTools.extensions] + RecursiveArrayToolsFastBroadcastExt = "FastBroadcast" + RecursiveArrayToolsForwardDiffExt = "ForwardDiff" + RecursiveArrayToolsKernelAbstractionsExt = "KernelAbstractions" + RecursiveArrayToolsMeasurementsExt = "Measurements" + RecursiveArrayToolsMonteCarloMeasurementsExt = "MonteCarloMeasurements" + RecursiveArrayToolsReverseDiffExt = ["ReverseDiff", "Zygote"] + RecursiveArrayToolsSparseArraysExt = ["SparseArrays"] + RecursiveArrayToolsStructArraysExt = "StructArrays" + RecursiveArrayToolsTablesExt = ["Tables"] + RecursiveArrayToolsTrackerExt = "Tracker" + RecursiveArrayToolsZygoteExt = "Zygote" + + [deps.RecursiveArrayTools.weakdeps] + FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.RegistryInstances]] +deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] +git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" +uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" +version = "0.1.0" + +[[deps.RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "1.0.1" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + +[[deps.ResettableStacks]] +deps = ["StaticArrays"] +git-tree-sha1 = "256eeeec186fa7f26f2801732774ccf277f05db9" +uuid = "ae5879a3-cd67-5da8-be7f-38c6eb64a37b" +version = "1.1.1" + +[[deps.Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.9.0" + +[[deps.Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.5.1+0" + +[[deps.RuntimeGeneratedFunctions]] +deps = ["ExprTools", "SHA", "Serialization"] +git-tree-sha1 = "2f609ec2295c452685d3142bc4df202686e555d2" +uuid = "7e49a35a-f44a-4d26-94aa-eba1b4ca6b47" +version = "0.5.16" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SIMDTypes]] +git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" +uuid = "94e857df-77ce-4151-89e5-788b33177be4" +version = "0.1.0" + +[[deps.SPRAL_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "Libdl", "METIS_jll", "libblastrampoline_jll"] +git-tree-sha1 = "4f9833187a65ead66ed1907b44d5f20606282e3f" +uuid = "319450e9-13b8-58e8-aa9f-8fd1420848ab" +version = "2025.5.20+0" + +[[deps.SciMLBase]] +deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PreallocationTools", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLLogging", "SciMLOperators", "SciMLPublic", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"] +git-tree-sha1 = "dc93eb05a8101a58c844e0e20a47f8a92be33048" +uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462" +version = "2.127.0" + + [deps.SciMLBase.extensions] + SciMLBaseChainRulesCoreExt = "ChainRulesCore" + SciMLBaseDifferentiationInterfaceExt = "DifferentiationInterface" + SciMLBaseDistributionsExt = "Distributions" + SciMLBaseEnzymeExt = "Enzyme" + SciMLBaseForwardDiffExt = "ForwardDiff" + SciMLBaseMLStyleExt = "MLStyle" + SciMLBaseMakieExt = "Makie" + SciMLBaseMeasurementsExt = "Measurements" + SciMLBaseMonteCarloMeasurementsExt = "MonteCarloMeasurements" + SciMLBaseMooncakeExt = "Mooncake" + SciMLBasePartialFunctionsExt = "PartialFunctions" + SciMLBasePyCallExt = "PyCall" + SciMLBasePythonCallExt = "PythonCall" + SciMLBaseRCallExt = "RCall" + SciMLBaseReverseDiffExt = "ReverseDiff" + SciMLBaseTrackerExt = "Tracker" + SciMLBaseZygoteExt = ["Zygote", "ChainRulesCore"] + + [deps.SciMLBase.weakdeps] + ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + DifferentiationInterface = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63" + Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" + Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + MLStyle = "d8e11817-5142-5d16-987a-aa16d5891078" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" + Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + MonteCarloMeasurements = "0987c9cc-fe09-11e8-30f0-b96dd679fdca" + Mooncake = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" + PartialFunctions = "570af359-4316-4cb7-8c74-252c00c2016b" + PyCall = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" + PythonCall = "6099a3de-0909-46bc-b1f4-468b9a2dfc0d" + RCall = "6f49c342-dc21-5d91-9882-a32aef131414" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" + +[[deps.SciMLJacobianOperators]] +deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DifferentiationInterface", "FastClosures", "LinearAlgebra", "SciMLBase", "SciMLOperators"] +git-tree-sha1 = "a273b291c90909ba6fe08402dd68e09aae423008" +uuid = "19f34311-ddf3-4b8b-af20-060888a46c0e" +version = "0.1.11" + +[[deps.SciMLLogging]] +deps = ["Logging", "LoggingExtras", "Preferences"] +git-tree-sha1 = "70d5b2fc50fde8d868f906b54045eb12b490e867" +uuid = "a6db7da4-7206-11f0-1eab-35f2a5dbe1d1" +version = "1.5.0" + +[[deps.SciMLOperators]] +deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"] +git-tree-sha1 = "5dfddb5e9699a268937a6f2a71c867a2ce3c6458" +uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961" +version = "1.11.0" +weakdeps = ["SparseArrays", "StaticArraysCore"] + + [deps.SciMLOperators.extensions] + SciMLOperatorsSparseArraysExt = "SparseArrays" + SciMLOperatorsStaticArraysCoreExt = "StaticArraysCore" + +[[deps.SciMLPublic]] +git-tree-sha1 = "ed647f161e8b3f2973f24979ec074e8d084f1bee" +uuid = "431bcebd-1456-4ced-9d72-93c2757fff0b" +version = "1.0.0" + +[[deps.SciMLStructures]] +deps = ["ArrayInterface"] +git-tree-sha1 = "566c4ed301ccb2a44cbd5a27da5f885e0ed1d5df" +uuid = "53ae85a6-f571-4167-b2af-e1d143709226" +version = "1.7.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.3.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Setfield]] +deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] +git-tree-sha1 = "c5391c6ace3bc430ca630251d02ea9687169ca68" +uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" +version = "1.1.2" + +[[deps.SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +version = "1.11.0" + +[[deps.Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[deps.SimpleBufferStream]] +git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" +uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" +version = "1.2.0" + +[[deps.SimpleNonlinearSolve]] +deps = ["ADTypes", "ArrayInterface", "BracketingNonlinearSolve", "CommonSolve", "ConcreteStructs", "DifferentiationInterface", "FastClosures", "FiniteDiff", "ForwardDiff", "LineSearch", "LinearAlgebra", "MaybeInplace", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "Setfield", "StaticArraysCore"] +git-tree-sha1 = "8825064775bf4ae0f22d04ea63979d8c868fd510" +uuid = "727e6d20-b764-4bd8-a329-72de5adea6c7" +version = "2.9.0" + + [deps.SimpleNonlinearSolve.extensions] + SimpleNonlinearSolveChainRulesCoreExt = "ChainRulesCore" + SimpleNonlinearSolveReverseDiffExt = "ReverseDiff" + SimpleNonlinearSolveTrackerExt = "Tracker" + + [deps.SimpleNonlinearSolve.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" + Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" + +[[deps.SimpleTraits]] +deps = ["InteractiveUtils", "MacroTools"] +git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" +uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" +version = "0.9.5" + +[[deps.SimpleUnPack]] +git-tree-sha1 = "58e6353e72cde29b90a69527e56df1b5c3d8c437" +uuid = "ce78b400-467f-4804-87d8-8f486da07d0a" +version = "1.1.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.2.2" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.12.0" + +[[deps.SparseConnectivityTracer]] +deps = ["ADTypes", "DocStringExtensions", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"] +git-tree-sha1 = "322365aa23098275562cbad6a1c2539ee40d9618" +uuid = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" +version = "1.1.3" + + [deps.SparseConnectivityTracer.extensions] + SparseConnectivityTracerChainRulesCoreExt = "ChainRulesCore" + SparseConnectivityTracerLogExpFunctionsExt = "LogExpFunctions" + SparseConnectivityTracerNNlibExt = "NNlib" + SparseConnectivityTracerNaNMathExt = "NaNMath" + SparseConnectivityTracerSpecialFunctionsExt = "SpecialFunctions" + + [deps.SparseConnectivityTracer.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688" + NNlib = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" + NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.SparseMatrixColorings]] +deps = ["ADTypes", "DocStringExtensions", "LinearAlgebra", "PrecompileTools", "Random", "SparseArrays"] +git-tree-sha1 = "6ed48d9a3b22417c765dc273ae3e1e4de035e7c8" +uuid = "0a514795-09f3-496d-8182-132a7b665d35" +version = "0.4.23" + + [deps.SparseMatrixColorings.extensions] + SparseMatrixColoringsCUDAExt = "CUDA" + SparseMatrixColoringsCliqueTreesExt = "CliqueTrees" + SparseMatrixColoringsColorsExt = "Colors" + SparseMatrixColoringsJuMPExt = ["JuMP", "MathOptInterface"] + + [deps.SparseMatrixColorings.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + CliqueTrees = "60701a23-6482-424a-84db-faee86b9b1f8" + Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" + JuMP = "4076af6c-e467-56ae-b986-b466b2749572" + MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" + +[[deps.SpecialFunctions]] +deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "f2685b435df2613e25fc10ad8c26dddb8640f547" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.6.1" +weakdeps = ["ChainRulesCore"] + + [deps.SpecialFunctions.extensions] + SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" + +[[deps.StableRNGs]] +deps = ["Random"] +git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" +version = "1.0.3" + +[[deps.Static]] +deps = ["CommonWorldInvalidations", "IfElse", "PrecompileTools", "SciMLPublic"] +git-tree-sha1 = "49440414711eddc7227724ae6e570c7d5559a086" +uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" +version = "1.3.1" + +[[deps.StaticArrayInterface]] +deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Static"] +git-tree-sha1 = "96381d50f1ce85f2663584c8e886a6ca97e60554" +uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" +version = "1.8.0" + + [deps.StaticArrayInterface.extensions] + StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" + StaticArrayInterfaceStaticArraysExt = "StaticArrays" + + [deps.StaticArrayInterface.weakdeps] + OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "b8693004b385c842357406e3af647701fe783f98" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.15" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.4" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + +[[deps.StatsAPI]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.7.1" + +[[deps.StatsBase]] +deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "a136f98cefaf3e2924a66bd75173d1c891ab7453" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.34.7" + +[[deps.StatsFuns]] +deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "1.5.2" +weakdeps = ["ChainRulesCore", "InverseFunctions"] + + [deps.StatsFuns.extensions] + StatsFunsChainRulesCoreExt = "ChainRulesCore" + StatsFunsInverseFunctionsExt = "InverseFunctions" + +[[deps.SteadyStateDiffEq]] +deps = ["ConcreteStructs", "DiffEqBase", "DiffEqCallbacks", "LinearAlgebra", "NonlinearSolveBase", "Reexport", "SciMLBase"] +git-tree-sha1 = "10947da4f1b823ed43890bddda7e8d19dde89e2e" +uuid = "9672c7b4-1e72-59bd-8a11-6ac3964bc41f" +version = "2.8.0" + +[[deps.StochasticDiffEq]] +deps = ["ADTypes", "Adapt", "ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqNoiseProcess", "DocStringExtensions", "FastPower", "FiniteDiff", "ForwardDiff", "JumpProcesses", "LevyArea", "LinearAlgebra", "Logging", "MuladdMacro", "NLsolve", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "Random", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SparseArrays", "StaticArrays", "UnPack"] +git-tree-sha1 = "a7d5d87185450b61a95000547c85401ffd8e6e42" +uuid = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" +version = "6.84.0" + +[[deps.StrideArraysCore]] +deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface", "ThreadingUtilities"] +git-tree-sha1 = "83151ba8065a73f53ca2ae98bc7274d817aa30f2" +uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da" +version = "0.5.8" + +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.11.0" + +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + +[[deps.SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[deps.SuiteSparse32_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "libblastrampoline_jll"] +git-tree-sha1 = "dc199915b7d2d1a25c8b66968e905f9cc671c1be" +uuid = "ca45d3f4-326b-53b0-9957-23b75aacb3f2" +version = "7.11.0+0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.8.3+2" + +[[deps.Sundials]] +deps = ["Accessors", "ArrayInterface", "CEnum", "DataStructures", "DiffEqBase", "Libdl", "LinearAlgebra", "LinearSolve", "Logging", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase", "SparseArrays", "Sundials_jll", "SymbolicIndexingInterface"] +git-tree-sha1 = "2d27edb89b7c555a57b8f22bfde92d6828d11cee" +uuid = "c3572dad-4567-51f8-b174-8c6c989267f4" +version = "5.1.0" + +[[deps.Sundials_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "OpenBLAS32_jll", "SuiteSparse32_jll"] +git-tree-sha1 = "a872f379c836e9cb5734485ca0681b192a59b98b" +uuid = "fb77eaff-e24c-56d4-86b1-d163f2edb164" +version = "7.5.0+0" + +[[deps.SymbolicIndexingInterface]] +deps = ["Accessors", "ArrayInterface", "RuntimeGeneratedFunctions", "StaticArraysCore"] +git-tree-sha1 = "94c58884e013efff548002e8dc2fdd1cb74dfce5" +uuid = "2efcf032-c050-4f8e-a9bb-153293bab1f5" +version = "0.3.46" + + [deps.SymbolicIndexingInterface.extensions] + SymbolicIndexingInterfacePrettyTablesExt = "PrettyTables" + + [deps.SymbolicIndexingInterface.weakdeps] + PrettyTables = "08abe8d2-0d0c-5749-adfa-8a2ac140af0d" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[deps.Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] +git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.12.1" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.ThreadingUtilities]] +deps = ["ManualMemory"] +git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85" +uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" +version = "0.5.5" + +[[deps.TimerOutputs]] +deps = ["ExprTools", "Printf"] +git-tree-sha1 = "3748bd928e68c7c346b52125cf41fff0de6937d0" +uuid = "a759f4b9-e2f1-59dc-863e-4aeb61b1ea8f" +version = "0.5.29" + + [deps.TimerOutputs.extensions] + FlameGraphsExt = "FlameGraphs" + + [deps.TimerOutputs.weakdeps] + FlameGraphs = "08572546-2f56-4bcf-ba4e-bab62c3a3f89" + +[[deps.TranscodingStreams]] +git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" +version = "0.11.3" + +[[deps.Tricks]] +git-tree-sha1 = "311349fd1c93a31f783f977a71e8b062a57d4101" +uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" +version = "0.1.13" + +[[deps.TruncatedStacktraces]] +deps = ["InteractiveUtils", "MacroTools", "Preferences"] +git-tree-sha1 = "ea3e54c2bdde39062abf5a9758a23735558705e1" +uuid = "781d530d-4396-4725-bb49-402e4bee1e77" +version = "1.4.0" + +[[deps.URIs]] +git-tree-sha1 = "bef26fb046d031353ef97a82e3fdb6afe7f21b1a" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.6.1" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.UnPack]] +git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" +uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" +version = "1.0.2" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[deps.Unzip]] +git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.2.0" + +[[deps.Vulkan_Loader_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] +git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" +uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" +version = "1.3.243+0" + +[[deps.Wayland_jll]] +deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "96478df35bbc2f3e1e791bc7a3d0eeee559e60e9" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.24.0+0" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "80d3930c6347cfce7ccf96bd3bafdf079d9c0390" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.9+0" + +[[deps.XZ_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" +version = "5.8.1+0" + +[[deps.Xorg_libICE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a3ea76ee3f4facd7a64684f9af25310825ee3668" +uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" +version = "1.1.2+0" + +[[deps.Xorg_libSM_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] +git-tree-sha1 = "9c7ad99c629a44f81e7799eb05ec2746abb5d588" +uuid = "c834827a-8449-5923-a945-d239c165b7dd" +version = "1.2.6+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.12+0" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.13+0" + +[[deps.Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "6c74ca84bbabc18c4547014765d194ff0b4dc9da" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.4+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.6+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.7+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.2+0" + +[[deps.Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "a376af5c7ae60d29825164db40787f15c80c7c54" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.8.3+0" + +[[deps.Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll"] +git-tree-sha1 = "a5bc75478d323358a90dc36766f3c99ba7feb024" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.6+0" + +[[deps.Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "aff463c82a773cb86061bce8d53a0d976854923e" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.5+0" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.12+0" + +[[deps.Xorg_libpciaccess_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "4909eb8f1cbf6bd4b1c30dd18b2ead9019ef2fad" +uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e" +version = "0.18.1+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] +git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.1+0" + +[[deps.Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "e3150c7400c41e207012b41659591f083f3ef795" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.3+0" + +[[deps.Xorg_xcb_util_cursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] +git-tree-sha1 = "9750dc53819eba4e9a20be42349a6d3b86c7cdf8" +uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" +version = "0.1.6+0" + +[[deps.Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f4fc02e384b74418679983a97385644b67e1263b" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll"] +git-tree-sha1 = "68da27247e7d8d8dafd1fcf0c3654ad6506f5f97" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "44ec54b0e2acd408b0fb361e1e9244c60c9c3dd4" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.1+0" + +[[deps.Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "5b0263b6d080716a02544c55fdff2c8d7f9a16a0" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.10+0" + +[[deps.Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_jll"] +git-tree-sha1 = "f233c83cad1fa0e70b7771e0e21b061a116f2763" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.2+0" + +[[deps.Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "801a858fc9fb90c11ffddee1801bb06a738bda9b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.7+0" + +[[deps.Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "00af7ebdc563c9217ecc67776d1bbf037dbcebf4" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.44.0+0" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.3.1+2" + +[[deps.Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.7+1" + +[[deps.eudev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c3b0e6196d50eab0c5ed34021aaa0bb463489510" +uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" +version = "3.2.14+0" + +[[deps.fzf_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b6a34e0e0960190ac2a4363a1bd003504772d631" +uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" +version = "0.61.1+0" + +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "371cc681c00a3ccc3fbc5c0fb91f58ba9bec1ecf" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.13.1+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.17.4+0" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.15.0+0" + +[[deps.libdecor_jll]] +deps = ["Artifacts", "Dbus_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pango_jll", "Wayland_jll", "xkbcommon_jll"] +git-tree-sha1 = "9bf7903af251d2050b467f76bdbe57ce541f7f4f" +uuid = "1183f4f0-6f2a-5f1a-908b-139f9cdfea6f" +version = "0.2.2+0" + +[[deps.libevdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "56d643b57b188d30cccc25e331d416d3d358e557" +uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" +version = "1.13.4+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.4+0" + +[[deps.libinput_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "eudev_jll", "libevdev_jll", "mtdev_jll"] +git-tree-sha1 = "91d05d7f4a9f67205bd6cf395e488009fe85b499" +uuid = "36db933b-70db-51c0-b978-0f229ee0e533" +version = "1.28.1+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "07b6a107d926093898e82b3b1db657ebe33134ec" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.50+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] +git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.8+0" + +[[deps.mtdev_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "b4d631fd51f2e9cdd93724ae25b2efc198b059b1" +uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" +version = "1.1.7+0" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.64.0+1" + +[[deps.oneTBB_jll]] +deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] +git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" +uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" +version = "2022.0.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.5.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "10164.0.1+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "4.1.0+0" + +[[deps.xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "fbf139bce07a534df0e699dbb5f5cc9346f95cc1" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "1.9.2+0" diff --git a/class15/Project.toml b/class15/Project.toml new file mode 100644 index 0000000..6b0d623 --- /dev/null +++ b/class15/Project.toml @@ -0,0 +1,9 @@ +[deps] +Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +PlutoTeachingTools = "661c6b06-c737-4d37-b85c-46df65de6f69" +MarkdownLiteral = "736d6165-7244-6769-4267-6b50796e6954" +JuMP = "4076af6c-e467-56ae-b986-b466b2749572" +Ipopt = "b6b21f68-93f8-5de0-b562-5493be1d77c9" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" diff --git a/class15/class15.html b/class15/class15.html new file mode 100644 index 0000000..44a2e01 --- /dev/null +++ b/class15/class15.html @@ -0,0 +1,19 @@ + + + + + + + +
\ No newline at end of file diff --git a/class15/class15.jl b/class15/class15.jl new file mode 100644 index 0000000..1a4ee90 --- /dev/null +++ b/class15/class15.jl @@ -0,0 +1,1537 @@ +### A Pluto.jl notebook ### +# v0.20.20 + +using Markdown +using InteractiveUtils + +macro bind(def, element) + #! format: off + return quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end + #! format: on +end + +# ╔═╡ 4866207c-0894-4340-a18b-72f8e1204424 +begin + class_dir = @__DIR__ + import Pkg + Pkg.activate(".") + Pkg.instantiate() + using PlutoUI + using PlutoTeachingTools + using MarkdownLiteral +end + +# ╔═╡ a1b2c3d4-0894-4340-a18b-72f8e1204425 +begin + using JuMP + using Ipopt + using Plots + using DifferentialEquations +end + +# ╔═╡ e6aa5227-91bd-4cec-9448-24384708a305 +ChooseDisplayMode() + +# ╔═╡ 19dac419-2df3-4878-b7da-608e8ec1e53b +md""" +| | | | +|-----------:|:--|:------------------| +| Lecturer | : | Shuaicheng Tong | +| Topic | : | Dynamic Optimal Control of Power Systems | +""" + +# ╔═╡ 8ed6af99-1c5d-4d27-b60d-17d2e6c6ceff +md""" +## Chapter Outline + +This chapter motivates the need for optimization and control of power systems by introducing the **Economic Dispatch (ED)** and **Optimal Power Flow (OPF)** problems and analyzing the physical behaviors they capture in power system. + +We progressively move from solving *static optimization* problems to augmenting them with *dynamic optimal control* constraints as approaches to analyze and understand power systems. + +**Topics covered:** +- **Transients and Transient Stability–Constrained OPF (TSC-OPF):** + What are transients, their physical behaviors, and how they are factored into stability analysis of energy systems via the TSC-OPF formulation. + +- **Generator Swing Equations:** + The physical foundation of synchronous machines — describes how mechanical torque and electrical power control frequency and machine responses to frequency changes. + +- **Inverter Control Models:** + Grid-following vs. grid-forming inverters, and how virtual inertia control emulates synchronous generator dynamics for renewables. + +- **Dynamic Load Models:** + Representations of demand that vary with voltage and frequency instead of a fixed a quantity, influencing both stability and control. + +> 🧭 **Overall goal:** +> To connect steady-state optimization (ED/DC-OPF) with **dynamic optimal control**, illustrating how classical control laws and physics-based constraints shape modern power system operation. +""" + +# ╔═╡ f742f5f3-d9d3-4374-ac9e-17073c3a2f6d +md""" +# Introduction to Energy Systems +## From Economic Dispatch to Dynamic Optimal Control + +Optimal control of power systems builds on static optimization formulations like *economic dispatch* (ED) and *optimal power flow* (OPF). +These problems provide the mathematical foundation for **transient stability–constrained OPF (TSC-OPF)** formulations covered later in this chapter. + +To illustrate the key ideas, we start with the simplest case — the economic dispatch problem on a 3-bus system. + +**Example:** +- Bus 1 load: 50 MW +- Bus 3 load: 75 MW +- Generator 1: capacity = 100 MW, cost = \$8/MW +- Generator 2: capacity = 40 MW, cost = \$2/MW + +![3-Bus Power System Network](https://www.al-roomi.org/multimedia/Power_Flow/3BusSystem/SystemIII/Murty3BusSystem.jpg) + +**Goal:** Minimize total generation cost while meeting total demand — the simplest form of *static* optimal control in power systems. +""" + + +# ╔═╡ ad8e9d79-e226-468e-9981-52b7cda7c955 +md""" +### Quadratic Program (QP) Formulation of Economic Dispatch + +Economic dispatch can be formulated as a **quadratic program**, where generation cost is convex and constraints balance supply and demand conditions. + +```math +\begin{align} +\min_{p_g} \quad & \sum_{g \in \mathcal{G}} C_g(p_g) \\ +\text{s.t.} \quad & \sum_{g \in \mathcal{G}} p_g = \sum_{d \in \mathcal{D}} P_d \quad \text{(power balance)} \\ +& p_g^{\min} \le p_g \le p_g^{\max}, \quad \forall g \in \mathcal{G} \quad \text{(capacity limits)} +\end{align} + + + +where: + +| Symbol | Description | +|:------------- |:-------------------------------------------------------| +| $p_g$ | power output of generator $g$ | +| $C_g(p_g)$ | cost function of generator $g$ (often quadratic: $a_g p_g^2 + b_g p_g + c_g$) | +| $P_d$ | power demand at load $d$ | +| $\mathcal{G}$ | set of generators | +| $\mathcal{D}$ | set of loads | +""" + +# ╔═╡ fc329e51-e91c-4d83-b6fe-07a3bce44d5d +md""" +### Exercise: Formulate the ED Problem for the 3-Bus Network + +**Task:** +Apply the generic formulation to the 3-bus system. Identify: +1. The decision variables +2. The objective function +3. The power-balance constraint +4. Generator bounds + +> 💡 *Hint:* Treat each generator’s output as a controllable decision variable. The total generation must exactly match total load. +""" + +# ╔═╡ d767175f-290d-403e-99de-d3a8f2ccb5b5 +md""" +#### ED formulation for the 3-bus example + +Here is the complete formulation for our 3-bus example: + +```math +\begin{align} +\min_{p_1, p_2} \quad & 8p_1 + 2p_2 \\ +\text{s.t.} \quad & p_1 + p_2 = 125 \quad \text{(power balance)} \\ +& 0 \leq p_1 \leq 100 \quad \text{(Gen 1 limits)} \\ +& 0 \leq p_2 \leq 40 \quad \text{(Gen 2 limits)} +\end{align} +``` + +**Solution:** $p_1$ = 85 MW, $p_2$ = 40 MW +- Total cost: 8*85 + 2*40 = 760\$/hour +- Gen 2 at maximum capacity (greedy) +- Gen 1 supplies remaining demand + +> ⚙️ Control Interpretation: This is a static control allocation problem. In later sections, we’ll extend such formulations to time-varying states and control trajectories. +""" + +# ╔═╡ c9d0e1f2-0894-4340-a18b-72f8e1204432 +md""" +### Discussion + +Reflect on the ED formulation: + +- What type of optimization problem is this (linear, quadratic, convex)? +- How does this formulation abstract away the **physical grid topology**? What kind of graph is it? +- What critical physics are missing if we care about **how** power moves through lines? + +> 🧭 **Bridge to next topic:** +> ED models the **steady-state optimization** problem without considering power flow through lines. +> The next step — **DC power flow** — adds physical coupling constraints between buses. +""" + +# ╔═╡ 9d1ea9be-2d7b-4602-8a8e-8426ea31661a +md""" +### Why the Simplified Model Falls Short + +The simple ED model ignores the **network physics** that govern actual power transfer: +- Power has **direction** — it flows through transmission lines governed by voltage phase angles so the graph needs to be directed. +- Each line has a **thermal rating**: excessive current causes heating, sagging, or even wildfires. +- What is a power line: + - Metal coil that expands and heats up when current is high. + +In real systems, exceeding thermal limits does not immediately stop power flow — it simply becomes unsafe, which requires branch flow constraints. +Thus, the next layer of realism is to introduce branch constraints → **DC power flow**. +""" + +# ╔═╡ 71ba62e6-bcc1-4e9b-91cd-a8860ba0d2b5 +md""" +## DC Power Flow + +To make ED more realistic, we include the grid’s topology by adding branch constraints. +The **DC power flow model** provides a linearized approximation of AC power flow and enforce Kirchhoff’s laws. + +**Parameters:** +- Line reactance $x_{ij}$ +- Line limit $F_\ell^{\max}$ +- Generator set $\mathcal{G}_i$ at bus $i$ (nodal generation) +- Load set $\mathcal{L}_i$ at bus $i$ (nodal load) +- Generator limits $P_j^{\min}, P_j^{\max}$ +- Costs $C_j(P_j)$ quadratic or piecewise-linear for generator $j$ + +**Decision Variables:** +- Generator outputs $P_j$ for $j \in \mathcal{G}_i$ +- Bus angles $\theta_i$ for $i \in \mathcal{N}$ +- Line flows $f_\ell$ for $\ell \in \mathcal{L}$ + +> 🧩 We will see later that the bus angles $\theta_i$ enter as *state variables* in the control dynamics. +""" + +# ╔═╡ 7b4800c2-133d-4793-95b1-a654a4f19558 +md""" +### DC Power Flow Formulation + +The DC power flow optimization problem combines economic dispatch with network physics: + +```math +\begin{align} +\min_{P_j, \theta} \quad & \sum_{i \in \mathcal{N}} \sum_{j \in \mathcal{G}_i} C_j(P_j) \\ +\text{s.t.} \quad & \sum_{j \in \mathcal{G}_i} P_j - \sum_{j \in \mathcal{L}_i} P_j = \sum_{k: (i,k) \in \mathcal{L}} \frac{1}{x_{ik}} (\theta_i - \theta_k) \quad \forall i \in \mathcal{N} \\ +& f_\ell = \frac{1}{x_\ell} (\theta_{i(\ell)} - \theta_{j(\ell)}), \quad -F_\ell^{\max} \leq f_\ell \leq F_\ell^{\max} \quad \forall \ell \in \mathcal{L} \\ +& P_j^{\min} \leq P_j \leq P_j^{\max} \quad \forall j \in \mathcal{G}_i, \forall i \in \mathcal{N} \\ +& \theta_{\text{ref}} = 0 +\end{align} +``` + +- Reactance of line $x_{ij}$. $\frac{1}{x_{ij}} = b_{ij}$: susceptance (manufacturer specified) +- Reference bus: only for modeling, you can pick any bus as the reference bus. We only care about angle differences (which carries current through lines +- Individual bus angle has no physical meaning +""" + +# ╔═╡ 7961c1d1-3e82-49ea-8201-c5f82066d70d +md""" +### Exercise: Solve DCOPF (solver suggested: Ipopt) + +Let's apply the DC power flow formulation to our 3-bus network with line constraints: + +![3-Bus Network with Constraints](https://www.al-roomi.org/multimedia/Power_Flow/3BusSystem/SystemIII/Murty3BusSystem.jpg) + +**How did I get the numbers:** +- Assume P1 generates 85 MW, with 50 MW of load, the net injection is 35 MW +- Assume P2 generates 40 MW, with no load, net injection is 40 MW (we take upwards arrow as injection) +- Bus 3 has no gen, only load +""" + +# ╔═╡ 91b8a3e4-81ed-49fe-b785-4feacfd8788d +md""" +### DCOPF Solution + +Consult lecture slides for the solution and detailed analysis. +""" + +# ╔═╡ f72775b9-818c-4a9b-9b66-cfccd88e17ed +md""" +### Wrap Up + +This section has introduced the fundamentals of static optimal power flow problems including economic dispatch and DC optimal power flow. Key takeaways: + +- You will see that without thermal limits, optimal dispatch can overload lines +- Reference bus is arbitrarily picked by the solver. +- Real systems are AC (complex voltages/currents) -- much harder. This is just a lightweight intro so we can think about expressing real-world problems as optimization formulations without overburdening ourselves with AC physics, which we will see in transient stability section. +""" + +# ╔═╡ 53ab9b31-78aa-49b6-9e24-df47aa80f25a +md""" +# Introduction to Transient Stability + +While static optimization provides a foundation, real power systems are dynamic. When disturbances occur—faults, switching events, or sudden load changes—the system experiences transients before settling to a new equilibrium. Understanding and controlling these transients is essential for system stability. + +## Transient Dynamics +""" + +# ╔═╡ 1e337cdf-8add-42ab-a62f-23069e34ec39 +md""" +## What are transients? + +When current or voltage changes suddenly — switching, faults, lightning, equipment failures, etc. — the system experiences a **transient** + +- Transients are short-lived, high-frequency events where stored magnetic and electric energy exchange rapidly. +- **Faraday's law** of electromagnetic induction governs these effects: + + A change in magnetic flux through a circuit induces a voltage across it. + + ```math + v(t) = \frac{d\Phi(t)}{dt} + ``` + + where $\Phi(t)$ is the magnetic flux through the circuit. +""" + +# ╔═╡ 23dc8fd4-59a1-414f-a165-b509458abd18 +md""" +## Transients Continued + +The relationship between flux and current leads us to the fundamental equations governing inductors: + +- For an inductor, the magnetic flux $\Phi$ is proportional to the current: + + ```math + \Phi(t) = L\,i(t) + ``` + + where $L$ is the inductance (magnetic energy stored per unit current). + +- Substituting gives the familiar time-domain voltage rule: + + ```math + \boxed{v_L(t) = L\,\frac{di(t)}{dt}} + ``` + +Note that steady-state phasor analysis no longer holds due to the time-varying nature of the magnetic flux. I will draw the connection later. +""" + +# ╔═╡ 5814ece5-51b3-4dba-953d-c1f4b6ab04a8 +md""" +## Sinusoidal steady state + +To connect time-domain transients with frequency-domain analysis, we assume all quantities have angular frequency $\omega$ to extract the phasors in steady-state. The current in time-domain is: + +```math +\begin{align} +i(t) &= \operatorname{Re}\!\left\{ I\,e^{j\omega t} \right\}, +\end{align} +``` + +Differentiate the current: + +```math +\begin{align} +\frac{di(t)}{dt} &= \operatorname{Re}\!\left\{ j\omega I\, e^{j\omega t} \right\}. +\end{align} +``` + +Substitute into $v_L(t) = L\,\frac{di}{dt}$: + +```math +\begin{align} +v_L(t) &= \operatorname{Re}\!\left\{ (j\omega L I)\, e^{j\omega t} \right\}. +\end{align} +``` + +## Phasor (frequency-domain) relation + +We are now ready to extract the phasor representation of voltage. By definition, the **phasor** is the complex amplitude multiplying $e^{j\omega t}$. + +From the previous expression, + +```math +\begin{align} +v_L(t) &= \operatorname{Re}\!\left\{ (j\omega L I)\, e^{j\omega t} \right\}, +\end{align} +``` + +the **voltage phasor** is + +```math +\begin{align} +\boxed{V = j\omega L\, I}. +\end{align} +``` +""" + +# ╔═╡ c1d2e3f4-0894-4340-a18b-72f8e1204445 +md""" +## Capacitor law: from time domain to phasor + +Similar to inductors, capacitors also exhibit transient behavior. Let's derive the capacitor relationships: + +A capacitor stores energy in an **electric field**. The stored charge $q(t)$ is proportional to voltage $v(t)$: + +```math +q(t) = C\,v(t) +``` where $C$ is the capacitance. + +* The current is the rate of change of charge: +```math +i_C(t) = \frac{dq(t)}{dt} = C\,\frac{dv(t)}{dt} +``` + +With $v(t)=\operatorname{Re}\{V e^{j\omega t}\}$, + +```math +\begin{align} +\frac{dv(t)}{dt} &= \operatorname{Re}\!\left\{ j\omega V e^{j\omega t} \right\}, \\ +i_C(t) &= \operatorname{Re}\!\left\{ (j\omega C V) e^{j\omega t} \right\}. +\end{align} +``` + +Hence, the **phasor relationship** is: + +```math +\begin{align} +\boxed{I = j\omega C\,V}, \qquad +\boxed{Y_C = j\omega C}, \qquad +\boxed{Z_C = \frac{1}{j\omega C}}. +\end{align} +``` +where $Y_C$ is the capacitive admittance and $Z_C$ is the capacitive impedance, and susceptance $B_C$ is imaginary part of $Y_C$. +The real part of $Y_C$ is conductance $G_C$, which is used in steady-state AC optimal power flow problems. +You could of course derive admittance and impedance for inductors following similar steps. The above steps connect the time-domain and phasor domain. Note that the above is for ideal inductors and capacitors. +""" + +# ╔═╡ ca8dc9ed-0974-4205-9af4-a21c8a7cb707 +md""" +## More realistic transmission line model + +So far, we've considered circuit elements without considering their coordinates on the line. +In real transmission lines, however, voltage $v(x,t)$ and current $i(x,t)$ vary **both** in time and along the line coordinate $x$. + +Their spatial derivatives represent how these quantities change **per unit length:** + +```math +\begin{align} +\frac{\partial v(x,t)}{\partial x} &\;\Rightarrow\; \text{voltage drop per unit length (V/m)}, \\ +\frac{\partial i(x,t)}{\partial x} &\;\Rightarrow\; \text{current change per unit length (A/m)}. +\end{align} +``` + +**Real lines are lossy:** +- Conductor series resistance causes Ohmic losses (heat dissipation) in voltage $\Rightarrow$ adds $-R'\,i(x,t)$. +- Current leakage due to shunt conductance $\Rightarrow$ adds $-G'\,v(x,t)$. + +Hence, the full **telegrapher's equations** are: + +```math +\begin{align} +\frac{\partial v(x,t)}{\partial x} &= -L'\frac{\partial i(x,t)}{\partial t} - R'\,i(x,t),\\ +\frac{\partial i(x,t)}{\partial x} &= -C'\frac{\partial v(x,t)}{\partial t} - G'\,v(x,t). +\end{align} +``` +where $L'$ and $C'$ are the inductance and capacitance per unit length, and $R'$ and $G'$ are the resistance and conductance per unit length. +You can think about $R'$ and $G'$ as damping terms to account for losses and leakage. +$L,C$ relate to energy storage, and $R,G$ relate to energy dissipation. +""" + +# ╔═╡ 9716f6a5-54d6-4abc-b0df-82f5a30e0196 +md""" +## How the above was derived + +Consider a small line segment between $x$ and $x+dx$. +- Coordinate $x$ increases in the direction of current flow ($+x$). +- Current flowing in $+x$ direction: $i(x,t)$. +- Voltage between conductors (top to bottom) at position $x$: $v(x,t)$. + +**1. Voltage change between segment ends:** + +```math +v(x,t) - v(x+dx,t) = -\frac{\partial v(x,t)}{\partial x}\,dx. +``` + +**2. Series drops over $dx$:** + +```math +\begin{align} +\text{Resistive drop} &:\; R'\,i(x,t)\,dx,\\ +\text{Inductive drop} &:\; L'\,\frac{\partial i(x,t)}{\partial t}\,dx. +\end{align} +``` + +**3. Apply Kirchhoff Voltage Law:** + +(The sum of voltage drops along the closed path must equal zero.) + +```math +(R'\,i + L'\tfrac{\partial i}{\partial t})\,dx + \big[v(x+dx,t) - v(x,t)\big] = 0. +``` + +**4. Substitute and simplify:** + +```math +\frac{\partial v(x,t)}{\partial x}\,dx = -L'\frac{\partial i(x,t)}{\partial t}\,dx - R'\,i(x,t)\,dx. +``` + +**5. Divide by $dx$:** + +```math +\boxed{\frac{\partial v(x,t)}{\partial x} = -L'\frac{\partial i(x,t)}{\partial t} - R'i(x,t)}. +``` + +The negative sign indicates that voltage **drops** in the $+x$ direction due to both inductive ($L'\,\partial i/\partial t$) and resistive ($R'i$) effects. +""" + +# ╔═╡ a5b6c7d8-0894-4340-a18b-72f8e1204451 +md""" +# How does physics relate to optimization? + +We now connect the time-domain physics to **Transient Stability–Constrained Optimal Power Flow (TSC-OPF)**, where the optimization must respect both steady-state **and** dynamic constraints after a disturbance. +""" + +# ╔═╡ 34595bd9-874e-4ca9-bf3c-3ebef9a37cec +md""" +## TSCOPF formulation + +```math +\begin{align*} +\min_{p,\,x(t),\,y(t)} \quad & C(p) && \text{(1)}\\ +\text{s.t.}\quad +& g_s(p) = 0 && \text{(2)}\\ +& h_s^{-} \le h_s(p) \le h_s^{+} && \text{(3)}\\ +& p^{-} \le p \le p^{+} && \text{(4)}\\[3pt] +& \dot{x} = f(x,y,p), \quad x(t_0)=I_x^0(p) && \text{(5)}\\ +& 0 = g(x,y,p), \quad y(t_0)=I_y^0(p) && \text{(6)}\\ +& h(x(t),y(t)) \le 0, \quad \forall t && \text{(7)} +\end{align*} +``` + +**Objective:** minimize operating cost or transmission losses. Eq. (2) includes steady-state nodal power balance constraints. Eq. (3) includes apparent/real power/reactive power/current flow constraints on lines. Eq. (4) includes generator capacity or voltage magnitude constraints. +""" + +# ╔═╡ a9f00e8c-205e-45a9-83d4-1dea5b7627c1 +md""" +## Dynamic Transient Constraints: (5)--(7) + +The dynamic constraints (5)-(7) embed the time-parametrized physics of transient behavior into the optimization problem: + +**Eq. (5):** +- State variables $x$ (rotor angles, speeds, control states). Initial states computed from steady-state solution corresponding to control variables $p$. +- System dynamics $f(x,y,p)$ — e.g., generator swing equations, Telegrapher equations, or capacitor/inductor transient models. +- Dependent variables $y$ (nodal voltages magnitude and angle, line currents, etc.). +- Control variables $p$ (generator setpoints, tap settings, shunt positions, etc.) +- Enforce the physics of transient after a disturbance. + +**Eq. (6):** embed dynamics into steady-state constraints. +- The steady-state constraints $g(x,y,p)$ have same physical laws as (2) e.g. KCL but now must hold at every instant $t$'s states $x(t), y(t)$. + +The final set of constraints ensures that the system remains within safe operating limits throughout the transient: + +**(7) Transient limits:** + +```math +h(x(t), y(t)) \le 0, \quad \forall t +``` + +- Enforce time-domain operating limits during the transient response. +- Examples: + - Bus voltage magnitudes stay within limits. + - Rotor angle differences remain stable. + - Line thermal limits respected. +- Ensures **transient stability** under all time steps during disturbance. +""" + +# ╔═╡ 22d5c113-82f0-4598-8c47-ead1face730e +md""" +## Solution Methods for TSC-OPF + +Solving TSCOPF is computationally challenging due to the nonlinear nature of AC power and the embedded differential equations. Several approaches have been developed: + +**Indirect (variational) Methods:** +- Based on Pontryagin's Maximum Principle. +- Replace the differential equations of dynamics with inequalities that approximate the behavior in steady-state by linearizing into additional static conditions. +- Examples: energy or Lyapunov functions or impose stability margin constraints on linearized Jacobian. + +Instead of having to integrate over time, we get back a static nonlinear optimization problem that can be solved using standard solvers. + +**In practice:** +- Mainly used for planning/screening/preventive security dispatch due to loss in accuracy. +- Not sufficient to guarantee transient stability under large disturbances. +- Validation still relies on time-domain (direct) simulation. +""" + +# ╔═╡ 47e011b8-4fb8-4534-a504-ffe3009beb6e +md""" +## Direct Method: Simultaneous Discretization/Constraint Transcription + +An approach that directly discretizes the differential equations. **Main idea:** Converts the time-dependent diff. eq. into a finite set of algebraic constraints before solving the optimization problem so transient stability simulator can be reused. + +**Discretization approach:** +- The simulation horizon is divided into multiple time steps $t_0, t_1, \dots, t_N$. +- The diff. eq. is approximated at each step using numerical integration like implicit trapezoidal rule: + + ```math + x(t) - \frac{\Delta t}{2} f(x(t), y(t), p) + - x(t-\Delta t) + - \frac{\Delta t}{2} f(x(t-\Delta t), y(t-\Delta t), p) = 0. + ``` + +**Pros and Cons:** +- Produces one large-scale NLP that enforces the dynamics exactly for the entire trajectory (within discretization accuracy). +- Computationally demanding due to the high dimensionality of variables and constraints from discretization. Accurate gradients is expensive from trajectory sensitivity analysis. Hessians often approximated using BFGS updates. +""" + +# ╔═╡ a3786b2d-9951-440f-854c-dfd40ad727f1 +md""" +## Direct Method: Multiple Shooting + +Multiple shooting offers a more numerically stable alternative to simultaneous discretization. It divides the simulation horizon into smaller time segments $[t_0,t_1], [t_1,t_2], \dots, [t_{N-1},t_N]$. + +- Each segment starts from its own initial condition $x_i(t_i)$ and is integrated forward using the diff. eq. $\dot{x}=f(x,y,p),\, 0=g(x,y,p)$ to obtain the predicted final state $\hat{x}_i(t_{i+1})$. +- Constraint to ensure continuity between segments: + + ```math + x_{i+1}(t_{i+1}) = \hat{x}_i(t_{i+1}), + ``` + +Abstractly, the constraint form is: + +```math +s_i = S_i(s_{i-1},p), \quad \forall i \in 1,\dots,N_S, +``` + +where $S_i(\cdot)$ is an implicit function that can be numerically integrated over segment $i$. This can be used for variables $x,y$. + +**Pros:** Each segment can be integrated independently, so the Jacobian of the resulting NLP is better conditioned because the coupling is limited to segment boundaries instead of the entire trajectory. This segmentation improves numerical stability and allows for more efficient large-scale computation. +""" + +# ╔═╡ c3d4e5f6-0894-4340-a18b-72f8e1204458 +md""" +## Trajectory Sensitivity Analysis of TSC-OPF + +Both direct methods require gradient information. Sensitivity analysis can provide this efficiently. +**Purpose:** Quantify how system variables $x(t),y(t)$ changes with respect to small variations in control variables $p$ or initial conditions. +Recall that with different control settings $p$, the entire transient trajectory changes and we would need to simulate the dynamics again to see the consequences. +This is expensive. Sensitivity analysis tells you how the trajectory and stability margins change with small variations in $p: \frac{\partial x}{\partial p}$ without running the full simulation for every small perturbation. + +**Relation to numerical methods:** +- These sensitivities provide gradient information for solvers, which is used for both multiple shooting and constraint transcription. +""" + +# ╔═╡ 946ad231-4ddf-43a3-b2b9-95d502f4b5e9 +md""" +## Forward Sensitivity Method + +The forward sensitivity method computes gradients by integrating sensitivity equations forward in time: + +- Perform a forward integration of the sensitivity equations alongside the original diff. eq. system. +- Efficient when the number of parameters is small. +- The computational complexity is $\mathcal{O}(n_p)$, since $n_p$ forward integrations are required to compute the sensitivities. + +**Formulation:** + +For the original diff. eq. system: + +```math +F(\dot{x}(t),\, x(t),\, p) = 0. +``` + +The corresponding variational diff. eq. for the sensitivities is: + +```math +\frac{\partial F}{\partial \dot{x}}\,\dot{s} ++ \frac{\partial F}{\partial x}\,s ++ \frac{\partial F}{\partial p} = 0, +``` + +with initial condition + +```math +s(t_0) = \frac{\partial x(t_0)}{\partial p}. +``` + +- Each parameter $p_i$ perturbs the system differently. +- Forward method tracks this by integrating a new "copy" of the linearized system, which shares the same Jacobian (including state dynamics and algebraic equations of KCL etc.) as the original differential equations. + +**Pros and cons:** +- **Pros:** Simple to implement, accurate efficient when number of parameters is small. +- **Cons:** Computational cost grows linearly with number of parameters. +""" + +# ╔═╡ f6399741-9b5f-4bd3-bae7-6cc1ed1bd718 +md""" +## Adjoint Method + +When the number of parameters is large, the forward method becomes expensive. The adjoint method is an alternative that only needs one backward integration in time to compute the sensitivities. + +**Formulation:** + +- Consider + + ```math + G(p) = \int_{t_0}^{T} g(x, p)\,dt. + ``` + +- We want the gradient given by: + + ```math + \frac{\partial G}{\partial p} + = + \int_{t_0}^{T} + \left( + \frac{\partial g}{\partial p} + - \lambda^{\mathsf{T}} \frac{\partial F}{\partial p} + \right) dt, + ``` + +- The adjoint multiplier $\lambda(t)$ satisfies + + ```math + \dot{\lambda} + = + -\,\frac{\partial g}{\partial x} + + \lambda^{\mathsf{T}}\frac{\partial F}{\partial x}. + ``` + + where $\lambda(T)=0$. + +**Pros:** +- Efficient when the number of parameters is large. +- The gradient is obtained in one backward integration. + +**Cons:** +- Higher memory cost due to storage of trajectory data and state variables in backward integration. + +One can also obtain the gradients by finite differences, which is based on truncated Taylor series expansion. +""" + +# ╔═╡ 214eacc5-0b60-44b8-8a53-9cce369debdd +md""" +# Power System History and Modern Power System + +To understand why transient stability matters today, we must go back to see how power systems have evolved. The grid's dynamic behavior has fundamentally changed with the integration of renewable energy. + +## The Fuel Era (20th Century) + +Electricity produced mostly by coal, gas, nuclear. Generators are large synchronous machines with big spinning masses. Stable and predictable. Inertia from these machines naturally provides flexibility in frequency stability. Grid ran reliably for decades. + +## The Renewable Era (2000s--Today) + +Wind expanded in 2000s, solar PV took off after 2010. Renewables now more than 20--40% of real-time demand in some regions; dynamics changed. +""" + +# ╔═╡ a7b8c9d0-0894-4340-a18b-72f8e1204464 +md""" +## Synchronous Generators: How electricity is generated + +![Generator Cross-Section](https://www.electricaltechnology.org/wp-content/uploads/2022/09/Cylindrical-Alternator-or-Synchronous-Generator.png) + +- Rotor (heavy spinning mass) driven by turbines (steam, gas, hydro) +- Faraday's law: changing magnetic field induces voltage in stator +- Called "synchronous" because the rotor spins in sync with the grid's frequency (50 Hz in Europe, 60 Hz in North America) +- If the grid frequency is 60 Hz, the rotor turns at a speed locked to 60 Hz +""" + +# ╔═╡ 6b64a495-6039-408c-91a9-4dfddf21d857 +md""" +## Spinning Mass in a Generator + +- Inside a synchronous generator is a rotor — basically a giant heavy wheel of steel and copper (tens or hundreds of tons) +- Turbines (steam from coal/nuclear, gas combustion, or flowing water in hydro) push on the rotor to make it spin +- That rotor's mechanical rotation creates a rotating magnetic field, according to Faraday's law of induction, a changing magnetic field induces an alternating voltage in the stator windings +- This is why the system is predictable: we know how to control these rotors. Put in more fuel to generate more power +""" + +# ╔═╡ b5159081-3b0a-459a-9c5b-c2b4911d79e2 +md""" +## Generator Frequency Formula + +**Frequency Formula:** + +```math +f = \frac{N \times \text{RPM}}{120} +``` + +where $N$ = number of poles, RPM = rotor speed + +**Examples:** +- 2 poles, 3600 RPM → 60 Hz +- 4 poles, 1800 RPM → 60 Hz + +**Why 50/60 Hz?** Historical choices: early engineers (Westinghouse, Edison, etc.) picked values that balanced motor performance and generator design. Once infrastructure was built, it became a standard. +""" + +# ╔═╡ ad22ab28-884e-4c3b-8265-51a44685343d +md""" +## Kinetic Energy + +**The rotor has stored kinetic energy:** + +```math +E_{\text{kinetic}} = \frac{1}{2} J \omega^2 +``` + +where $J$ = moment of inertia (depends on mass + geometry), $\omega$ = rotor speed + +**If demand suddenly exceeds supply (a generator trips):** +- That small slow down of a rotor releases some of its stored kinetic energy into the grid instantly +- But because there are so many large spinning machines, the grid behaves like a conveyor belt with so many wheels tied together. If one slows a bit, the others share the imbalance, so frequency changes slowly because the system has a huge inertia +- This gives time for operators to fix things +- Even if there are imbalances, things wouldn't get out of hand fast since there are so many other generators. They can share the load so each only needs to spin a little faster to keep up the frequency +""" + +# ╔═╡ 01ebbe37-0681-47bb-b851-5f16b9f4aeb5 +md""" +## Inverters - Renewables + +The modern power grid faces new challenges with the integration of renewable energy sources. **Today, renewables supply 20–40\%+ of real-time demand.** + +Cleaner, cheaper, more sustainable — but dynamics changed. + +Most renewables (solar PV, modern wind turbines, batteries) produce DC electricity (direct current). + +**What's the problem of DC power?** +- It only has amplitude (magnitude of voltage/current) +- No phase, no frequency +- But recall AC current has the waveform (that's why we have leading/lagging current which controls reactive power and power factor correction) +- We need amplitude, frequency, and phase to describe AC current +- That's why we need inverters, power electronics device that synthesizes sinusoidal AC from DC +""" + +# ╔═╡ 86d07665-753e-4dbe-aa84-5b23ec0a616f +md""" +## Inverter Operation + +**How it operates?** + +1. Takes DC input from solar panels, wind turbine +2. Use power electronics that switches thousands of time per second to synthesize an AC waveform +3. Note that even the output is a smooth sinusoidal AC waveform, inside the inverter the switches turn the DC voltage on and off thousands of times per second (typical switching frequency = 2–20 kHz, sometimes higher) to approximate that smooth waveform +4. So even though the output is continuous, it's created by on/off pulses internally +5. The inverter synchronizes the AC output to the grid's frequency and phase. If grid is 60 Hz → inverter outputs 60 Hz. If grid is 59.9 Hz (after a disturbance) → inverter follows 59.9 Hz. +6. The voltage, current, and power factor are controlled through the programmed algorithms +""" + +# ╔═╡ 8e4dc912-14ff-4290-8f96-926493e5ef81 +md""" +## Inverter Control Modes + +**In summary, the inverters are programmable devices by operators with control algorithms to act like generators. They wait for a signal from a grid so they can be:** + +- **Grid-following:** track the grid's voltage and frequency → inject current accordingly +- **Grid-forming:** behave like a voltage source, set their own frequency/voltage reference, and to adjust for power imbalance (some research area I heard of) + +They are not really generators - no spinning mass, no inertia, but they use control algorithms to mimic generator behavior. +""" + +# ╔═╡ c5d6e7f8-0894-4340-a18b-72f8e1204471 +md""" +## Internal View of Inverters + +![Internal View of Inverter](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Sunny_Boy_3000.jpg/1200px-Sunny_Boy_3000.jpg) + +- Capacitors and switching components on electronic mainboards (like in computer's motherboard, blue cylinders in upper left corner of the picture) +- Programmable behavior defined by control firmware +""" + +# ╔═╡ c0cc1b94-e651-40c2-8084-e9ebfad2a457 +md""" +## Problems with Inverters + +**This is all software-based. You do not have a natural physical property like a spinning rotor and inertia.** + +- No big spinning mass directly tied to frequency, so frequency changes much faster after a disturbance +- The device measures grid signal and forces its output to follow +- Unless explicitly programmed, they don't know when the conveyor belt slows down or speeds up (recall the previous analogy) +- Even if they do, they don't have the capacity like big generators +- **This is the key part:** they are just switching circuits with no agency to ramp up the power output (nature of renewables is their output is often independent of human control). Output is limited by weather and energy availability (sun/wind). +- Renewables also locate in remote areas with long transmission lines, and the nature of their unpredictability (weather), makes their generation highly uncertain + +**We will build up to inverter control after we cover the generator swing equations.** +""" + +# ╔═╡ 4702e992-a163-40f3-ab55-f9e8e848d0c7 +md""" +# Generator Swing Equations + +The generator swing equations are the cornerstone of power system dynamics. They describe how generators respond to power imbalances, connecting mechanical and electrical power through rotational forces. + +## Newton's Second Law + +We begin with the fundamental physics. **Linear Version:** + +```math +F = ma +``` + +where $F$ = force (N), $m$ = mass (kg), $a$ = acceleration (m/s²) + +This says: imbalance of forces → acceleration of mass. + +**Rotational Version:** + +For a rotating body (like a generator rotor), the equation is: + +```math +T = J\alpha +``` + +where $T$ = torque (N·m), $J$ = moment of inertia (kg·m²), the rotational mass. $\alpha$ = angular acceleration (rad/s²) + +This says: imbalance of torques → rotor accelerates or decelerates. + +Think torque as the angular equivalent of force. +""" + +# ╔═╡ 1566dce2-fd36-4110-8220-97eefe043cbb +md""" +## Applied to Generator Dynamics + +Now we apply Newton's second law to a generator rotor. **There are two main torques acting on a synchronous generator's rotor:** + +- Mechanical torque from the turbine (steam, gas, water) pushing the rotor: $T_m$ +- Electromagnetic torque from the stator's magnetic field resisting the rotor (this is the grid "pulling" power out): $T_e$ + +**Torque imbalance:** + +```math +J\alpha = T_m - T_e +``` + +where $\omega$: angular speed of rotor (rad/s), $\alpha = \dot{\omega}$: angular acceleration (rad/s²) + +**If $T_m > T_e$:** rotor accelerates + +**If $T_m < T_e$:** rotor slows down + +**If equal:** steady rotation +""" + +# ╔═╡ 9bd48789-5d3d-495c-acd3-6586ae616136 +md""" +## From Torque to Power + +To connect torque dynamics with electrical power, we relate rotational motion to power. Recall $P = Fv$ (mechanical power is generated by a force $F$ on a body moving at a velocity $v$). In rotational systems, power is related by torque and angular speed (you can think about it as rotational equivalent as force) + +**Power = torque × speed:** + +```math +P = T \cdot \omega +``` + +So: +- Mechanical power input: $P_m = T_m \cdot \omega$ +- Electrical power output: $P_e = T_e \cdot \omega$ + +Multiply the torque balance by $\omega$: + +```math +J\omega\dot{\omega} = P_m - P_e +``` + +This relates how fast the mass is spinning ($\omega$) to the imbalance of power input (generation) and power withdrawal (load + losses). + +In practice, generators operate close to system frequency, so the generators spin at an angular velocity that is close to that 60 Hz constant. Since the variations are mostly tiny, we can define inertia constant $M = J\omega$ + +And we get the generator swing equation: + +```math +M\dot{\omega} = P_m - P_e +``` + +**Interpretation:** +- Inertia constant $M$, measures how much the rotor resists speed change (bigger mass → slower frequency drift) +- Mechanical input power (from fuel, water, steam): $P_m$ +- Electrical output power delivered to the grid: $P_e$ +""" + +# ╔═╡ a9b0c1d2-0894-4340-a18b-72f8e1204477 +md""" +## Per-Unit Generator Swing Equation + +**Per-unit versions:** + +Power are often defined at per unit, so we have: + +```math +\frac{J\omega_s}{S_{\text{base}}} \dot{\omega} = (P_m - P_e)_{\text{pu}} +``` + +There are sources that define $H = \frac{1}{2}\frac{J\omega_s^2}{S_{\text{base}}} \Rightarrow \frac{2H}{\omega_s} = \frac{J\omega_s}{S_{\text{base}}}$ + +$H \triangleq \frac{E_k}{S_{\text{base}}} = \frac{\frac{1}{2}J\omega_s^2}{S_{\text{base}}}$ comes from kinetic energy + +So we have per unit swing: + +```math +\frac{2H}{\omega_s} \dot{\omega} = (P_m - P_e)_{\text{pu}} +``` +""" + +# ╔═╡ abcd31d0-c6eb-4bc7-a752-83a8d7f6fda1 +md""" +## Damping and Another Form of Generator Swing Equations + +Some also add damping: + +```math +M\dot{\omega} + D(\omega - \omega_s) = P_m - P_e +``` + +as penalties to frequency deviation. $D$ captures any restoring force, or frictions and losses + +We can also write the per-unit acceleration form: + +```math +2H \dot{\omega}_{\text{pu}} = (P_m - P_e)_{\text{pu}} +``` +""" + +# ╔═╡ b16732b7-ec08-43c7-9c08-489c8c8bbecb +md""" +## Why This Matters + +- Stability depends on balancing generation and demand +- Inertia slows down changes in frequency, buying time for control actions + +**Power imbalance effects:** +- If $P_m > P_e$: extra power → rotor speeds up → frequency rises +- If $P_m < P_e$: shortage → rotor slows → frequency falls + +**Inertia $M$ slows down how fast this happens.** +- With many generators, $M$ is big. For a given imbalance, frequency drifts slowly → grid is flexible +- With fewer machines (more renewables), $M$ is smaller → frequency changes faster → grid is fragile + +This is shown by writing the equation as $\dot{\omega} = \frac{P_m - P_e}{M}$. For a big $M$, the angular acceleration (frequency) is smaller when there is an imbalance. +""" + +# ╔═╡ 8ee16365-6d48-4073-9482-44dd58b7e338 +md""" +## How Does It Relate to Inverters? + +The swing equation framework extends beyond traditional generators. We previously discussed grid-following inverters. + +**Its control law works as:** + +1. Measure voltage and frequency of the grid +2. Gets desired power output from an operator or solved from a market +3. Adjust its AC current output to deliver the desired power output at voltage and frequency GIVEN by the grid + +The problem is it has no control over other parameters like voltage and frequency. The power output is only stable if the rest of the grid maintains a good reference. +""" + +# ╔═╡ f05940b2-5a30-46dc-8811-5f3d6b0c74a0 +md""" +## Grid-forming Inverters + +Grid-forming inverters represent a more advanced control paradigm that enables renewables to provide grid support: + +- It behaves as controlled voltage source that defines its own reference voltage and frequency +- Let the frequency shift slightly to reflect power imbalance between the renewable generation and the rest of the grid, so other machines (generators) know to ramp up or down +- Able to define its own frequency is the key for the renewable to behave like a synchronous generator, and we now have the ability to model it in a swing equation by giving it a virtual mass defined by the local frequency + +We can now emulate synchronous machine behavior via controlling the "virtual inertia". + +**Reference:** J. Driesen and K. Visscher, "Virtual synchronous generators," 2008 IEEE Power and Energy Society General Meeting - Conversion and Delivery of Electrical Energy in the 21st Century, Pittsburgh, PA, USA, 2008, pp. 1-3. +""" + +# ╔═╡ 75deac76-f89c-4b84-a132-67591177f5dd +md""" +## Virtual Inertia Law in Grid-Forming Inverter + +**Physics is replaced by software:** + +```math +M_{\text{virtual}} \dot{\omega} = P_{\text{ref}} - P +``` + +**Parameters:** +- Tunable parameter by the controller $M_{\text{virtual}}$, chosen to represent how fast the inverter responds to frequency changes +- Recall $M = J\omega$. Since we have no physical inertia $J$, the virtual mass is just a modeling choice +- Reference active power dispatch (from operator): $P_{\text{ref}}$ +- Measured actual active power delivered: $P$ +- Inverter's internal frequency reference value: $\omega$ + +**Effect of $M_{\text{virtual}}$:** +- A larger $M_{\text{virtual}}$ means the inverter allows its frequency to drift slower, a "heavier" machine +- A smaller $M_{\text{virtual}}$ means the inverter reacts more quickly, a "lighter" machine +""" + +# ╔═╡ 0a2c4c0a-c68e-4f21-afbb-1b80791ec166 +md""" +## Virtual Inertia + +**How it works:** +- The inverter adjusts its internal frequency reference according to power imbalance +- That frequency reference drives its voltage output, which the grid "sees" +- To the rest of the system, this looks just like a synchronous machine rotor slowing/speeding under imbalance + +- There's no heavy rotor. It emulates the inertia behavior of synchronous machines through software control. +- But this is not sustained. It can only hold it until the renewable saturates, which is less than a second since they don't have as much buffer as traditional generators. +- Other problems: semiconductor ratings, thermal limits, hard to tune $M_{\text{virtual}}$, cost, legacy devices, etc. + +**Why this is such a big deal:** renewables can now respond to a grid-wide drop in frequency because it can behave almost like a synchronous generator through control law + +## Demo of swing equation / virtual inertia response: +- When there's a positive power imbalance, the frequency will increase. +- Larger inertia slows down the rate at which frequency rises. This shows up as a curve that rises more gently (less sharply concave) because a heavier system resists acceleration more. +- Increasing damping reduces the steady-state frequency deviation for a given imbalance and allows the system to settle faster. Higher damping provides a stronger corrective force that pulls frequency back toward nominal. +- In the plot, we will see it makes the plot level off sooner. +""" + +# ╔═╡ e14c2b45-3a7d-4e27-9c13-79ae514b1881 +@bind M Slider(0.5:0.5:10.0, default=5.0, show_value=true) + +# ╔═╡ 6ff3fd90-23cd-4cd0-95cf-d4e1d5ac3bdf +@bind D Slider(0.0:0.1:5.0, default=1.0, show_value=true) + +# ╔═╡ b32a299d-4d0a-4e8b-b576-15bb32acad24 +@bind ΔP Slider(-0.5:0.05:0.5, default=0.2, show_value=true) + +# ╔═╡ 4db9cfa4-66c7-4b71-b0b3-5c16eaa2bb9e +md""" +### Interactive: Swing Equation / Virtual Inertia Response + +Use the sliders above to adjust: + +- **M** — inertia (or virtual inertia) +- **D** — damping +- **ΔP** — power imbalance (positive = deficit in electrical power, negative = surplus) + +The plot shows the **frequency deviation** response over time. +""" + +# ╔═╡ a0b43f28-8e17-4633-8eab-b9554e05c8f6 +begin + # Nonlinear swing-like ODE: M * dω/dt + D*ω = ΔP + function swing!(dω, ω, p, t) + M, D, ΔP = p + dω[1] = (ΔP - D*ω[1]) / M + end + + ω0 = [0.0] # initial frequency deviation + p = (M, D, ΔP) + tspan = (0.0, 10.0) + + prob = ODEProblem(swing!, ω0, tspan, p) + sol = solve(prob, Tsit5()) + + plot(sol.t, [u[1] for u in sol.u], + xlabel = "Time (s)", + ylabel = "Frequency deviation", + title = "Generator Swing / Virtual Inertia Frequency Response", + legend = false) +end + + +# ╔═╡ c7d8e9f0-0894-4340-a18b-72f8e1204484 +md""" +## Grid-following inverters - Droop Control + +Droop control enables automatic power sharing among generators and inverters: generators naturally slow down if overloaded, resulting in a drop in frequency (droop). Droop control allows each generator to increase its power output in response, but in proportion to its droop coefficient, so that all generators share the load change fairly. + +Grid-forming inverters are programmed with droop control: + +```math +P = P_{\text{set}} - \frac{1}{K_p} (\omega - \omega_0) +``` + +where $\omega_0$: nominal frequency, $P_{\text{set}}$: reference power output, $K_p$: droop constant (rad/s per MW or Hz per MW) telling inverter how much to adjust power output when frequency changes. Hence when frequency drops, power will rise. + +Overload leads to frequency drop, and power will rise according to the relationship. If frequency rises, power will decrease to maintain the frequency. +""" + +# ╔═╡ 20d5d03f-0225-4d3c-b0d2-d7440340b821 +md""" +## Reactive Power and Voltage Control (Q-V Droop) + +Just as frequency droop controls active power balance, voltage droop controls reactive power balance. Analogous for voltage support: + +```math +V = V_0 - K_q (Q - Q_{\text{set}}) +``` + +or + +```math +Q = Q_{\text{set}} - \frac{1}{K_q} (V - V_0) +``` + +If reactive demand $\uparrow$ (voltage dips), generator/inverter increases reactive power injection. + +**Two important components of stability:** frequency and voltage. If there are deviations, adjust active and reactive power accordingly + +- Interpretation of $1/K_p$ = MW per Hz: "How much active power do I add if frequency drops by 0.1 Hz?" +- Interpretation of $1/K_q$ = Mvar per V → "How much reactive power do I add if voltage drops by 0.01 pu?" + +## Summary: Generator and Inverter Dynamics + +Synchronous generators naturally provide inertia and adjust their output through physical dynamics, giving the grid its inherent frequency stability. +Inverters lack this physical behavior, so control algorithms such as virtual inertia and droop control are introduced to let them share changes in load and maintain frequency and voltage—just as generators have always done. +Droop control is essential because it enables multiple devices to automatically coordinate their power output. With generator and inverter dynamics in place, we now turn to **dynamic load models**, which describe how electricity demand behaves during disturbances. +""" + +# ╔═╡ 37f242b9-454f-4361-a2e1-98acae57b6fe +md""" +# Dynamic Load Models + +So far, we've focused on generation dynamics. However, loads also exhibit dynamic behavior that significantly impacts system stability. Understanding how loads respond to voltage and frequency changes is crucial for accurate transient analysis. + +## Dynamic Load Models +""" + +# ╔═╡ 4211a2c2-4a3a-4a63-8d2e-dc6c94e0cfc6 +md""" +## Steady-State Load Models in ACOPF/DCOPF + +We begin by reviewing how loads are typically modeled in static optimization. In optimal power flow (OPF), all quantities are **time-invariant**. $\dot{x} = 0$, time parameter $t$ does not appear in the equations. + +At each load bus: + +```math +P_D = \text{fixed real power demand}, \qquad +Q_D = \text{fixed reactive demand}. +``` + +These loads can be either: +- Constant power: $P_D, Q_D$ are specified numerical values; or +- Voltage-dependent (ZIP) as motors draw different amount current to maintain torque: + + ```math + P(V) = P_0 (a_P V^2 + b_P V + c_P), \quad + Q(V) = Q_0 (a_Q V^2 + b_Q V + c_Q). + ``` + +Power-flow balance: + +```math +P_G - P_D = \text{network losses}, \qquad +Q_G - Q_D = 0. +``` + +However, the static load model has important limitations. Interpretation of the above model: +- Loads are fixed regardless of system conditions, or at most respond to nodal voltage. +- No memory or dynamics -- they change only between static operating points. +- The OPF represents a single equilibrium snapshot of the system. + +**Next:** Dynamic models generalize this by letting $P_D$ and $Q_D$ **evolve over time** with voltage and frequency. The grid's sink can be dynamic too even though we tend to think about it as a fixed parameter. +""" + +# ╔═╡ 8ca0ad91-2fb5-4e64-9f6f-5498fa39d44b +md""" +## Dynamic Load Models - Induction Motor Model + +Dynamic load models capture the time-dependent response of loads to system disturbances. In dynamic load models, the active and reactive power is represented as a function of the past and present voltage magnitude and frequency of the load bus. This type of model is commonly derived from the equivalent circuit of an induction motor. + +Most real-world loads (fans, pumps, compressors) are induction motors. + +Their active/reactive power do not change instantaneously with voltage change but rather dynamically by changing the motor's rotor speed $\omega_r$ to maintain torque. Hence, the power consumption depends on both voltage and frequency. + +```math +P_d = f_P(V, \omega_r), \qquad Q_d = f_Q(V, \omega_r), +``` + +so the load has internal dynamics, unlike static $P_D, Q_D$ in ACOPF. +""" + +# ╔═╡ a1b2c3d4-0894-4340-a18b-72f8e1204490 +md""" +## Rotor Dynamics + +The key parameter describing induction motor operation is slip, which relates rotor speed to synchronous speed: + +**Slip:** + +```math +s = \frac{\omega_s - \omega_r}{\omega_s}, +``` + +where +- Synchronous electrical speed is $\omega_s$ (given by $2\pi f_s$), set by system frequency, +- Mechanical rotor speed (frequency at the load): $\omega_r$ + +**Operating regions:** +- When rotor is synchronous with system frequency: $s = 0$ $\rightarrow$ no induced torque. +- Normal operation: $0 < s < 1$. Rotor is slightly slower than the rotating field $\rightarrow$ induces current $\rightarrow$ produces torque. +- Stall: $s \to 1$. Rotor stopped, max current, high losses. + +**Mechanical dynamics (sign flip if you differentiate w.r.t. slip):** + +```math +J\frac{d\omega_r}{dt} = T_e(V,\omega_r) - T_m +\quad\Longleftrightarrow\quad +J\,\omega_s\,\frac{ds}{dt} = T_m - T_e(V,s). +``` + +**Variable definitions:** +- Rotor inertia (kg·$m^2$): $J$ +- Rotor mechanical speed/frequency (rad/s): $\omega_r$ +- Electromagnetic torque: $T_e$ (depends on bus voltage $V$, frequency $\omega_s$ (slip formulation), or $\omega_r$ (standard formulation)), +- Mechanical load torque: $T_m$ +""" + +# ╔═╡ 160fd7d9-a3c2-4f22-951e-deed6f32e09b +md""" +## Example: Induction Motor Response During a Voltage Sag + +**Sequence of events:** + +1. **Voltage drop:** $V$ suddenly decreases. +2. **Torque imbalance:** Electromagnetic torque $T_e(V,\omega_r)$ falls below mechanical torque $T_m$. +3. **Rotor slowdown:** $\omega_r$ decreases $\Rightarrow$ slip $s$ increases. +4. **Increased current and VAR demand:** The motor draws more current to restore torque, which further depresses voltage. +5. **Possible stalling:** If $V$ remains low, the motor stalls — reactive power skyrockets $\Rightarrow$ voltage collapse. + +IM Modeling is key to capture this nonlinear instability mechanism. +""" + +# ╔═╡ 56b58c9f-f8ce-4117-8105-70083c23fde9 +md""" +## How TSC-OPF Prevents Motor Stalling and Voltage Collapse + +The transient stability-constrained optimization framework directly addresses these instability mechanisms. **In TSC-OPF, dynamics and limits are enforced directly:** + +```math +\dot{x} = f(x, y, p), \qquad 0 = g(x, y, p), \qquad h(x(t), y(t)) \le 0, \;\forall t. +``` + +**The IM model contributes to the dynamic states $x$ in TSC-OPF:** +- Induction motor slip $s$, generator rotor angles, inverter controls, etc. +- Their evolution $f(x,y,p)$ describes how voltages and speeds change after a disturbance. +- Dynamic constraints ensure stall condition is not reached. + +**Constraint function $h(x(t),y(t))$:** +- Enforces time-domain limits such as + + ```math + V_i(t) \ge V_{\min}, \quad \forall t \in [0, T_{\text{rec}}], + ``` + + where $T_{\text{rec}}$ is the recovery time. This ensures bus voltages remain within safe recovery bounds during the entire horizon after a disturbance. +- Prevents continued voltage sag that would drive $T_e(V,s)$ down and cause stalling. +""" + +# ╔═╡ 03d81d40-f285-47d6-bbf4-db3e8efc7bd1 +md""" +## Wrap up (Induction Motor Models) + +Controls $p$ are chosen so that $f$ remains stable under disturbances, and the chain of events above is prevented since motor and network dynamics are embedded in $f$, $g$, and $h$. + +This model is typically used when there's a fast transient or stalling, and the time scale is in milliseconds to second. Useful for short-term voltage stability and transient studies. +""" + +# ╔═╡ a4b027e0-15e6-4097-acc9-358fb075fd7f +md""" +## Exponential Recovery Load (ERL): Motivation and Concept + +Beyond individual motor dynamics, aggregate load behavior exhibits exponential recovery patterns. **Goal:** Represent aggregate load behavior during voltage recovery after a disturbance. + +**Empirical Observation:** +- When voltage dips, total active and reactive loads drop immediately. +- Loads such as motor controls and HVAC systems **slowly restore** their power draw as voltage recovers. +- The recovery follows an **exponential time pattern**, not an instantaneous jump. + +**Idea:** + +Introduce internal states that describe this gradual return: + +```math +P_d(t) = f_P(V(t),x_p(t)), \qquad Q_d(t) = f_Q(V(t),x_q(t)). +``` + +where $x_p(t)$ and $x_q(t)$ are the internal states of the active and reactive load. + +These states evolve according to first-order differential equations, capturing the "memory" of how far the load has recovered. +""" + +# ╔═╡ e93c6dc1-2f8d-4e2f-bbed-db926643f32a +md""" +## Adaptive Exponential Recovery Load (ERL) Model + +The adaptive ERL model captures voltage-dependent recovery through differential equations. **Mathematical Form:** + +```math +\begin{aligned} +T_p \frac{dx_p}{dt} &= -x_p\!\left(\frac{V}{V_0}\right)^{N_{ps}} + + P_0\!\left(\frac{V}{V_0}\right)^{N_{pt}},\\[3pt] +P_d &= x_p\!\left(\frac{V}{V_0}\right)^{N_{pt}},\\[6pt] +T_q \frac{dx_q}{dt} &= -x_q\!\left(\frac{V}{V_0}\right)^{N_{qs}} + + Q_0\!\left(\frac{V}{V_0}\right)^{N_{qt}},\\[3pt] +Q_d &= x_q\!\left(\frac{V}{V_0}\right)^{N_{qt}}. +\end{aligned} +``` + +**Parameters:** +- Internal recovery states (how much of the load has recovered): $x_p, x_q$ +- Time constants (larger values $\Rightarrow$ slower recovery): $T_p, T_q$ +- Nominal power withdrawals at reference voltage $V_0$: $P_0, Q_0$ +- Transient exponents (immediate voltage sensitivity): $N_{pt}, N_{qt}$. How sharply load power reacts immediately when voltage changes (the short-term dip). +- Steady-state exponents (long-term voltage dependence): $N_{ps}, N_{qs}$. How much the load power changes in the long term after voltage settles to a new level. + +**Interpretation:** +- After a voltage dip, power first follows the transient curve, then recovers exponentially toward the steady-state curve. +- When $V$ is weak, the recovery term $(V/V_0)^{N_{ps}}$ slows the rate of change — recovery stalls under low voltage. +- Recovery speed and power response both scale with voltage and almost halts under deep voltage sag. +""" + +# ╔═╡ 3f7130a0-51d6-4493-b07e-e5bf178ce834 +md""" +## Standard vs. Adaptive ERL Models + +**Standard ERL model:** + +```math +\begin{aligned} +T_p \frac{dx_p}{dt} &= -x_p + P_0\!\left[\!\left(\frac{V}{V_0}\right)^{N_{ps}} - \left(\frac{V}{V_0}\right)^{N_{pt}}\!\right],\\ +P_d &= x_p + P_0\!\left(\frac{V}{V_0}\right)^{N_{pt}}. +\end{aligned} +``` + +**Key difference:** +- In the **standard** model, $dx_p/dt$ depends on $V$ only through the voltage-dependent driving term. The state $x_p$ recovers constantly—independent of voltage. +- In the **adaptive** model, recovery slows when $V$ is low: the term $(V/V_0)^{N_{ps}}$ reduces the rate of change. The two differ in how strongly the voltage affects recovery speed back to pre-disturbance load. + +**Physical interpretation:** +- Standard ERL: suitable for moderate voltage dips. +- Adaptive ERL: more realistic for deep voltage sags. +""" + +# ╔═╡ 18207180-a40b-4bb7-87bb-9a0752286cea +md""" +## ERL Parameters + +- Parameters $(T_p, T_q, N_{ps}, N_{pt}, N_{qs}, N_{qt})$ are fitted empirically from from measurements of load recovery after voltage disturbances. +- They are not linked to physical machine constants, but to observed aggregate behavior of customer loads. + +**Compared to IM Model:** +- Models **voltage-driven recovery** of active/reactive power demand, not frequency-driven mechanical motion. +- Represents the slower phase of system response (seconds to minutes) vs. fast electromechanical transients. + +**Steady-state check:** + +Setting $\dot{x}_p=\dot{x}_q=0$ gives $P_d=P_0(V/V_0)^{N_{ps}}$, $Q_d=Q_0(V/V_0)^{N_{qs}}$, so ERL naturally reduces to a static voltage-dependent load, showing that when dynamics died out, the model reduces to a steady-state load. +""" + +# ╔═╡ 4d6fd1e2-9457-4f4c-84b1-62958a8b49de +md""" +## ERL in TSC-OPF and Contrast with Induction Motor Model + +**TSC-OPF representation:** + +```math +\dot{x} = f(x,y,p), \qquad 0 = g(x,y,p), \qquad h(x(t),y(t)) \le 0. +``` + +- ERL contributes states $x_p,x_q$ to $x$, with recovery dynamics embedded in $f(x,y,p)$. +- $P_d(V,x_p), Q_d(V,x_q)$ enter the algebraic equations $g(x,y,p)$ for power balance at each bus. +- Voltage-recovery limits in $h(x(t),y(t))$ ensure $V_i(t)\!\ge\!V_{\min}$ throughout the recovery window $[0,T_{\text{rec}}]$. + +**Contrast with IM model:** +- **Induction Motor (IM):** physics-based; state $s=(\omega_s-\omega_r)/\omega_s$; captures fast electromechanical and frequency-coupled transients (0.1–2 s). +- **ERL:** empirical; states $x_p,x_q$; captures slow, voltage-driven recovery (1–60 s). +""" + +# ╔═╡ 011a1e50-0316-42ec-9295-eeee64b76299 +md""" +## Wrap up +### Why We Go Beyond Steady-State OPF + +In this chapter, we motivated from the physical principles and operation constraints to demonstrate that power systems are fundamentally dynamic. **The bigger picture:** +- Even though steady-state analysis is helpful for many purposes and have lower computational burden, power systems are **dynamic systems.** +- After every change — a fault, switching event, or sudden load or generation shift — voltages, currents, and frequencies evolve continuously before settling. +- Understanding and controlling these dynamics is essential for keeping the grid stable, secure, and resilient. +""" + +# ╔═╡ 81952b3e-93c9-4179-8b12-5933d49749a6 +md""" +### Four Building Blocks of System Dynamics + +Throughout this chapter, we have explored four fundamental components that govern power system dynamics: + +- **Transients:** capture the immediate electromagnetic wave response that propagates through the network. +- **Generator swing equations:** describe how machines adjust speed and angle to balance mechanical and electrical power. +- **Inverters:** the new generation interface that emulates inertia and voltage support with renewables. +- **Dynamic loads:** model how real demand recovers and interacts with voltage and frequency. +""" + +# ╔═╡ a3b4c5d6-0894-4340-a18b-72f8e1204503 +md""" +### Why We Need Dynamic Optimization (TSC-OPF) + +These building blocks come together in transient stability-constrained optimization. **Why we need optimization with system dynamics embedded (TSC-OPF):** +- Steady-state OPF finds an economical operating point **only at equilibrium.** +- Transient Stability-Constrained OPF ensures that, even during those dynamic transitions, voltages remain safe, machines stay synchronized, and inverters and loads respond smoothly. +""" + +# ╔═╡ Cell order: +# ╟─4866207c-0894-4340-a18b-72f8e1204424 +# ╟─a1b2c3d4-0894-4340-a18b-72f8e1204425 +# ╟─e6aa5227-91bd-4cec-9448-24384708a305 +# ╟─19dac419-2df3-4878-b7da-608e8ec1e53b +# ╟─8ed6af99-1c5d-4d27-b60d-17d2e6c6ceff +# ╟─f742f5f3-d9d3-4374-ac9e-17073c3a2f6d +# ╟─ad8e9d79-e226-468e-9981-52b7cda7c955 +# ╟─fc329e51-e91c-4d83-b6fe-07a3bce44d5d +# ╟─d767175f-290d-403e-99de-d3a8f2ccb5b5 +# ╟─c9d0e1f2-0894-4340-a18b-72f8e1204432 +# ╟─9d1ea9be-2d7b-4602-8a8e-8426ea31661a +# ╟─71ba62e6-bcc1-4e9b-91cd-a8860ba0d2b5 +# ╟─7b4800c2-133d-4793-95b1-a654a4f19558 +# ╟─7961c1d1-3e82-49ea-8201-c5f82066d70d +# ╟─91b8a3e4-81ed-49fe-b785-4feacfd8788d +# ╟─f72775b9-818c-4a9b-9b66-cfccd88e17ed +# ╟─53ab9b31-78aa-49b6-9e24-df47aa80f25a +# ╟─1e337cdf-8add-42ab-a62f-23069e34ec39 +# ╟─23dc8fd4-59a1-414f-a165-b509458abd18 +# ╟─5814ece5-51b3-4dba-953d-c1f4b6ab04a8 +# ╟─c1d2e3f4-0894-4340-a18b-72f8e1204445 +# ╟─ca8dc9ed-0974-4205-9af4-a21c8a7cb707 +# ╟─9716f6a5-54d6-4abc-b0df-82f5a30e0196 +# ╟─a5b6c7d8-0894-4340-a18b-72f8e1204451 +# ╟─34595bd9-874e-4ca9-bf3c-3ebef9a37cec +# ╟─a9f00e8c-205e-45a9-83d4-1dea5b7627c1 +# ╟─22d5c113-82f0-4598-8c47-ead1face730e +# ╟─47e011b8-4fb8-4534-a504-ffe3009beb6e +# ╟─a3786b2d-9951-440f-854c-dfd40ad727f1 +# ╟─c3d4e5f6-0894-4340-a18b-72f8e1204458 +# ╟─946ad231-4ddf-43a3-b2b9-95d502f4b5e9 +# ╟─f6399741-9b5f-4bd3-bae7-6cc1ed1bd718 +# ╟─214eacc5-0b60-44b8-8a53-9cce369debdd +# ╟─a7b8c9d0-0894-4340-a18b-72f8e1204464 +# ╟─6b64a495-6039-408c-91a9-4dfddf21d857 +# ╟─b5159081-3b0a-459a-9c5b-c2b4911d79e2 +# ╟─ad22ab28-884e-4c3b-8265-51a44685343d +# ╟─01ebbe37-0681-47bb-b851-5f16b9f4aeb5 +# ╟─86d07665-753e-4dbe-aa84-5b23ec0a616f +# ╟─8e4dc912-14ff-4290-8f96-926493e5ef81 +# ╟─c5d6e7f8-0894-4340-a18b-72f8e1204471 +# ╟─c0cc1b94-e651-40c2-8084-e9ebfad2a457 +# ╟─4702e992-a163-40f3-ab55-f9e8e848d0c7 +# ╟─1566dce2-fd36-4110-8220-97eefe043cbb +# ╟─9bd48789-5d3d-495c-acd3-6586ae616136 +# ╟─a9b0c1d2-0894-4340-a18b-72f8e1204477 +# ╟─abcd31d0-c6eb-4bc7-a752-83a8d7f6fda1 +# ╟─b16732b7-ec08-43c7-9c08-489c8c8bbecb +# ╟─8ee16365-6d48-4073-9482-44dd58b7e338 +# ╟─f05940b2-5a30-46dc-8811-5f3d6b0c74a0 +# ╟─75deac76-f89c-4b84-a132-67591177f5dd +# ╟─0a2c4c0a-c68e-4f21-afbb-1b80791ec166 +# ╟─e14c2b45-3a7d-4e27-9c13-79ae514b1881 +# ╟─6ff3fd90-23cd-4cd0-95cf-d4e1d5ac3bdf +# ╟─b32a299d-4d0a-4e8b-b576-15bb32acad24 +# ╟─4db9cfa4-66c7-4b71-b0b3-5c16eaa2bb9e +# ╟─a0b43f28-8e17-4633-8eab-b9554e05c8f6 +# ╟─c7d8e9f0-0894-4340-a18b-72f8e1204484 +# ╟─20d5d03f-0225-4d3c-b0d2-d7440340b821 +# ╟─37f242b9-454f-4361-a2e1-98acae57b6fe +# ╟─4211a2c2-4a3a-4a63-8d2e-dc6c94e0cfc6 +# ╟─8ca0ad91-2fb5-4e64-9f6f-5498fa39d44b +# ╟─a1b2c3d4-0894-4340-a18b-72f8e1204490 +# ╟─160fd7d9-a3c2-4f22-951e-deed6f32e09b +# ╟─56b58c9f-f8ce-4117-8105-70083c23fde9 +# ╟─03d81d40-f285-47d6-bbf4-db3e8efc7bd1 +# ╟─a4b027e0-15e6-4097-acc9-358fb075fd7f +# ╟─e93c6dc1-2f8d-4e2f-bbed-db926643f32a +# ╟─3f7130a0-51d6-4493-b07e-e5bf178ce834 +# ╟─18207180-a40b-4bb7-87bb-9a0752286cea +# ╟─4d6fd1e2-9457-4f4c-84b1-62958a8b49de +# ╟─011a1e50-0316-42ec-9295-eeee64b76299 +# ╟─81952b3e-93c9-4179-8b12-5933d49749a6 +# ╟─a3b4c5d6-0894-4340-a18b-72f8e1204503 diff --git a/class15/class15.md b/class15/class15.md index b42e350..d6b4761 100644 --- a/class15/class15.md +++ b/class15/class15.md @@ -6,5 +6,51 @@ --- -Add notes, links, and resources below. +# Overview + +This chapter introduces the foundational dynamic behaviors of electric power systems and shows how they are incorporated into modern optimal control formulations such as Transient Stability–Constrained Optimal Power Flow (TSC-OPF). We begin with the physics of electromagnetic transients to motivate the formulation of TSC-OPF, move through generator and inverter dynamics, and conclude with dynamic load models that capture how demand responds during disturbances. Together, these components form the backbone required to understand, simulate, and optimize real-world power system behavior. + +# Materials + +The chapter is implemented as a [Pluto notebook](https://learningtooptimize.github.io/LearningToControlClass/dev/class15/class15.html), which contains derivations, visuals, and algorhtmic examples. The [lecture slide](https://learningtooptimize.github.io/LearningToControlClass/dev/class15/class15_lecture.pdf) contains the material of the video recording. + +# Topics Covered + +## Transients and Electromagnetic Dynamics +- Physical origin of transients in power system +- Connection between Faraday's law, inductors/capacitors, and transient behavior +- Relation of time-domain differential equations to steady-state phasor models +- Introduction to transmission-line dynamics and telegrapher’s equations + +## Generator Swing Equation +- Rotor acceleration and deceleration under power imbalance +- Role of inertia in stabilizing frequency +- Per-unit formulation and damping effects + +## Inverter Dynamics and Grid Control +- Differences between synchronous generators and renewable inverters +- Grid-following vs. grid-forming behavior +- Virtual inertia and frequency droop control for renewable integration + +## Dynamic Load Models +- Limitations of static OPF load representations +- Induction motor dynamics: slip, torque imbalance, and stalling behavior +- Voltage recovery models such as Exponential Recovery Load (ERL) +- Differences between physics-based motor models and empirical aggregate models + +## Transient Stability–Constrained Optimal Power Flow (TSC-OPF) +- Time-domain constraints ensuring system stability during disturbances +- Solution methods such as direct transcription and multiple-shooting formulations +- Forward and adjoint sensitivity analysis for efficient gradient calculation + +# Learning Objectives + +By the end of this chapter, readers will be able to: + +- Describe the physical origins of transients and how they propagate in networks +- Explain generator swing dynamics and how they regulate grid frequency +- Understand how inverter controls emulate generator behavior for stability +- Distinguish between static and dynamic load models and when each is appropriate +- Interpret how system dynamics are embedded in TSC-OPF formulations +- Understand the role of sensitivity analysis in dynamic optimal control diff --git a/class15/class15.tex b/class15/class15.tex new file mode 100644 index 0000000..e5d81fd --- /dev/null +++ b/class15/class15.tex @@ -0,0 +1,1413 @@ +\documentclass[aspectratio=169]{beamer} +\usetheme{CambridgeUS} +\usecolortheme{dolphin} +\setbeamertemplate{navigation symbols}{} +\usepackage[utf8]{inputenc} +\usepackage{hyperref} +\usepackage{amsmath, amssymb} +\usepackage{graphicx} +\usepackage{booktabs} +\title{Dynamic Optimal Control of Power Systems} +\author{Shuaicheng Tong} +\date{} + +\begin{document} + +\begin{frame} + \titlepage +\end{frame} + +\begin{frame}{Outline} + \begin{itemize} + \item Transients + \item Generator swing equations + \item Inverters + \item Dynamic Load Models + \end{itemize} +\end{frame} + +% % --- Fuel-Powered Plants +% \begin{frame}{What is Power System?} +% \textbf{Fuel-Powered Plants} +% \begin{columns}[T,onlytextwidth] +% \column{0.5\textwidth} +% \begin{itemize} +% \item Coal Power Plants +% \item Natural Gas Plants +% \item Nuclear Power Plants +% \end{itemize} +% \column{0.5\textwidth} +% \begin{figure} +% \centering +% \includegraphics[width=0.8\textwidth]{images/gasPlant.jpeg} +% \caption{Gas Power Plant} +% \end{figure} +% \end{columns} +% \end{frame} + +% % --- Renewable Generation +% \begin{frame}{What is Power System?} +% \begin{columns}[T,onlytextwidth] +% \column{0.5\textwidth} +% \textbf{Renewable Generation} +% \begin{itemize} +% \item Wind Farms +% \item Solar Plants +% \item Hydroelectric Plants +% \end{itemize} +% \column{0.5\textwidth} +% \begin{figure} +% \centering +% \includegraphics[width=0.8\textwidth]{images/hydroPlant.jpg} +% \caption{Hydroelectric Plant} +% \end{figure} +% \end{columns} +% \end{frame} + +% % --- Warm-up +% \begin{frame}{Warm-up Questions} +% \begin{itemize} +% \item Classic problems in power system: +% \begin{itemize} +% \item Optimization +% \item Generator Dispatch +% \end{itemize} +% \item How they relate to control +% \begin{itemize} +% \item Think general control that you see in your daily life for now: flipping a switch, pressing a button, etc. +% \end{itemize} +% \item What real-world problems are they trying to address +% \item What problems they are \emph{not} addressing +% \item What are the constraints? Which are soft and which are hard? +% \end{itemize} +% \end{frame} + +% --- 3 Bus Network – Economic Dispatch +\begin{frame}{3 Bus Network -- Economic Dispatch} +\begin{columns}[T,onlytextwidth] +\column{0.5\textwidth} +\begin{itemize} + \item Bus 1 load: 50 MW + \item Bus 3 load: 75 MW + \item Generator 1: Capacity 100 MW, Cost \$8/MW + \item Generator 2: Capacity 40 MW, Cost \$2/MW +\end{itemize} +\column{0.5\textwidth} +\begin{figure} +\centering +\includegraphics[width=0.9\textwidth]{images/3Bus.png} +\caption{3-Bus Power System Network} +\end{figure} +\end{columns} +\end{frame} + +% % --- Economic Dispatch Question +% \begin{frame}{Economic Dispatch Question} +% \begin{block}{Question} +% What is the Economic Dispatch problem (in its most basic form)? +% \end{block} +% \begin{block}{Answer} +% An optimization problem that aims to find the lowest-cost generation dispatch that satisfies the load demand given the load, generation, and cost. +% \end{block} +% \end{frame} + +% --- QP formulation of ED +\begin{frame}{Quadratic Program (QP) formulation of ED} +\begin{align} +\min_{p_g} \quad & \sum_{g \in \mathcal{G}} C_g(p_g) \\ +\text{s.t.} \quad & \sum_{g \in \mathcal{G}} p_g = \sum_{d \in \mathcal{D}} P_d \quad \text{(power balance)} \\ +& p_g^{\min} \leq p_g \leq p_g^{\max} \quad \forall g \in \mathcal{G} \quad \text{(capacity bounds)} +\end{align} + +where: +\begin{itemize} + \item $p_g$: power output of generator $g$ + \item $C_g(p_g)$: cost function of generator $g$ (often quadratic: $a_g p_g^2 + b_g p_g + c_g$) + \item $P_d$: power demand at load $d$ + \item $\mathcal{G}$: set of generators, $\mathcal{D}$: set of loads +\end{itemize} +\end{frame} + +% --- Exercise - formulate the ED problem for the 3-bus network +\begin{frame}{Exercise: Formulate the ED problem for the 3-bus network} +\begin{figure} +\centering +\includegraphics[width=0.7\textwidth]{images/3Bus.png} +\caption{3-Bus Power System Network} +\end{figure} +\end{frame} + +% --- ED Formulation Answer +\begin{frame}{ED Formulation Answer} +\begin{align} +\min_{p_1, p_2} \quad & 8p_1 + 2p_2 \\ +\text{s.t.} \quad & p_1 + p_2 = 125 \quad \text{(power balance)} \\ +& 0 \leq p_1 \leq 100 \quad \text{(Gen 1 limits)} \\ +& 0 \leq p_2 \leq 40 \quad \text{(Gen 2 limits)} +\end{align} + +\textbf{Solution:} $p_1 = 85$ MW, $p_2 = 40$ MW +\begin{itemize} + \item Total cost: $8 \times 85 + 2 \times 40 = 760$ \$/hour + \item Gen 2 at maximum capacity (greedy) + \item Gen 1 supplies remaining demand +\end{itemize} +\end{frame} + +% --- Discussion Questions +\begin{frame}{Discussion Questions} +What do you observe from your formulation? +\begin{itemize} + \item What kind of problem is this (linear, quadratic, etc.)? + \item The power network is a graph -- what type? What is missing here? + \item The flow is not controllable - we did not place branch constraints. +\end{itemize} +\end{frame} + +% --- What's the Problem? +\begin{frame}{What's the Problem?} +\begin{itemize} + \item The graph should be directed: power has flow directions + \item Line ratings and safety are ignored in ED + % \item I like to think about suspension bridges over rivers. Is it safe for hundreds of people to cross at the same time? Would it be safe for the concrete bridge on 5th street? + \item Overloading lines is dangerous (thermal expansion, sag, wildfire risk) + \item What is a power line: + \begin{itemize} + \item Metal coil that expands and heats up when current is higher. + \item That’s why we have rating (magnitude of power flow cannot exceed this amount). Physically you can exceed it (nothing is preventing the power to flow) a bit, but there are consequences above ... + \end{itemize} + \item We need branch (line) constraints to ensure safe operation +\end{itemize} +\end{frame} + +% --- DC Power Flow +\begin{frame}{DC Power Flow} +\textbf{Data:} +\begin{itemize} + \item Generator set $\mathcal{G}_i$ at bus $i$ (nodal generation) + \item Load set $\mathcal{L}_i$ at bus $i$ (nodal load) + \item Costs $C_j(P_j)$ quadratic or piecewise-linear for generator $j$ + \item Line limits $F_\ell^{\max}$, generator bounds $P_j^{\min}, P_j^{\max}$ +\end{itemize} + +\textbf{Decision variables:} +\begin{itemize} + \item Generator outputs $P_j$ for $j \in \mathcal{G}_i$ + \item Bus angles $\theta_i$ for $i \in \mathcal{N}$ + \item Line flows $f_\ell$ for $\ell \in \mathcal{L}$ +\end{itemize} +\end{frame} + +% --- DC Power Flow Formulation +\begin{frame}{DC Power Flow Formulation} +\begin{align} +\min_{P_j, \theta} \quad & \sum_{i \in \mathcal{N}} \sum_{j \in \mathcal{G}_i} C_j(P_j) \\ +\text{s.t.} \quad & \sum_{j \in \mathcal{G}_i} P_j - \sum_{j \in \mathcal{L}_i} P_j = \sum_{k: (i,k) \in \mathcal{L}} \frac{1}{x_{ik}} (\theta_i - \theta_k) \quad \forall i \in \mathcal{N} \\ +& f_\ell = \frac{1}{x_\ell} (\theta_{i(\ell)} - \theta_{j(\ell)}), \quad -F_\ell^{\max} \leq f_\ell \leq F_\ell^{\max} \quad \forall \ell \in \mathcal{L} \\ +& P_j^{\min} \leq P_j \leq P_j^{\max} \quad \forall j \in \mathcal{G}_i, \forall i \in \mathcal{N} \\ +& \theta_{\text{ref}} = 0 +\end{align} + +\begin{itemize} + \item $x_{ij}$: reactance of line. $1/x_{ij} = b_{ij}$: susceptance (manufacturer specified) + \item Reference bus: only for modeling, you can pick any bus as the reference bus. We only care about angle differences (which carries current through lines + \item Individual bus angle has no physical meaning +\end{itemize} +\end{frame} + +% --- Exercise: solve DCOPF after ED +\begin{frame}{Exercise: Solve DCOPF (solver suggested: Ipopt)} +\begin{figure} +\centering +\includegraphics[width=0.7\textwidth]{images/3BusWConstraints.png} +\caption{3-Bus Network with Constraints} +\end{figure} + +\textbf{How did I get the numbers:} +\begin{itemize} + \item Assume P1 generates 85 MW, with 50 MW of load, the net injection is 35 MW + \item Assume P2 generates 40 MW, with no load, net injection is 40 MW (we take upwards arrow as injection) + \item Bus 3 has no gen, only load +\end{itemize} +\end{frame} + +% --- DCOPF Solution +\begin{frame}{DCOPF Solution} +\begin{figure} +\centering +\includegraphics[width=0.3\textwidth]{images/DCOPFAnswer1.png} +\caption{DCOPF Solution Results} +\end{figure} +\end{frame} + +% --- DCOPF Solution Details +\begin{frame}{DCOPF Solution Details} +\begin{figure} +\centering +\includegraphics[width=0.5\textwidth]{images/DCOPFAnswer2.jpeg} +\caption{DCOPF Detailed Analysis} +\end{figure} +\end{frame} + +% --- Wrap up +\begin{frame}{Wrap Up} +\begin{itemize} + \item You will see that without thermal limits, optimal dispatch can overload lines + % \item In operation, operators typically solve a DCOPF (e.g., with Ipopt solver) + \item Reference bus is arbitrarily picked by the solver. + \item Real systems are AC (complex voltages/currents) -- much harder. This is just a lightweight intro so we can think about expressing real-world problems as optimization formulations without overburdening ourselves with AC physics, which we will see in transient stability section. +\end{itemize} +\end{frame} + +\begin{frame}{Introduction to Transient Stability} +\begin{center} +\Huge +Transient Dynamics +\end{center} +\end{frame} + +\begin{frame}{What are transients?} +When current or voltage changes suddenly — switching, faults, lightning, equipment failures, etc. — the system experiences a \textbf{transient} +\begin{itemize} + \item Transients are short-lived, high-frequency events where stored magnetic and electric energy exchange rapidly. + \item \textbf{Faraday’s law} of electromagnetic induction governs these effects:\\[4pt] + A change in magnetic flux through a circuit induces a voltage across it. + \begin{align*} + v(t) &= \frac{d\Phi(t)}{dt} + \end{align*} + where $\Phi(t)$ is the magnetic flux through the circuit. +\end{itemize} + + +\end{frame} + +\begin{frame}{Transients Continued} +\begin{itemize} + \item For an inductor, the magnetic flux $\Phi$ is proportional to the current: + \begin{align*} + \Phi(t) &= L\,i(t) + \end{align*} + where $L$ is the inductance (magnetic energy stored per unit current). + \item Substituting gives the familiar time-domain voltage rule: + \begin{align*} + \boxed{v_L(t) = L\,\frac{di(t)}{dt}} + \end{align*} +\end{itemize} +Note that steady-state phasor analysis no longer holds due to the time-varying nature of the magnetic flux. I will draw the connection later. +\end{frame} + +\begin{frame}{Sinusoidal steady state} + Assume all quantities have angular frequency $\omega$: + \begin{align*} + i(t) &= \operatorname{Re}\!\left\{ I\,e^{j\omega t} \right\}, \\ + % v_L(t) &= \operatorname{Re}\!\left\{ V\,e^{j\omega t} \right\}. + \end{align*} + Differentiate the current: + \begin{align*} + \frac{di(t)}{dt} &= \operatorname{Re}\!\left\{ j\omega I\, e^{j\omega t} \right\}. + \end{align*} + + Substitute into $v_L(t) = L\,\frac{di}{dt}$: + \begin{align*} + v_L(t) &= \operatorname{Re}\!\left\{ (j\omega L I)\, e^{j\omega t} \right\}. + \end{align*} +\end{frame} + +\begin{frame}{Phasor (frequency-domain) relation} + By definition, the \textbf{phasor} is the complex amplitude multiplying $e^{j\omega t}$. + + From the previous expression, + \begin{align*} + v_L(t) &= \operatorname{Re}\!\left\{ (j\omega L I)\, e^{j\omega t} \right\}, + \end{align*} + so the \textbf{voltage phasor} is + \begin{align*} + \boxed{V = j\omega L\, I}. + \end{align*} + + % Thus the inductor's impedance is + % \begin{align*} + % \boxed{Z_L = \frac{V}{I} = j\omega L}. + % \end{align*} +\end{frame} + +% ====================================================== +\begin{frame}{Capacitor law: from time domain to phasor domain} + \textbf{Physical basis:} + \begin{itemize} + \item A capacitor stores energy in an \textbf{electric field}.The stored charge $q(t)$ is proportional to voltage: + \begin{align*} + q(t) &= C\,v(t) + \end{align*} + where $C$ is the capacitance. + \item The current is the rate of change of charge: + \begin{align*} + \boxed{i_C(t) = \frac{dq(t)}{dt} = C\,\frac{dv(t)}{dt}}. + \end{align*} + \end{itemize} + + \textbf{Under sinusoidal steady state:} + \begin{align*} + v(t) &= \operatorname{Re}\!\left\{ V e^{j\omega t} \right\} + \end{align*} + where $V$ is the voltage phasor. +\end{frame} + +\begin{frame}{Capacitor law: from time domain to phasor domain} + \begin{align*} + \frac{dv(t)}{dt} &= \operatorname{Re}\!\left\{ j\omega V e^{j\omega t} \right\}, \\ + i_C(t) &= \operatorname{Re}\!\left\{ (j\omega C V) e^{j\omega t} \right\}. + \end{align*} + + Hence, the \textbf{phasor relationship} is: + \begin{align*} + \boxed{I = j\omega C\,V}, \qquad + \boxed{Y_C = j\omega C}, \qquad + \boxed{Z_C = \frac{1}{j\omega C}}. + \end{align*} +You could of course derive admittance and impedance for inductors following similar steps. This is how you go from time domain to phasor domain. Note that the above is for ideal inductors and capacitors. +\end{frame} + +% ====================================================== +\begin{frame}{More realistic transmission line model} + The voltage $v(x,t)$ and current $i(x,t)$ vary \textbf{both} in time and along the line coordinate $x$. + Their spatial derivatives represent how these quantities change \textbf{per unit length:} + \begin{align*} + \frac{\partial v(x,t)}{\partial x} &\;\Rightarrow\; \text{voltage drop per unit length (V/m)}, \\ + \frac{\partial i(x,t)}{\partial x} &\;\Rightarrow\; \text{current change per unit length (A/m)}. + \end{align*} + \textbf{Real lines are lossy:} + \begin{itemize} + \item Conductor series resistance causes Ohmic losses (heat dissipation) $\Rightarrow$ add $-R'\,i(x,t)$. + \item Current leakage due to shunt conductance $\Rightarrow$ add $-G'\,v(x,t)$. + \end{itemize} + \vspace{0.2cm} + Hence, the full \textbf{telegrapher's equations} become: + % \begin{align*} + % \frac{\partial v(x,t)}{\partial x} &= -L'\frac{\partial i(x,t)}{\partial t} - R'\,i(x,t),\\ + % \end{align*} + \end{frame} + +\begin{frame}{More on realistic transmission line model} + \begin{align*} + \frac{\partial v(x,t)}{\partial x} &= -L'\frac{\partial i(x,t)}{\partial t} - R'\,i(x,t),\\ + \frac{\partial i(x,t)}{\partial x} &= -C'\frac{\partial v(x,t)}{\partial t} - G'\,v(x,t). + \end{align*} + You can think about $R'$ and $G'$ as damping terms. $L$ and $C$ relate to energy storage, and $R$ and $G$ relate to energy dissipation. + + % The minus sign is because we take the forward direction as positive for $x$, while voltage and current drop in the same direction (they diminish due to energy storage or loss). +\end{frame} + +% ====================================================== +\begin{frame}{How the above was derived} + + \textbf{Setup:} Consider a small transmission line segment between $x$ and $x+dx$. + \begin{itemize} + \item $x$ increases in the direction of current flow ($+x$). + \item $i(x,t)$: current flowing in $+x$ direction. + \item $v(x,t)$: voltage between conductors (top to bottom) at position $x$. + \end{itemize} + + \textbf{1. Voltage change between segment ends:} + \[ + v(x,t) - v(x+dx,t) = -\frac{\partial v(x,t)}{\partial x}\,dx. + \] + + \textbf{2. Series drops over $dx$:} + \begin{align*} + \text{Resistive drop} &:\; R'\,i(x,t)\,dx,\\ + \text{Inductive drop} &:\; L'\,\frac{\partial i(x,t)}{\partial t}\,dx. + \end{align*} +\end{frame} + +\begin{frame}{How the above was derived} + \textbf{3. Apply Kichhoff Voltage Law:}\\[2pt] + (The sum of voltage drops along the closed path must equal zero.) + \[ + (R'\,i + L'\tfrac{\partial i}{\partial t})\,dx + \big[v(x+dx,t) - v(x,t)\big] = 0. + \] + + \textbf{4. Substitute and simplify:} + \[ + \frac{\partial v(x,t)}{\partial x}\,dx = -L'\frac{\partial i(x,t)}{\partial t}\,dx - R'\,i(x,t)\,dx. + \] + + \textbf{5. Divide by $dx$:} + \[ + \boxed{\frac{\partial v(x,t)}{\partial x} = -L'\frac{\partial i(x,t)}{\partial t} - R'i(x,t)}. + \] + + \small The negative sign indicates that voltage \emph{drops} in the $+x$ direction + due to both inductive ($L'\,\partial i/\partial t$) and resistive ($R'i$) effects. +\end{frame} + + +\begin{frame}{How does physics relate to optimization?} + \LARGE + Transient Stability Constrained Optimal Power Flow (TSCOPF) +\end{frame} + +\begin{frame}{TSCOPF formulation} + \begin{align*} + \min_{p,\,x(t),\,y(t)} \quad & C(p) && \text{(1)}\\ + \text{s.t.}\quad + & g_s(p) = 0 && \text{(2)}\\ + & h_s^{-} \le h_s(p) \le h_s^{+} && \text{(3)}\\ + & p^{-} \le p \le p^{+} && \text{(4)}\\[3pt] + & \dot{x} = f(x,y,p), \quad x(t_0)=I_x^0(p) && \text{(5)}\\ + & 0 = g(x,y,p), \quad y(t_0)=I_y^0(p) && \text{(6)}\\ + & h(x(t),y(t)) \le 0, \quad \forall t && \text{(7)} + \end{align*} + + \textbf{Objective:} minimize operating cost or transmission losses. (2) includes steady-state nodal power balance constraints. (3) includes apparent/real power/reactive power/current flow constraints on lines. (4) includes generator capacity or voltage magnitude constraints. +\end{frame} + +\begin{frame}{Dynamic Transient Constraints: (5)--(7)} + % \[ + % \dot{x} = f(x, y, p), \qquad x(t_0) = I_x^0(p) + % \] + Eq. (5): + \begin{itemize} + \item $x$: state variables (rotor angles, speeds, control states). Initial states computed from steady-state solution corresponding to control variables $p$. + \item $f(x,y,p)$: system dynamics — e.g., generator swing equations, Telegrapher equations, or capacitor/inductor transient models. + \item $y$: dependent variables (nodal voltages magnitude and angle, line currents, etc.). + \item $p$: control variables (generator setpoints, tap settings, shunt positions, etc.) + \item Enforce the physics of transient after a disturbance. + \end{itemize} + + % \[ + % 0 = g(x, y, p), \qquad y(t_0) = I_y^0(p) + % \] + Eq. (6): embed dynamics into steady-state constraints. + \begin{itemize} + \item $g(x,y,p)$: Same physical laws as (2) e.g. KCL but now applied at every instant $t$'s states $x(t), y(t)$ to extend to the dynamics. + % \item $h(x(t),y(t)) \le 0$: Operational constraints need to be respected for the entire trajectory $x(t), y(t)$. + \end{itemize} +\end{frame} + +\begin{frame}{Dynamic and Transient Constraints: (7)} + + \textbf{(7) Transient limits:} + \[ + h(x(t), y(t)) \le 0, \quad \forall t + \] + \begin{itemize} + \item Enforce time-domain operating limits during the transient response. + \item Examples: + \begin{itemize} + \item Bus voltage magnitudes stay within limits. + \item Rotor angle differences remain stable. + \item Line thermal limits respected. + \end{itemize} + \item Ensures \textbf{transient stability} under all time steps during instability. + \end{itemize} + +\end{frame} + +% ====================================================== +\begin{frame}{Solution Methods for TSC-OPF} + + \textbf{Indirect (variational) Methods:} + \begin{itemize} + \item Based on Pontryagin's Maximum Principle. + \item Replace the differential equations of dynamics with inequalities that approximate the behavior in steady-state by linearizing into static conditions. + \item Examples: energy or Lyapunov functions or impose stability margin constraints on linearized Jacobian. + \end{itemize} + Instead of having to integrate over time, you get back a static nonlinear optimization problem that can be solved using standard solvers. + \textbf{In practice:} + \begin{itemize} + \item Mainly used for planning/screening/preventive security dispatch due to loss in accuracy. + \item Not sufficient to guarantee transient stability under large disturbances. + \item Validation still relies on time-domain (direct) simulation. + \end{itemize} +\end{frame} + +% ====================================================== +\begin{frame}{Direct Method: Simultaneous Discretization/Constraint Transcription} + + \textbf{Main idea:} Converts the time-dependent diff. eq. into a finite set of algebraic constraints before optimization so transient stabilitysimulator can be reused. + + \textbf{Discretization approach:} + \begin{itemize} + \item The simulation horizon is divided into multiple time steps $t_0, t_1, \dots, t_N$. + \item The diff. eq. is approximated at each step using numerical integration like implicit trapezoidal rule: + \[ + x(t) - \frac{\Delta t}{2} f(x(t), y(t), p) + - x(t-\Delta t) + - \frac{\Delta t}{2} f(x(t-\Delta t), y(t-\Delta t), p) = 0. + \] + \end{itemize} + + \textbf{Pros and Cons:} + \begin{itemize} + \item Produces one large-scale NLP that enforces the dynamics exactly for the entire trajectory (within discretization accuracy). + \item Computationally demanding due to the high dimensionality of variables and constraints from discretization. Accurate gradients is expensive from trajectory sensitivivity analysis. Hessians often approximated using BFGS updates. + \end{itemize} + + \end{frame} + + % ====================================================== +\begin{frame}{Direct Method: Multiple Shooting} + The multiple shooting method divides the simulation horizon into smaller time segments + $\,[t_0,t_1], [t_1,t_2], \dots, [t_{N-1},t_N]$. + \begin{itemize} + \item Each segment starts from its own initial condition + $x_i(t_i)$ and is integrated forward using the diff. eq. + $\dot{x}=f(x,y,p),\, 0=g(x,y,p)$ + to obtain the predicted final state $\hat{x}_i(t_{i+1})$. + \item Constraint to ensure continuity between segments: + \[ + x_{i+1}(t_{i+1}) = \hat{x}_i(t_{i+1}), + \] + \end{itemize} + + \textbf{Constraint form:} + \[ + s_i = S_i(s_{i-1},p), \quad \forall i \in 1,\dots,N_S, + \] + where $S_i(\cdot)$ is an implicit function that can be numerically integrated over segment $i$. \\ + Pros: Each segment can be integrated independently, so the Jacobian of the resulting NLP is better conditioned because the coupling is limited to adjacent segments instead of the entire trajectory. This segmentation improves numerical stability and allows for more efficient large-scale computation. + +\end{frame} + +% ====================================================== +\begin{frame}{Trajectory Sensitivity Analysis of TSC-OPF} + + \textbf{Purpose:} Quantify how system variables $x(t),y(t)$ changes with respect to small variations in control variables $p$ or intial conditions. Recall that with different control settings $p$, the entire transient trajectory changes and we would need to simulate the dynamics again to see what happens. This is expensive. Sensitivity analysis tells you how the trajectory and stability margins change with small changes in $p: \frac{\partial x}{\partial p}$ without running a new full simulation for every small perturbation. + + \textbf{Relation to numerical methods:} + \begin{itemize} + \item These sensitivities provide gradient information for solvers, which is used for both multiple shooting and constraint transcription. + % \item Complement the direct methods (discretization, shooting) by enabling efficient gradient-based updates of $p$. + \end{itemize} + +\end{frame} + +% ====================================================== +\begin{frame}{Forward Sensitivity Method} + \begin{itemize} + \item Computed by performing a forward integration of the sensitivity equations alongside the original diff. eq. system. + \item Efficient when the number of parameters is small. + \item The computational complexity is $\mathcal{O}(n_p)$, since $n_p$ forward integrations are required to compute the sensitivities. + \end{itemize} + + \textbf{Formulation:} + For the original diff. eq. system: + \[ + F(\dot{x}(t),\, x(t),\, p) = 0. + \] + The corresponding variational diff. eq. for the sensitivities is: + \[ + \frac{\partial F}{\partial \dot{x}}\,\dot{s} + + \frac{\partial F}{\partial x}\,s + + \frac{\partial F}{\partial p} = 0, + \] + with initial condition + \[ + s(t_0) = \frac{\partial x(t_0)}{\partial p}. + \] + +\end{frame} + +\begin{frame}{Forward Sensitivity Method} + \begin{itemize} + \item Each parameter $p_i$ perturbs the system differently. + \item Forward method tracks this by integrating a new "copy" of the linearized system, which shares the same Jacobian as the original DAE. + \end{itemize} + + \textbf{Pros and cons:} + \begin{itemize} + \item \textbf{Pros:} Simple and accurate, efficient when number of parameters is small. + \item \textbf{Cons:} Computational cost grows linearly with number of parameters. + \end{itemize} + + \end{frame} + +% ====================================================== +\begin{frame}{Adjoint Method} + Efficient when the number of parameters is large. This only needs one backward integration in time to compute the sensitivities. + Formulation: + \begin{itemize} + \item Consider \[ + G(p) = \int_{t_0}^{T} g(x, p)\,dt. + \] + \item We want the gradient given by: + \[ + \frac{\partial G}{\partial p} + = + \int_{t_0}^{T} + \left( + \frac{\partial g}{\partial p} + - \lambda^{\mathsf{T}} \frac{\partial F}{\partial p} + \right) dt, + \] + \item The adjoint multiplier $\lambda(t)$ satisfies + \[ + \dot{\lambda} + = + -\,\frac{\partial g}{\partial x} + + \lambda^{\mathsf{T}}\frac{\partial F}{\partial x}. + \] + where $\lambda(T)=0$. + \end{itemize} + +\end{frame} + +\begin{frame}{Adjoint Method and wrapping up} + \textbf{Pros:} + \begin{itemize} + \item Efficient when the number of parameters is large. + \item The gradient is obtained in one pass. + \end{itemize} + + \textbf{Cons:} + \begin{itemize} + \item Higher memory cost due to storage of trajectory data and state variables in backward integration. + \end{itemize} + One can also obtain the gradients by finite differences, which is based on truncated Taylor series expansion. + + \end{frame} + + + + +% --- Power System History and Modern Power System +\begin{frame}{Power System History and Modern Power System} +\begin{block}{The Fuel Era (20th Century)} +Electricity produced mostly by coal, gas, nuclear. Generators are large synchronous machines with big spinning masses. Stable and predictable. Inertia from these machines naturally provides flexibility infrequency stability. Grid ran reliably for decades. +\end{block} +\begin{block}{The Renewable Era (2000s--Today)} +Wind expanded in 2000s, solar PV took off after 2010. Renewables now 20--40\%+ of real-time demand in some regions; dynamics changed. +\end{block} +\end{frame} + +% --- Synchronous Generators: How electricity is generated +\begin{frame}{Synchronous Generators: How electricity is generated} +\begin{columns}[T,onlytextwidth] +\column{0.5\textwidth} +\begin{itemize} + \item Rotor (heavy spinning mass) driven by turbines (steam, gas, hydro) + \item Faraday's law: changing magnetic field induces voltage in stator + \item Called "synchronous" because the rotor spins in sync with the grid's frequency (50 Hz in Europe, 60 Hz in North America) + \item If the grid frequency is 60 Hz, the rotor turns at a speed locked to 60 Hz +\end{itemize} +\column{0.5\textwidth} +\begin{figure} +\centering +\includegraphics[width=0.9\textwidth]{images/syncgen.png} +\caption{Generator Cross-Section} +\end{figure} +\end{columns} +\end{frame} + +% --- Spinning Mass in a Generator +\begin{frame}{Spinning Mass in a Generator} +\begin{itemize} + \item Inside a synchronous generator is a rotor — basically a giant heavy wheel of steel and copper (tens or hundreds of tons) + \item Turbines (steam from coal/nuclear, gas combustion, or flowing water in hydro) push on the rotor to make it spin + \item That rotor's mechanical rotation creates a rotating magnetic field, according to Faraday's law of induction, a changing magnetic field induces an alternating voltage in the stator windings + \item This is why the system is predictable: we know how to control these rotors. Put in more fuel to generate more power +\end{itemize} +\end{frame} + +% --- Generator Frequency Formula +\begin{frame}{Generator Frequency Formula} +\textbf{Frequency Formula:} +\begin{align} +f = \frac{N \times \text{RPM}}{120} +\end{align} +where $N$ = number of poles, RPM = rotor speed + +\textbf{Examples:} +\begin{itemize} + \item 2 poles, 3600 RPM → 60 Hz + \item 4 poles, 1800 RPM → 60 Hz +\end{itemize} + +\textbf{Why 50/60 Hz?} Historical choices: early engineers (Westinghouse, Edison, etc.) picked values that balanced motor performance and generator design. Once infrastructure was built, it became a standard. +\end{frame} + +% --- Kinetic Energy +\begin{frame}{Kinetic Energy} +\textbf{The rotor has stored kinetic energy:} +\begin{align} +E_{\text{kinetic}} = \frac{1}{2} J \omega^2 +\end{align} +where $J$ = moment of inertia (depends on mass + geometry), $\omega$ = rotor speed + +\textbf{If demand suddenly exceeds supply (a generator trips):} +\begin{itemize} + \item That small slow down of a rotor releases some of its stored kinetic energy into the grid instantly + \item But because there are so many large spinning machines, the grid behaves like a conveyor belt with so many wheels tied together. If one slows a bit, the others share the imbalance, so frequency changes slowly because the system has a huge inertia + \item This gives time for operators to fix things + \item Even if there are imbalances, things wouldn't get out of hand fast since there are so many other generators. They can share the load so each only needs to spin a little faster to keep up the frequency +\end{itemize} +\end{frame} + +% --- Renewables and Inverters +\begin{frame}{Inverters - Renewables} +\textbf{Today, renewables can supply 20–40\%+ of real-time demand.} +Cleaner, cheaper, more sustainable — but dynamics changed. + +Most renewables (solar PV, modern wind turbines, batteries) produce DC electricity (direct current). + +\textbf{What's the problem of DC power?} +\begin{itemize} + \item It only has amplitude (magnitude of voltage/current) + \item No phase, no frequency + \item But recall AC current has the waveform (that's why we have leading/lagging current which controls reactive power and power factor correction) + \item We need amplitude, frequency, and phase to describe AC current + \item That's why we need inverters, power electronics device that synthesizes sinusoidal AC from DC +\end{itemize} +\end{frame} + +% --- Inverter Operation (continued) +\begin{frame}{Inverter Operation} +\textbf{How it operates?} +\begin{enumerate} + \item Takes DC input from solar panels, wind turbine + \item Use power electronics that switches thousands of time per second to synthesize an AC waveform + \item Note that even the output is a smooth sinusoidal AC waveform, inside the inverter the switches turn the DC voltage on and off thousands of times per second (typical switching frequency = 2–20 kHz, sometimes higher) to approximate that smooth waveform + \item So even though the output is continuous, it's created by on/off pulses internally + \item The inverter synchronizes the AC output to the grid's frequency and phase. If grid is 60 Hz → inverter outputs 60 Hz. If grid is 59.9 Hz (after a disturbance) → inverter follows 59.9 Hz. + \item The voltage, current, and power factor are controlled through the programmed algorithms +\end{enumerate} +\end{frame} + +% --- Inverter Control Modes +\begin{frame}{Inverter Control Modes} +\textbf{In summary, the inverters are programmable devices by operators with control algorithms to act like generators. They wait for a signal from a grid so they can be:} +\begin{itemize} + \item \textbf{Grid-following}: track the grid's voltage and frequency → inject current accordingly + \item \textbf{Grid-forming}: behave like a voltage source, set their own frequency/voltage reference, and to adjust for power imbalance (some research area I heard of) +\end{itemize} + +They are not really generators - no spinning mass, no inertia, but they use control algorithms to mimic generator behavior. +\end{frame} + +% --- Internal view of inverters (placeholder) +\begin{frame}{Internal View of Inverters} +\begin{figure} +\centering +\includegraphics[width=0.3\textwidth]{images/inverter.jpg} +\caption{Internal View of Inverter} +\end{figure} + +\begin{itemize} + \item Capacitors and switching components on electronic mainboards (like in computer's motherboard, blue cylinders in upper left corner of the picture) + \item Programmable behavior defined by control firmware +\end{itemize} +\end{frame} + +% --- Problems with inverters +\begin{frame}{Problems with Inverters} +\textbf{This is all software-based. You do not have a natural physical property like a spinning rotor and inertia.} + +\begin{itemize} + \item No big spinning mass directly tied to frequency, so frequency changes much faster after a disturbance + \item The device measures grid signal and forces its output to follow + \item Unless explicitly programmed, they don't know when the conveyor belt slows down or speeds up (recall the previous analogy) + \item Even if they do, they don't have the capacity like big generators + \item \textbf{This is the key part:} they are just switching circuits with no agency to ramp up the power output (nature of renewables is their output is often independent of human control). Output is limited by weather and energy availability (sun/wind). + \item Renewables also locate in remote areas with long transmission lines, and the nature of their unpredictability (weather), makes their generation highly uncertain +\end{itemize} + +\textbf{We will build up to inverter control after we cover the generator swing equations.} +\end{frame} + +% --- Generator Swing Equations +\begin{frame}{Newton's Second Law} +\textbf{Linear Version:} +\begin{align} +F = ma +\end{align} +where $F$ = force (N), $m$ = mass (kg), $a$ = acceleration (m/s²) + +This says: imbalance of forces → acceleration of mass. + +\textbf{Rotational Version:} +For a rotating body (like a generator rotor), the equation is: +\begin{align} +T = J\alpha +\end{align} +where $T$ = torque (N·m), $J$ = moment of inertia (kg·m²), the rotational mass. $\alpha$ = angular acceleration (rad/s²) + +This says: imbalance of torques → rotor accelerates or decelerates. +Think torque as the angular equivalent of force. +\end{frame} + +% --- Applied to Generator Dynamics +\begin{frame}{Applied to Generator Dynamics} +\textbf{Two main torques act on a synchronous generator's rotor:} +\begin{itemize} + \item $T_m$: mechanical torque from the turbine (steam, gas, water) pushing the rotor + \item $T_e$: electromagnetic torque from the stator's magnetic field resisting the rotor (this is the grid "pulling" power out) +\end{itemize} + +\textbf{Torque imbalance:} +\begin{align} +J\alpha = T_m - T_e +\end{align} +where $\omega$: angular speed of rotor (rad/s), $\alpha = \dot{\omega}$: angular acceleration (rad/s²) + +\textbf{If $T_m > T_e$:} rotor accelerates + +\textbf{If $T_m < T_e$:} rotor slows down + +\textbf{If equal:} steady rotation +\end{frame} + +% --- From Torque to Power +\begin{frame}{From Torque to Power} +Recall $P = Fv$ (mechanical power is generated by a force $F$ on a body moving at a velocity $v$). In rotational systems, power is related by torque and angular speed (you can think about it as rotational equivalent as force) + +\textbf{Power = torque × speed:} +\begin{align} +P = T \cdot \omega +\end{align} + +So: +\begin{itemize} + \item Mechanical power input: $P_m = T_m \cdot \omega$ + \item Electrical power output: $P_e = T_e \cdot \omega$ +\end{itemize} + +Multiply the torque balance by $\omega$: +\begin{align} +J\omega\dot{\omega} = P_m - P_e +\end{align} + +This relates how fast the mass is spinning ($\omega$) to the imbalance of power input (generation) and power withdrawal (load + losses). +\end{frame} + +% --- From Torque to Power (Continued) +\begin{frame}{From Torque to Power (Continued)} +But recall that generators operate close to system frequency, so the generators spin at, i.e. the angular velocity is close to that 60 Hz constant. Since the variations are mostly tiny, we can define inertia constant $M = J\omega$ + +And we get the generator swing equation: +\begin{align} +M\dot{\omega} = P_m - P_e +\end{align} + +\textbf{Interpretation:} +\begin{itemize} + \item $M$: inertia constant, measures how much the rotor resists speed change (bigger mass → slower frequency drift) + \item $P_m$: mechanical input power (from fuel, water, steam) + \item $P_e$: electrical output power delivered to the grid +\end{itemize} +\end{frame} + +% --- Per-Unit Generator Swing Equation +\begin{frame}{Per-Unit Generator Swing Equation} +\textbf{Per-unit versions:} +Power are often defined at per unit, so we have: +\begin{align} +\frac{J\omega_s}{S_{\text{base}}} \dot{\omega} = (P_m - P_e)_{\text{pu}} +\end{align} + +There are sources that define $H = \frac{1}{2}\frac{J\omega_s^2}{S_{\text{base}}} \Rightarrow \frac{2H}{\omega_s} = \frac{J\omega_s}{S_{\text{base}}}$ + +$H \triangleq \frac{E_k}{S_{\text{base}}} = \frac{\frac{1}{2}J\omega_s^2}{S_{\text{base}}}$ comes from kinetic energy + +\vspace{0.5cm} +So we have per unit swing: +\begin{align} +\frac{2H}{\omega_s} \dot{\omega} = (P_m - P_e)_{\text{pu}} +\end{align} +\end{frame} + +% --- Damping and Advanced Forms +\begin{frame}{Damping and Advanced Forms} +Some also add damping: +\begin{align} +M\dot{\omega} + D(\omega - \omega_s) = P_m - P_e +\end{align} +as penalties to frequency deviation. $D$ captures any restoring force, or frictions and losses + +We can also write the per-unit acceleration form: +\begin{align} +2H \dot{\omega}_{\text{pu}} = (P_m - P_e)_{\text{pu}} +\end{align} +\end{frame} + +% --- Why this matters +\begin{frame}{Why This Matters} +\begin{itemize} + \item Stability depends on balancing generation and demand + \item Inertia slows down changes in frequency, buying time for control actions +\end{itemize} + +\textbf{Power imbalance effects:} +\begin{itemize} + \item If $P_m > P_e$: extra power → rotor speeds up → frequency rises + \item If $P_m < P_e$: shortage → rotor slows → frequency falls +\end{itemize} + +\textbf{Inertia $M$ slows down how fast this happens.} +\begin{itemize} + \item With many generators, $M$ is big. For a given imbalance, frequency drifts slowly → grid is flexible + \item With fewer machines (more renewables), $M$ is smaller → frequency changes faster → grid is fragile +\end{itemize} + +This is shown by writing the equation as $\dot{\omega} = \frac{P_m - P_e}{M}$. For a big $M$, the angular acceleration (frequency) is smaller when there is an imbalance. +\end{frame} + +% --- How does it relate to Inverters +\begin{frame}{How Does It Relate to Inverters?} +We previously discussed grid-following inverters. + +\textbf{Its control law works as:} +\begin{enumerate} + \item Measure voltage and frequency of the grid + \item Gets desired power output from an operator or solved from a market + \item Adjust its AC current output to deliver the desired power output at voltage and frequency GIVEN by the grid +\end{enumerate} + +\textbf{What's the problem with it?} No control over other parameters like voltage and frequency. The power output is only stable if the rest of the grid is stable. +\end{frame} + +% --- Grid-forming Inverters +\begin{frame}{Grid-forming Inverters} +\begin{itemize} + \item The inverter doesn't blindly follow the grid frequency, it defines its own reference voltage and frequency like a voltage source + \item Let the frequency shift slightly to reflect power imbalance between the renewable generation and the rest of the grid, so other machines (generators) know to ramp up or down + \item Able to define its own frequency is the key for the renewable to behave like a synchronous generator, and we now have the ability to model it in a swing equation by giving it a virtual mass defined by the local frequency +\end{itemize} + +We can now emulate synchronous machine behavior via controlling the ``virtual inertia''. + +\textbf{Reference:} J. Driesen and K. Visscher, "Virtual synchronous generators," 2008 IEEE Power and Energy Society General Meeting - Conversion and Delivery of Electrical Energy in the 21st Century, Pittsburgh, PA, USA, 2008, pp. 1-3. +\end{frame} + +% --- Grid-Forming Response to Disturbances +% \begin{frame}{Grid-Forming Response to Disturbances} +% \textbf{If the system is disturbed (load spike, generator trip):} +% \begin{itemize} +% \item The inverter does not instantly follow the dip like a grid-follower +% \item It adjusts frequency slightly in proportion to imbalance, so it behaves as it has inertia +% \item This stabilizes the grid frequency, slowing the drop +% \end{itemize} + +% \textbf{If the inverter alone can't cover the imbalance:} +% \begin{itemize} +% \item Its frequency will drift a bit away from 60 Hz +% \item That frequency deviation is a \emph{signal} to other generators or grid-forming inverters to pick up more power +% \item This is exactly how synchronous generators share load via droop control +% \end{itemize} +% \end{frame} + +% --- Virtual Inertia Law +\begin{frame}{Virtual Inertia Law in Grid-Forming Inverter} +\textbf{Physics is replaced by software:} +\begin{align} +M_{\text{virtual}} \dot{\omega} = P_{\text{ref}} - P +\end{align} + +\textbf{Parameters:} +\begin{itemize} + \item $M_{\text{virtual}}$: a tunable parameter by the controller, chosen to represent how fast the inverter responds to frequency changes + \item Recall $M = J\omega$. Since we have no physical inertia $J$, the virtual mass is just a modeling choice + \item $P_{\text{ref}}$: reference active power dispatch (from operator) + \item $P$: measured actual active power delivered + \item $\omega$: inverter's internal frequency reference value +\end{itemize} + +\textbf{Effect of $M_{\text{virtual}}$:} +\begin{itemize} + \item A larger $M_{\text{virtual}}$ means the inverter allows its frequency to drift slower, a "heavier" machine + \item A smaller $M_{\text{virtual}}$ means the inverter reacts more quickly, a "lighter" machine +\end{itemize} +\end{frame} + +% --- Virtual Inertia (continued) +\begin{frame}{Virtual Inertia (continued)} +\textbf{How it works:} +\begin{itemize} + \item The inverter adjusts its internal frequency reference according to power imbalance + \item That frequency reference drives its voltage output, which the grid "sees" + \item To the rest of the system, this looks just like a synchronous machine rotor slowing/speeding under imbalance +\end{itemize} + +\begin{itemize} + \item There's no heavy rotor. It emulates the inertia behavior of synchronous machines through software control. + \item But this is not sustained. It can only hold it until the renewable saturates, which is less than a second since they don't have as much buffer as traditional generators. + \item Other problems: semiconductor ratings, thermal limits, hard to tune $M_{\text{virtual}}$, cost, legacy devices, etc. +\end{itemize} + +\textbf{Why this is such a big deal:} renewables can now respond to a grid-wide drop in frequency because it can behave almost like a synchronous generator through control law +\end{frame} + +% --- Droop Control +\begin{frame}{Grid-following inverters - Droop Control} +Generators naturally slow down if overloaded, resulting in a drop in frequency (droop). Droop control allows each generator to increase its power output in response, but in proportion to its droop coefficient, so that all generators share the load change fairly. + +Grid-forming inverters are programmed with droop control: + +\begin{align} +P = P_{\text{set}} - \frac{1}{K_p} (\omega - \omega_0) +\end{align} +where $\omega_0$: nominal frequency, $P_{\text{set}}$: reference power output, $K_p$: droop constant (rad/s per MW or Hz per MW) telling inverter how much to adjust power output when frequency changes. Hence when frequency drops, power will rise. + +Overload leads to frequency drop, and power will rise according to the relationship. If frequency rises, power will decrease to maintain the frequency. +\end{frame} + +\begin{frame}{Reactive Power and Voltage Control (Q-V Droop)} +% \textbf{Reactive Power – Voltage (Q–V Droop)} + +Analogous for voltage support: +\begin{align} +V = V_0 - K_q (Q - Q_{\text{set}}) +\end{align} +or +\begin{align} +Q = Q_{\text{set}} - \frac{1}{K_q} (V - V_0) +\end{align} + +If reactive demand $\uparrow$ (voltage dips), generator/inverter increases reactive power injection. + +\textbf{Two important components of stability:} frequency and voltage. If there are deviations, adjust active and reactive power accordingly + +\begin{itemize} + \item $1/K_p$ = MW per Hz: "How much active power do I add if frequency drops by 0.1 Hz?" + \item $1/K_q$ = Mvar per V → "How much reactive power do I add if voltage drops by 0.01 pu?" + % \item $K_p$ and $1/K_p$ both are the frequency-power slope, just in different units. Larger slope means more correction +\end{itemize} +\end{frame} + +% ====================================================== +\begin{frame}{Dynamic Load Models} + \Large + Dynamic Load Models +\end{frame} + +\begin{frame}{Steady-State Load Models in ACOPF/DCOPF} + In optimal power flow (OPF), all quantities are \emph{time-invariant}. $\dot{x} = 0, t$ does not appear. + + At each load bus: + \[ + P_D = \text{fixed real power demand}, \qquad + Q_D = \text{fixed reactive demand}. + \] + + These loads can be either: + \begin{itemize} + \item Constant power: $P_D, Q_D$ are specified numerical values; or + \item Voltage-dependent (ZIP) as motors draw different amount current to maintain torque: + \[ + P(V) = P_0 (a_P V^2 + b_P V + c_P), \quad + Q(V) = Q_0 (a_Q V^2 + b_Q V + c_Q). + \] + \end{itemize} + + Power-flow balance: + \[ + P_G - P_D = \text{network losses}, \qquad + Q_G - Q_D = 0. + \] +\end{frame} + +\begin{frame}{Steady-State Load Models Continued} + Interpretation of the above model: + \begin{itemize} + \item Loads are fixed regardless of system conditions, or at most respond to nodal voltage. + \item No memory or dynamics -- they change only between static operating points. + \item The OPF represents a single equilibrium snapshot of the system. + \end{itemize} + + \textbf{Next:} Dynamic models generalize this by letting $P_D$ and $Q_D$ + \emph{evolve over time} with voltage and frequency. The grid's sink can be dynamic too even though we tend to think about it as a fixed parameter. +\end{frame} + +\begin{frame}{Dynamic Load Models - Induction Motor Model} + In dynamic models, the active and reactive power is represented as a function of the past and present voltage magnitude and frequency of the load bus. This type of model is commonly derived from the equivalent circuit of an induction motor. + + Most real-world loads (fans, pumps, compressors) are induction motors. + Their active/reactive power do not change instantaneously with voltage change but rather dynamically by changing the motor's rotor speed $\omega_r$ to maintain torque. Hence, the power consumption depends on both voltage and frequency. + \[ + P_d = f_P(V, \omega_r), \qquad Q_d = f_Q(V, \omega_r), + \] + so the load has internal dynamics, unlike static $P_D, Q_D$ in ACOPF. + +\end{frame} + +% ====================================================== +\begin{frame}{Rotor Dynamics} + + \textbf{Slip:} + \[ + s = \frac{\omega_s - \omega_r}{\omega_s}, + \] + where + \begin{itemize} + \item $\omega_s$: synchronous electrical speed ($2\pi f_s$), set by system frequency, + \item $\omega_r$: mechanical rotor speed (frequency at the load). + \end{itemize} + + \textbf{Operating regions:} + \begin{itemize} + \item $s = 0$: rotor synchronous with system frequency $\rightarrow$ no induced torque. + \item $0 < s < 1$: normal operation. Rotor is slightly slower than the rotating field $\rightarrow$ induces current $\rightarrow$ produces torque. + \item $s \to 1$: stall. Rotor stopped, max current, high losses. + \end{itemize} + + \textbf{Mechanical dynamics (sign flip if you differentiate w.r.t. slip):} +\[ +J\frac{d\omega_r}{dt} = T_e(V,\omega_r) - T_m +\quad\Longleftrightarrow\quad +J\,\omega_s\,\frac{ds}{dt} = T_m - T_e(V,s). +\] +\end{frame} + +\begin{frame}{Continued} + \textbf{Variable definitions:} +\begin{itemize} + \item $J$: rotor inertia (kg·m$^2$), + \item $\omega_r$: rotor mechanical speed/frequency (rad/s), + \item $T_e$: electromagnetic torque (depends on bus voltage $V$, frequency $\omega_s$ (slip formulation), or $\omega_r$ (standard formulation)), + \item $T_m$: mechanical load torque. +\end{itemize} + \end{frame} + + % ====================================================== +\begin{frame}{Example: Induction Motor Response During a Voltage Sag} + + \textbf{Sequence of events:} + + \begin{enumerate} + \item \textbf{Voltage drop:} $V$ suddenly decreases. + \item \textbf{Torque imbalance:} Electromagnetic torque $T_e(V,\omega_r)$ + falls below mechanical torque $T_m$. + \item \textbf{Rotor slowdown:} $\omega_r$ decreases $\Rightarrow$ slip $s$ increases. + \item \textbf{Increased current and VAR demand:} + The motor draws more current to restore torque, which further depresses voltage. + \item \textbf{Possible stalling:} If $V$ remains low, the motor stalls — + reactive power skyrockets $\Rightarrow$ voltage collapse. + \end{enumerate} + + IM Modeling is key to capture this nonlinear instability mechanism. + + % \textbf{Interpretation:} + % \begin{itemize} + % \item Positive feedback loop: $V\downarrow \Rightarrow T_e\downarrow \Rightarrow s\uparrow + % \Rightarrow Q\uparrow \Rightarrow V\downarrow$. + % \item Accurate IM modeling is essential to capture this nonlinear instability mechanism. + % \end{itemize} + \end{frame} + + % ====================================================== +\begin{frame}{How TSC-OPF Prevents Motor Stalling and Voltage Collapse} + \textbf{In TSC-OPF, dynamics and limits are enforced directly:} + \[ + \dot{x} = f(x, y, p), \qquad 0 = g(x, y, p), \qquad h(x(t), y(t)) \le 0, \;\forall t. + \] + \textbf{Dynamic states $x$:} + \begin{itemize} + \item Induction motor slip $s$, generator rotor angles, inverter controls, etc. + \item Their evolution $f(x,y,p)$ describes how voltages and speeds change after a disturbance. + \item Dynamic constraints ensure stall condition is not reached. + \end{itemize} + + \textbf{Constraint function $h(x(t),y(t))$:} + \begin{itemize} + \item Enforces time-domain limits such as + \[ + V_i(t) \ge V_{\min}, \quad \forall t \in [0, T_{\text{rec}}], + \] + where $T_{\text{rec}}$ is the recovery time. This ensures bus voltages remain within safe recovery bounds during the entire horizon after a disturbance. + \item Prevents continued voltage sag that would drive $T_e(V,s)$ down and cause stalling. + \end{itemize} + \end{frame} + +\begin{frame}{Wrap up} + Controls $p$ are chosen so that f remains stable under disturbances, and the chain of events above is prevented since motor and network dynamics are embedded in $f,g,h$. + + This model is typically used when there's a fast transient or stalling, and the time scale is in milliseconds to second. Useful for short-term voltage stability and transient studies. +\end{frame} + +% ====================================================== +\begin{frame}{Exponential Recovery Load (ERL): Motivation and Concept} + + \textbf{Goal:} Represent aggregate load behavior during voltage recovery after a disturbance. + + \textbf{Empirical Observation:} + \begin{itemize} + \item When voltage dips, total active and reactive loads drop immediately. + \item Loads such as motor controls and HVAC systems \textbf{slowly restore} their power draw as voltage recovers. + \item The recovery follows an \textbf{exponential time pattern}, not an instantaneous jump. + \end{itemize} + + \textbf{Idea:} + Introduce internal states that describe this gradual return: + \[ + P_d(t) = f_P(V(t),x_p(t)), \qquad Q_d(t) = f_Q(V(t),x_q(t)). + \] + where $x_p(t)$ and $x_q(t)$ are the internal states of the active and reactive load. + + These states evolve according to first-order differential equations, capturing the "memory" of how far the load has recovered. + \end{frame} + +% ====================================================== +\begin{frame}{Adaptive Exponential Recovery Load (ERL) Model} + + \textbf{Mathematical Form:} + \[ + \begin{aligned} + T_p \frac{dx_p}{dt} &= -x_p\!\left(\frac{V}{V_0}\right)^{N_{ps}} + + P_0\!\left(\frac{V}{V_0}\right)^{N_{pt}},\\[3pt] + P_d &= x_p\!\left(\frac{V}{V_0}\right)^{N_{pt}},\\[6pt] + T_q \frac{dx_q}{dt} &= -x_q\!\left(\frac{V}{V_0}\right)^{N_{qs}} + + Q_0\!\left(\frac{V}{V_0}\right)^{N_{qt}},\\[3pt] + Q_d &= x_q\!\left(\frac{V}{V_0}\right)^{N_{qt}}. + \end{aligned} + \] + + \textbf{Parameters:} + \begin{itemize} + \item $x_p, x_q$: internal recovery states (how much of the load has recovered). + \item $T_p, T_q$: time constants — larger values $\Rightarrow$ slower recovery. + \end{itemize} +\end{frame} +\begin{frame}{Continued} + \begin{itemize} + \item $P_0, Q_0$: nominal power withdrawals at reference voltage $V_0$. + \item $N_{pt}, N_{qt}$: transient exponents (immediate voltage sensitivity). How sharply load power reacts immediately when voltage changes (the short-term dip). + \item $N_{ps}, N_{qs}$: steady-state exponents (long-term voltage dependence). How much the load power changes in the long term after voltage settles to a new level. + \end{itemize} + + \textbf{Interpretation:} + \begin{itemize} + \item After a voltage dip, power first follows the transient curve, then recovers exponentially toward the steady-state curve. + \item When $V$ is weak, the recovery term + $(V/V_0)^{N_{ps}}$ slows the rate of change — recovery stalls under low voltage. + \item Recovery speed and power response both scale with voltage and almost halts under deep voltage sag. + \end{itemize} + \end{frame} + + + % ====================================================== +\begin{frame}{Standard vs. Adaptive ERL Models} + + \textbf{Standard ERL model:} + \[ + \begin{aligned} + T_p \frac{dx_p}{dt} &= -x_p + P_0\!\left[\!\left(\frac{V}{V_0}\right)^{N_{ps}} - \left(\frac{V}{V_0}\right)^{N_{pt}}\!\right],\\ + P_d &= x_p + P_0\!\left(\frac{V}{V_0}\right)^{N_{pt}}. + \end{aligned} + \] + + \textbf{Key difference:} + \begin{itemize} + \item In the \textbf{standard} model, $dx_p/dt$ depends on $V$ only through the voltage-dependent driving term. The state $x_p$ recovers constantly—independent of voltage. + \item In the \textbf{adaptive} model, recovery slows when $V$ is low:the term $(V/V_0)^{N_{ps}}$ reduces the rate of change. The two differ in how strongly the voltage affects recovery speed. + \end{itemize} + + \textbf{Physical interpretation:} + \begin{itemize} + \item Standard ERL: suitable for moderate voltage dips. + \item Adaptive ERL: more realistic for deep voltage sags. + \end{itemize} + + \end{frame} + + % ====================================================== +\begin{frame}{ERL Parameters} + \begin{itemize} + \item Parameters $(T_p, T_q, N_{ps}, N_{pt}, N_{qs}, N_{qt})$ + are fitted empirically from from measurements of load recovery after voltage disturbances. + \item They are not linked to physical machine constants, + but to observed aggregate behavior of customer loads. + \end{itemize} + + \textbf{Compared to IM Model:} + \begin{itemize} + \item Models \textbf{voltage-driven recovery} of active/reactive power demand, + not frequency-driven mechanical motion. + \item Represents the slower phase of system response + (seconds to minutes) vs. fast electromechanical transients. + \end{itemize} + + % \textbf{Dynamic enforcement:} + % \begin{itemize} + % \item The differential equations ensure $P_d(t), Q_d(t)$ follow + % realistic \textbf{transient trajectories}, not step changes. + % \item In simulation or optimization, the states $x_p,x_q$ + % evolve continuously according to these recovery laws. + % \end{itemize} + + \textbf{Steady-state check:} + Setting $\dot{x}_p=\dot{x}_q=0$ gives + $P_d=P_0(V/V_0)^{N_{ps}}$, $Q_d=Q_0(V/V_0)^{N_{qs}}$, + so ERL naturally reduces to a static voltage-dependent load, showing that when dynamics died out, the model reduces to a steady-state load. + \end{frame} + + % ====================================================== +\begin{frame}{ERL in TSC-OPF and Contrast with Induction Motor Model} + + \textbf{TSC-OPF representation:} + \[ + \dot{x} = f(x,y,p), \qquad 0 = g(x,y,p), \qquad h(x(t),y(t)) \le 0. + \] + + \begin{itemize} + \item ERL contributes its states $x_p,x_q$ to $x$, + with recovery dynamics embedded in $f(x,y,p)$. + \item $P_d(V,x_p), Q_d(V,x_q)$ enter the algebraic equations $g(x,y,p)$ + for power balance at each bus. + \item Voltage-recovery limits in $h(x(t),y(t))$ ensure $V_i(t)\!\ge\!V_{\min}$ + throughout the recovery window $[0,T_{\text{rec}}]$. + \end{itemize} + + \textbf{Contrast with IM model:} + \begin{itemize} + \item \textbf{Induction Motor (IM):} + physics-based; state $s=(\omega_s-\omega_r)/\omega_s$; + captures fast electromechanical and frequency-coupled transients (0.1–2 s). + \item \textbf{ERL:} + empirical; states $x_p,x_q$; captures slow, voltage-driven recovery (1–60 s). + \end{itemize} + \end{frame} + +% ====================================================== +\begin{frame}{Why We Go Beyond Steady-State OPF} + + \textbf{The bigger picture:} + \begin{itemize} + \item Power systems are not static networks — they are \textbf{dynamic systems.} + \item After every change — a fault, switching event, or sudden load or generation shift — voltages, currents, and frequencies evolve continuously before settling. + \item Understanding and controlling these dynamics is essential for keeping the grid stable, secure, and resilient. + \end{itemize} + \end{frame} + + % ====================================================== +\begin{frame}{Four Building Blocks of System Dynamics} + + \textbf{Four building blocks of system dynamics:} + \begin{itemize} + \item \textbf{Transients:} capture the immediate electromagnetic wave response + that propagates through the network. + \item \textbf{Generator swing equations:} describe how machines adjust speed and angle + to balance mechanical and electrical power. + \item \textbf{Inverters:} the new generation interface that emulates inertia and voltage support with renewables. + \item \textbf{Dynamic loads:} model how real demand recovers and interacts with voltage and frequency. + \end{itemize} +\end{frame} + + % ====================================================== +\begin{frame}{Why We Need Dynamic Optimization (TSC-OPF)} + \textbf{Why we need dynamic optimization (TSC-OPF):} + \begin{itemize} + \item Steady-state OPF finds an economical operating point \emph{only at equilibrium.} + \item Transient Stability-Constrained OPF ensures that, + even during those dynamic transitions, + voltages remain safe, machines stay synchronized, + and inverters and loads respond smoothly. + \end{itemize} + + % \textbf{In short:} + % \[ + % \text{Steady-state OPF ensures economy; TSC-OPF ensures security and survivability.} + % \] + \end{frame} + + +\end{document} diff --git a/class15/class15_lecture.pdf b/class15/class15_lecture.pdf new file mode 100644 index 0000000..d1ac9a2 Binary files /dev/null and b/class15/class15_lecture.pdf differ