Merge pull request 'FHN mit neuer UI kompatibel machen' (#4) from feat/fhn_expansion into main

Reviewed-on: #4
Reviewed-by: Nikola Sebastian Munder <2212719@stud.hs-mannheim.de>
main
Ruben Seitz 2025-06-14 22:11:48 +02:00
commit 8c07a4c969
9 changed files with 455 additions and 201 deletions

View File

@ -1,8 +1,8 @@
# This file is machine-generated - editing it directly is not advised
julia_version = "1.11.4"
julia_version = "1.11.5"
manifest_format = "2.0"
project_hash = "b5f5f0b50b1e0b7dd05bb93e0b1bb03fea235d53"
project_hash = "5fd84347cd356de5b819aa3ea793fa63c45180e4"
[[deps.ADTypes]]
git-tree-sha1 = "e2478490447631aedba0823d4d7a80b2cc8cdb32"
@ -194,9 +194,9 @@ version = "0.1.6"
[[deps.BoundaryValueDiffEq]]
deps = ["ADTypes", "BoundaryValueDiffEqAscher", "BoundaryValueDiffEqCore", "BoundaryValueDiffEqFIRK", "BoundaryValueDiffEqMIRK", "BoundaryValueDiffEqMIRKN", "BoundaryValueDiffEqShooting", "DiffEqBase", "FastClosures", "ForwardDiff", "LinearAlgebra", "Reexport", "SciMLBase"]
git-tree-sha1 = "6606f3f7d43b038a8c34ee4cdc31bbd93b447407"
git-tree-sha1 = "d6ec33e4516b2e790a64128afdb54f3b536667a7"
uuid = "764a87c0-6b3e-53db-9096-fe964310641d"
version = "5.17.0"
version = "5.18.0"
[deps.BoundaryValueDiffEq.extensions]
BoundaryValueDiffEqODEInterfaceExt = "ODEInterface"
@ -206,39 +206,39 @@ version = "5.17.0"
[[deps.BoundaryValueDiffEqAscher]]
deps = ["ADTypes", "AlmostBlockDiagonals", "BoundaryValueDiffEqCore", "ConcreteStructs", "DiffEqBase", "DifferentiationInterface", "FastClosures", "ForwardDiff", "LinearAlgebra", "PreallocationTools", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield"]
git-tree-sha1 = "add7560694794f30eec7803b9c4036efb96bf493"
git-tree-sha1 = "64a777e06d995f677c86c7ddbb85f393074a0877"
uuid = "7227322d-7511-4e07-9247-ad6ff830280e"
version = "1.6.0"
version = "1.7.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 = "1e97d81b6ea5e8e938c57a3c640a5cff1e181a2f"
git-tree-sha1 = "c83bf97da90dd379b1e3f4d9c6f3d0ae48eb0b29"
uuid = "56b672f2-a5fe-4263-ab2d-da677488eb3a"
version = "1.9.0"
version = "1.10.0"
[[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 = "525c65da4b46271b4b5fc2178ccde16c99c21a41"
git-tree-sha1 = "e58ee9acfc6dce6dcc368fc0483952bec5625513"
uuid = "85d9eb09-370e-4000-bb32-543851f73618"
version = "1.7.0"
version = "1.8.1"
[[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 = "f729bdedaedb537bf7883c9f71e7577e1c7a07f6"
git-tree-sha1 = "43debeee94167e2dc744f4a385213c4f0d16b4c3"
uuid = "1a22d4ce-7765-49ea-b6f2-13c8438986a6"
version = "1.7.0"
version = "1.8.1"
[[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 = "dfde7afe34137182a4bb8cd98f01d870772be999"
git-tree-sha1 = "1d92c9f7567b627514e143a3caf93af6d235c2db"
uuid = "9255f1d6-53bf-473e-b6bd-23f1ff009da4"
version = "1.6.0"
version = "1.7.1"
[[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 = "255c15c2d262ea8d3c5db1e0f130f829362c0fd4"
git-tree-sha1 = "1460c449c91c9bc4c8fb08fb5e878811ab38d667"
uuid = "ed55bfe0-3725-4db6-871e-a1dc9f42a757"
version = "1.7.0"
version = "1.8.1"
[[deps.BracketingNonlinearSolve]]
deps = ["CommonSolve", "ConcreteStructs", "NonlinearSolveBase", "PrecompileTools", "Reexport", "SciMLBase"]
@ -390,9 +390,9 @@ uuid = "2569d6c7-a4a2-43d3-a901-331e8e4be471"
version = "0.2.3"
[[deps.ConstructionBase]]
git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157"
git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb"
uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
version = "1.5.8"
version = "1.6.0"
weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"]
[deps.ConstructionBase.extensions]
@ -457,9 +457,9 @@ version = "5.53.1"
[[deps.DiffEqBase]]
deps = ["ArrayInterface", "ConcreteStructs", "DataStructures", "DocStringExtensions", "EnumX", "EnzymeCore", "FastBroadcast", "FastClosures", "FastPower", "FunctionWrappers", "FunctionWrappersWrappers", "LinearAlgebra", "Logging", "Markdown", "MuladdMacro", "Parameters", "PrecompileTools", "Printf", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "SciMLStructures", "Setfield", "Static", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface", "TruncatedStacktraces"]
git-tree-sha1 = "a0e5b5669df9465bc3dd32ea4a8ddeefbc0f7b5c"
git-tree-sha1 = "2d87d7bd165c1ca0d11923a9fabe90a9d71e88a6"
uuid = "2b5f629d-d688-5b77-993f-72d75c75574e"
version = "6.175.0"
version = "6.176.0"
[deps.DiffEqBase.extensions]
DiffEqBaseCUDAExt = "CUDA"
@ -533,9 +533,9 @@ version = "7.16.1"
[[deps.DifferentiationInterface]]
deps = ["ADTypes", "LinearAlgebra"]
git-tree-sha1 = "c8d85ecfcbaef899308706bebdd8b00107f3fb43"
git-tree-sha1 = "210933c93f39f832d92f9efbbe69a49c453db36d"
uuid = "a0c0ee7d-e4b9-4e03-894e-1c5f64a51d63"
version = "0.6.54"
version = "0.7.1"
[deps.DifferentiationInterface.extensions]
DifferentiationInterfaceChainRulesCoreExt = "ChainRulesCore"
@ -614,9 +614,9 @@ version = "0.25.120"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
[[deps.DocStringExtensions]]
git-tree-sha1 = "e7b7e6f178525d17c720ab9c081e4ef04429f860"
git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c"
uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
version = "0.9.4"
version = "0.9.5"
[[deps.Downloads]]
deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
@ -635,9 +635,9 @@ uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
version = "1.0.5"
[[deps.EnzymeCore]]
git-tree-sha1 = "1eb59f40a772d0fbd4cb75e00b3fa7f5f79c975a"
git-tree-sha1 = "7d7822a643c33bbff4eab9c87ca8459d7c688db0"
uuid = "f151be2c-9106-41f4-ab19-57ee4f262869"
version = "0.8.9"
version = "0.8.11"
weakdeps = ["Adapt"]
[deps.EnzymeCore.extensions]
@ -694,9 +694,9 @@ version = "6.1.2+0"
[[deps.FFTW]]
deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
git-tree-sha1 = "7de7c78d681078f027389e067864a8d53bd7c3c9"
git-tree-sha1 = "797762812ed063b9b94f6cc7742bc8883bb5e69e"
uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
version = "1.8.1"
version = "1.9.0"
[[deps.FFTW_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
@ -852,9 +852,9 @@ version = "2.13.4+0"
[[deps.FreeTypeAbstraction]]
deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"]
git-tree-sha1 = "eaca92bac73aa42f68c57d1b8df1b746eeb2bdaa"
git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11"
uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
version = "0.10.7"
version = "0.10.8"
[[deps.FriBidi_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
@ -898,9 +898,9 @@ version = "3.4.0+2"
[[deps.GLMakie]]
deps = ["ColorTypes", "Colors", "FileIO", "FixedPointNumbers", "FreeTypeAbstraction", "GLFW", "GeometryBasics", "LinearAlgebra", "Makie", "Markdown", "MeshIO", "ModernGL", "Observables", "PrecompileTools", "Printf", "ShaderAbstractions", "StaticArrays"]
git-tree-sha1 = "0650df73822ce8808dc473e3e1c7581bdb367083"
git-tree-sha1 = "aacae8d91f7da30979e189e8046c5bd655421687"
uuid = "e9467ef8-e4e7-5192-8a1a-b1aee30e663a"
version = "0.11.8"
version = "0.12.0"
[[deps.GPUArraysCore]]
deps = ["Adapt"]
@ -956,10 +956,10 @@ uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
version = "1.3.15+0"
[[deps.Graphs]]
deps = ["ArnoldiMethod", "Compat", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
git-tree-sha1 = "3169fd3440a02f35e549728b0890904cfd4ae58a"
deps = ["ArnoldiMethod", "DataStructures", "Distributed", "Inflate", "LinearAlgebra", "Random", "SharedArrays", "SimpleTraits", "SparseArrays", "Statistics"]
git-tree-sha1 = "c5abfa0ae0aaee162a3fbb053c13ecda39be545b"
uuid = "86223c79-3864-5bf0-83f7-82e725a168b6"
version = "1.12.1"
version = "1.13.0"
[[deps.GridLayoutBase]]
deps = ["GeometryBasics", "InteractiveUtils", "Observables"]
@ -1145,9 +1145,9 @@ version = "3.1.1+0"
[[deps.JumpProcesses]]
deps = ["ArrayInterface", "DataStructures", "DiffEqBase", "DiffEqCallbacks", "DocStringExtensions", "FunctionWrappers", "Graphs", "LinearAlgebra", "Markdown", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "SciMLBase", "Setfield", "StaticArrays", "SymbolicIndexingInterface", "UnPack"]
git-tree-sha1 = "216c196df09c8b80a40a2befcb95760eb979bcfd"
git-tree-sha1 = "fb7fd516de38db80f50fe15e57d44da2836365e7"
uuid = "ccbc3e58-028d-4f4c-8cd5-9ae44345cda5"
version = "9.15.0"
version = "9.16.0"
weakdeps = ["FastBroadcast"]
[[deps.KernelDensity]]
@ -1308,9 +1308,9 @@ weakdeps = ["LineSearches"]
[[deps.LineSearches]]
deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"]
git-tree-sha1 = "e4c3be53733db1051cc15ecf573b1042b3a712a1"
git-tree-sha1 = "4adee99b7262ad2a1a4bbbc59d993d24e55ea96f"
uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
version = "7.3.0"
version = "7.4.0"
[[deps.LinearAlgebra]]
deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
@ -1319,9 +1319,9 @@ version = "1.11.0"
[[deps.LinearSolve]]
deps = ["ArrayInterface", "ChainRulesCore", "ConcreteStructs", "DocStringExtensions", "EnumX", "GPUArraysCore", "InteractiveUtils", "Krylov", "LazyArrays", "Libdl", "LinearAlgebra", "MKL_jll", "Markdown", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "SciMLBase", "SciMLOperators", "Setfield", "StaticArraysCore", "UnPack"]
git-tree-sha1 = "c618a6a774d5712c6bf02dbcceb51b6dc6b9bb89"
git-tree-sha1 = "c0d1a91a50af6778863d320761f807f641f74935"
uuid = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
version = "3.16.0"
version = "3.17.0"
[deps.LinearSolve.extensions]
LinearSolveBandedMatricesExt = "BandedMatrices"
@ -1392,15 +1392,15 @@ version = "0.5.16"
[[deps.Makie]]
deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"]
git-tree-sha1 = "968f03dc65c8144a728f988051a88c78fe625e26"
git-tree-sha1 = "29c5cf33287afa8c06711fec1b33d074f88dd354"
uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
version = "0.22.7"
version = "0.23.0"
[[deps.MakieCore]]
deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"]
git-tree-sha1 = "733d910c70805e7114c82508bae99c6cdf004466"
git-tree-sha1 = "6ec4aba99ce1a8c247822ce346b273d0d686e141"
uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b"
version = "0.9.3"
version = "0.10.0"
[[deps.ManualMemory]]
git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd"
@ -1493,9 +1493,9 @@ version = "0.2.4"
[[deps.NLSolversBase]]
deps = ["ADTypes", "DifferentiationInterface", "Distributed", "FiniteDiff", "ForwardDiff"]
git-tree-sha1 = "b14c7be6046e7d48e9063a0053f95ee0fc954176"
git-tree-sha1 = "25a6638571a902ecfb1ae2a18fc1575f86b1d4df"
uuid = "d41bc354-129a-5804-8e4c-c37616107c6c"
version = "7.9.1"
version = "7.10.0"
[[deps.NLsolve]]
deps = ["Distances", "LineSearches", "LinearAlgebra", "NLSolversBase", "Printf", "Reexport"]
@ -1639,7 +1639,7 @@ version = "3.2.4+0"
[[deps.OpenLibm_jll]]
deps = ["Artifacts", "Libdl"]
uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
version = "0.8.1+4"
version = "0.8.5+0"
[[deps.OpenSSL_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
@ -1655,9 +1655,9 @@ version = "0.5.6+0"
[[deps.Optim]]
deps = ["Compat", "EnumX", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"]
git-tree-sha1 = "31b3b1b8e83ef9f1d50d74f1dd5f19a37a304a1f"
git-tree-sha1 = "61942645c38dd2b5b78e2082c9b51ab315315d10"
uuid = "429524aa-4258-5aef-a3af-852621145aeb"
version = "1.12.0"
version = "1.13.2"
[deps.Optim.extensions]
OptimMOIExt = "MathOptInterface"
@ -1690,15 +1690,15 @@ version = "1.2.0"
[[deps.OrdinaryDiffEqBDF]]
deps = ["ADTypes", "ArrayInterface", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "OrdinaryDiffEqSDIRK", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "StaticArrays", "TruncatedStacktraces"]
git-tree-sha1 = "42755bd13fe56e9d9ce1bc005f8b206a6b56b731"
git-tree-sha1 = "9124a686af119063bb4d3a8f87044a8f312fcad9"
uuid = "6ad6398a-0878-4a85-9266-38940aa047c8"
version = "1.5.1"
version = "1.6.0"
[[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 = "d29adfeb720dd7c251b216d91c4bd4fe67c087df"
git-tree-sha1 = "08dac9c6672a4548439048089bac293759a897fd"
uuid = "bbf590c4-e513-4bbe-9b18-05decba2e5d8"
version = "1.26.0"
version = "1.26.1"
weakdeps = ["EnzymeCore"]
[deps.OrdinaryDiffEqCore.extensions]
@ -1712,9 +1712,9 @@ version = "1.4.0"
[[deps.OrdinaryDiffEqDifferentiation]]
deps = ["ADTypes", "ArrayInterface", "ConcreteStructs", "ConstructionBase", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "FunctionWrappersWrappers", "LinearAlgebra", "LinearSolve", "OrdinaryDiffEqCore", "SciMLBase", "SciMLOperators", "SparseArrays", "SparseMatrixColorings", "StaticArrayInterface", "StaticArrays"]
git-tree-sha1 = "c78060115fa4ea9d70ac47fa49496acbc630aefa"
git-tree-sha1 = "efecf0c4cc44e16251b0e718f08b0876b2a82b80"
uuid = "4302a76b-040a-498a-8c04-15b101fed76b"
version = "1.9.1"
version = "1.10.0"
[[deps.OrdinaryDiffEqExplicitRK]]
deps = ["DiffEqBase", "FastBroadcast", "LinearAlgebra", "MuladdMacro", "OrdinaryDiffEqCore", "RecursiveArrayTools", "Reexport", "TruncatedStacktraces"]
@ -1820,9 +1820,9 @@ version = "1.1.0"
[[deps.OrdinaryDiffEqRosenbrock]]
deps = ["ADTypes", "DiffEqBase", "DifferentiationInterface", "FastBroadcast", "FiniteDiff", "ForwardDiff", "LinearAlgebra", "LinearSolve", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "Polyester", "PrecompileTools", "Preferences", "RecursiveArrayTools", "Reexport", "Static"]
git-tree-sha1 = "063e5ff1447b3869856ed264b6dcbb21e6e8bdb0"
git-tree-sha1 = "1ce0096d920e95773220e818f29bf4b37ea2bb78"
uuid = "43230ef6-c299-4910-a778-202eb28ce4ce"
version = "1.10.1"
version = "1.11.0"
[[deps.OrdinaryDiffEqSDIRK]]
deps = ["ADTypes", "DiffEqBase", "FastBroadcast", "LinearAlgebra", "MacroTools", "MuladdMacro", "OrdinaryDiffEqCore", "OrdinaryDiffEqDifferentiation", "OrdinaryDiffEqNonlinearSolve", "RecursiveArrayTools", "Reexport", "SciMLBase", "TruncatedStacktraces"]
@ -2169,9 +2169,9 @@ version = "0.1.0"
[[deps.SciMLBase]]
deps = ["ADTypes", "Accessors", "Adapt", "ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "EnumX", "FunctionWrappersWrappers", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "Markdown", "Moshi", "PrecompileTools", "Preferences", "Printf", "RecipesBase", "RecursiveArrayTools", "Reexport", "RuntimeGeneratedFunctions", "SciMLOperators", "SciMLStructures", "StaticArraysCore", "Statistics", "SymbolicIndexingInterface"]
git-tree-sha1 = "ce947672206f6a3a2bee1017c690cfd5fd82d897"
git-tree-sha1 = "04bbcdc8d1f7d6f667f75fbcc68728231e21fabe"
uuid = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
version = "2.96.0"
version = "2.101.0"
[deps.SciMLBase.extensions]
SciMLBaseChainRulesCoreExt = "ChainRulesCore"
@ -2202,9 +2202,9 @@ version = "0.1.6"
[[deps.SciMLOperators]]
deps = ["Accessors", "ArrayInterface", "DocStringExtensions", "LinearAlgebra", "MacroTools"]
git-tree-sha1 = "85608e4aaf758547ffc4030c908318b432114ec9"
git-tree-sha1 = "3249fe77f322fe539e935ecb388c8290cd38a3fc"
uuid = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"
version = "1.3.0"
version = "1.3.1"
weakdeps = ["SparseArrays", "StaticArraysCore"]
[deps.SciMLOperators.extensions]
@ -2308,9 +2308,9 @@ version = "1.11.0"
[[deps.SparseConnectivityTracer]]
deps = ["ADTypes", "DocStringExtensions", "FillArrays", "LinearAlgebra", "Random", "SparseArrays"]
git-tree-sha1 = "fadb2d7010dd92912e5eb31a493613ad4b8c9583"
git-tree-sha1 = "affde0bfd920cfcaa0944d3c0eb3a573fa9c4d1e"
uuid = "9f842d2f-2579-4b1d-911e-f412cf18a3f5"
version = "0.6.18"
version = "0.6.20"
[deps.SparseConnectivityTracer.extensions]
SparseConnectivityTracerDataInterpolationsExt = "DataInterpolations"
@ -2517,9 +2517,9 @@ version = "1.0.1"
[[deps.Tables]]
deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"]
git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297"
git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344"
uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c"
version = "1.12.0"
version = "1.12.1"
[[deps.Tar]]
deps = ["ArgTools", "SHA"]
@ -2539,15 +2539,15 @@ version = "1.11.0"
[[deps.ThreadingUtilities]]
deps = ["ManualMemory"]
git-tree-sha1 = "2d529b6b22791f3e22e7ec5c60b9016e78f5f6bf"
git-tree-sha1 = "d969183d3d244b6c33796b5ed01ab97328f2db85"
uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5"
version = "0.5.4"
version = "0.5.5"
[[deps.TiffImages]]
deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"]
git-tree-sha1 = "f21231b166166bebc73b99cea236071eb047525b"
deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"]
git-tree-sha1 = "02aca429c9885d1109e58f400c333521c13d48a0"
uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
version = "0.11.3"
version = "0.11.4"
[[deps.TimerOutputs]]
deps = ["ExprTools", "Printf"]
@ -2599,14 +2599,16 @@ version = "0.4.1"
[[deps.Unitful]]
deps = ["Dates", "LinearAlgebra", "Random"]
git-tree-sha1 = "d62610ec45e4efeabf7032d67de2ffdea8344bed"
git-tree-sha1 = "d2282232f8a4d71f79e85dc4dd45e5b12a6297fb"
uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
version = "1.22.1"
weakdeps = ["ConstructionBase", "InverseFunctions"]
version = "1.23.1"
weakdeps = ["ConstructionBase", "ForwardDiff", "InverseFunctions", "Printf"]
[deps.Unitful.extensions]
ConstructionBaseUnitfulExt = "ConstructionBase"
ForwardDiffExt = "ForwardDiff"
InverseFunctionsUnitfulExt = "InverseFunctions"
PrintfExt = "Printf"
[[deps.Wayland_jll]]
deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "XML2_jll"]
@ -2615,10 +2617,10 @@ uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89"
version = "1.23.1+0"
[[deps.Wayland_protocols_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
git-tree-sha1 = "5db3e9d307d32baba7067b13fc7b5aa6edd4a19a"
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "54b8a029ac145ebe8299463447fd1590b2b1d92f"
uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91"
version = "1.36.0+0"
version = "1.44.0+0"
[[deps.WebP]]
deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"]

View File

@ -1,28 +1,58 @@
include("../src/utils/constants.jl")
#include("../src/fhn_solver.jl")
include("../src/gray_scott_solver.jl")
include("../src/visualization.jl")
include("../src/utils/constants.jl")
using Observables
using GLMakie
using .GrayScottSolver
using .Visualization
using .Constants
const N = 128
const dx = 1.0
using .Constants
using .Visualization
# GSParams
N = 128
dx = 1.0
Du, Dv = Observable(0.16), Observable(0.08)
F, k = Observable(0.060), Observable(0.062)
params_obs = Observable(GSParams(N, dx, Du[], Dv[], F[], k[]))
param_observables = (
Du=Du,
Dv=Dv,
F=F,
k=k,
)
"""
# FHNParams
N = 128
dx = 1.0
Du, Dv = Observable(0.016), Observable(0.1)
ϵ, a, b = Observable(0.1), Observable(0.5), Observable(0.9)
param_observables = (
Du=Du,
Dv=Dv,
ϵ=ϵ,
a=a,
b=b
)
"""
params_obs = Observable(Constants.GSParams(N, dx, Du[], Dv[], F[], k[]))
#params_obs = Observable(FHNParams(N=N, dx=dx, Du=Du[], Dv=Dv[], ϵ=ϵ[], a=a[], b=b[]))
lift(Du, Dv, F, k) do u, v, f, ki
params_obs[] = GSParams(N, dx, u, v, f, ki)
params_obs[] = GSParams(N, dx, u, v, f, ki)
end
"""
lift(Du, Dv, ϵ, a, b) do d_u, d_v, eps, aa, bb
params_obs[] = FHNParams(N=N, dx=dx, Du=d_u, Dv=d_v, ϵ=eps, a=aa, b=bb)
end
"""
U = ones(N, N)
V = zeros(N, N)
heat_obs = Observable(U)
fig = build_ui(U, V, Du, Dv, F, k, params_obs, heat_obs)
fig = build_ui(U, V, param_observables, params_obs, heat_obs)
display(fig)

View File

@ -1,21 +0,0 @@
using GLMakie
include("../src/AnimalFurFHN.jl")
using .AnimalFurFHN
# === Parameters ===
N = 100
tspan = (0.0, 100.0)
frame_index = 1 # final time step
# === Run simulation ===
sol = run_simulation(N, tspan)
# === Extract activator u ===
u = sol.u[frame_index][1:N^2]
u_mat = reshape(u, N, N)
# === Plot ===
fig = Figure()
ax = Axis(fig[1, 1])
heatmap!(ax, u_mat, colormap=:viridis)
fig

75
src/fhn_solver.jl 100644
View File

@ -0,0 +1,75 @@
include("utils/laplacian.jl")
using DifferentialEquations
using Random
using Observables
using ..Constants
using .Laplacian
"""
fhn(du, u, p:FHNParams, t:)
Implements the spatial dynamics of FitzHugh-Nagumo (fhn). Designed to be
within a larger numerical solver of partial differential equations.
# Arguments
- `du`: output argument which stores the calculated derivatives
- `u`: input vector containing the current state of the system at time t
- `p`: holds all the fixed parameters of the FHN model
- `t`: current time
# Returns
- `du`: calculated derivatives put back into the du array
"""
function fhn!(du, u, p::FHNParams, t)
N = p.N
u_mat = reshape(u[1:N^2], N, N)
v_mat = reshape(u[N^2+1:end], N, N)
Δu = laplacian(u_mat, p.dx)
Δv = laplacian(v_mat, p.dx)
u_in = u_mat[2:end-1, 2:end-1]
v_in = v_mat[2:end-1, 2:end-1]
fu = p.Du * Δu .+ u_in .- u_in .^ 3 ./ 3 .- v_in
fv = p.Dv * Δv .+ p.ϵ * (u_in .+ p.a .- p.b .* v_in)
# Construct output with zero boundary (padding)
fu_full = zeros(N, N)
fv_full = zeros(N, N)
fu_full[2:end-1, 2:end-1] .= fu
fv_full[2:end-1, 2:end-1] .= fv
du .= vcat(vec(fu_full), vec(fv_full))
end
function step!(U, V, params_obs::Observable; dx=1)
p = params_obs[]
# Flatten initial condition (activation u, recovery v)
u0 = vec(U)
v0 = vec(V)
u_init = vcat(u0, v0)
# Define one integration step using your fhn! function
prob = ODEProblem((du, u, p, t) -> fhn!(du, u, p, t), u_init, (0.0, 0.1), p)
sol = solve(prob, Tsit5(); dt=0.1, save_start=false, saveat=10.0)
# Extract solution and reshape
u_new = reshape(sol[end][1:p.N^2], p.N, p.N)
v_new = reshape(sol[end][p.N^2+1:end], p.N, p.N)
# Update matrices in-place
U .= u_new
V .= v_new
return U
end
function multi_step!(state, n_steps, heat_obs::Observable, params_obs::Observable; dx=1)
for _ in 1:n_steps
heat_obs[] = step!(state[1], state[2], params_obs; dx=1)
end
end

View File

@ -1,30 +1,35 @@
module GrayScottSolver
using Observables
include("utils/constants.jl")
include("utils/laplacian.jl")
using Observables
using .Constants
using .Laplacian
export step!, multi_step!
function step!(U, V, params_obs::Observable; dx=1)
lap_u = laplacian5(U, dx)
lap_v = laplacian5(V, dx)
diff_u = params_obs[].Du
diff_v = params_obs[].Dv
feed_u = params_obs[].F
kill_v = params_obs[].k
# Extract parameters
p = params_obs[]
Du, Dv = p.Du, p.Dv
F, k = p.F, p.k
# Compute Laplacians on the interior
lap_u = laplacian(U, dx) # shape (N-2, N-2)
lap_v = laplacian(V, dx)
# Extract interior values
u = U[2:end-1, 2:end-1]
v = V[2:end-1, 2:end-1]
# Gray-Scott update equations (Euler-style)
uvv = u .* v .* v
u_new = u .+ (diff_u .* lap_u .- uvv .+ feed_u .* (1 .- u))
v_new = v .+ (diff_v .* lap_v .+ uvv .- (feed_u .+ kill_v) .* v)
u_new = u .+ (Du .* lap_u .- uvv .+ F .* (1 .- u))
v_new = v .+ (Dv .* lap_v .+ uvv .- (F .+ k) .* v)
# Update with new values
# Update interior
U[2:end-1, 2:end-1] .= u_new
V[2:end-1, 2:end-1] .= v_new
# Periodic boundary conditions
# Apply periodic boundary conditions
U[1, :] .= U[end-1, :]
U[end, :] .= U[2, :]
U[:, 1] .= U[:, end-1]
@ -35,12 +40,10 @@ function step!(U, V, params_obs::Observable; dx=1)
V[:, 1] .= V[:, end-1]
V[:, end] .= V[:, 2]
# Update heatmap observable
return U
return U # for visualization
end
function multi_step!(state, n_steps, heat_obs::Observable, params_obs::Observable; dx=1)
for _ in 1:n_steps
heat_obs[] = step!(state[1], state[2], params_obs; dx=1)
end
end
end

View File

@ -1,6 +1,8 @@
module Constants
struct FHNParams
abstract type PDEParams end
struct FHNParams <: PDEParams
N::Int
dx::Float64 # grid spacing
Du::Float64
@ -15,7 +17,7 @@ struct FHNParams
new(N, dx, Du, Dv, ϵ, a, b)
end
struct GSParams
struct GSParams <: PDEParams
N::Int # grid size
dx::Float64 # grid spacing
Du::Float64 # diffusion rate U
@ -25,6 +27,6 @@ struct GSParams
end
export FHNParams, GSParams
export PDEParams, FHNParams, GSParams
end # module Constants

View File

@ -1,36 +1,16 @@
module Laplacian
"""
laplacian(U::Matrix{Float64}, N::Int, h::Float64)
Computes the discrete 2D Laplacian of a matrix `U` using a 5-point stencil
and circular boundary conditions.
# Arguments
- `U::Matrix{Float64}`: The input 2D matrix representing the field or image.
- `N::Int`: Integer
- `h::Float64`: The spatial step size or grid spacing between points in the discretization.
# Returns
- `Vector{Float64}`: A flattened (vectorized) representation of the approximated Laplacian values for each element in `U`. The boundary conditions are handled circularly.
"""
function laplacian(U::Matrix{Float64}, N::Int, h::Float64)
# shifts matrices and sums them up
padded = circshift(U, (-1, 0)) .+ circshift(U, (1, 0)) .+
circshift(U, (0, -1)) .+ circshift(U, (0, 1)) .- 4 .* U
return vec(padded) ./ h^2
end
function laplacian5(f, dx)
function laplacian(U::AbstractMatrix{<:Real}, dx::Real)
h2 = dx^2
left = f[2:end-1, 1:end-2]
right = f[2:end-1, 3:end]
down = f[3:end, 2:end-1]
up = f[1:end-2, 2:end-1]
center = f[2:end-1, 2:end-1]
return (left .+ right .+ down .+ up .- 4 .* center) ./ h2
center = U[2:end-1, 2:end-1]
up = U[1:end-2, 2:end-1]
down = U[3:end, 2:end-1]
left = U[2:end-1, 1:end-2]
right = U[2:end-1, 3:end]
return (up .+ down .+ left .+ right .- 4 .* center) ./ h2
end
export laplacian, laplacian5
end # module Laplacian
end # module Laplacian

View File

@ -0,0 +1,198 @@
# initial conditions for different patterns
function zebra_conditions(N)
# Turing-spot parameters
params = FHNParams(N=N, dx=1.0, Du=0.016, Dv=0.1, ϵ=0.1, a=0.5, b=0.9)
# Or use this
u0, v0 = two_rows_edge_distance_ic(N)
return params, vcat(u0, v0)
end
function cheetah_conditions(N)
# Turing-spot parameters
#params = FHNParams(N=N, dx=1.0, Du=5e-6, Dv=2e-3, ϵ=0.025, a=0.6, b=0.15)
params = FHNParams(N=N, dx=1.0, Du=0.182, Dv=0.5, ϵ=0.05, a=0.2, b=2.0)
u0 = 0.05 .* (2 .* rand(N, N) .- 1) # noise in [-0.05, 0.05]
v0 = 0.05 .* (2 .* rand(N, N) .- 1)
return params, vcat(vec(u0), vec(v0))
end
function coral_conditions(N)
# Turing-spot parameters
params = FHNParams(N=N, dx=1.0, Du=0.001, Dv=0.06, ϵ=0.05, a=0.0, b=1.2)
u0, v0 = coral_ic(N)
return params, vcat(u0, v0)
end
# helper functions for filling cells in specific places of the matrix
function blocks_ic(N)
u = fill(1.0, N, N)
v = fill(0.0, N, N)
p = div(N, 2)
function safe_block!(u, row_center, col_center)
row_start = max(row_center - 8, 1)
row_end = min(row_center + 7, N)
col_start = max(col_center - 8, 1)
col_end = min(col_center + 7, N)
u[row_start:row_end, col_start:col_end] .= -0.01
end
safe_block!(u, p, p)
return vec(u), vec(v)
end
function column_ic(N)
u = fill(0.01, N, N)
v = fill(0.99, N, N)
col_center = div(N, 2)
col_width = 8 # You can adjust this
col_start = max(col_center - div(col_width, 2), 1)
col_end = min(col_center + div(col_width, 2) - 1, N)
u[col_start:col_end, :] .= -0.01
return vec(u), vec(v)
end
function two_rows_edge_distance_ic(N)
row_width = 8
distance_from_edge = 50
u = fill(0.01, N, N)
v = fill(0.99, N, N)
# --- Input Validation ---
if row_width <= 0 || distance_from_edge < 0
error("row_width must be positive and distance_from_edge must be non-negative.")
end
# Calculate column 1 (from the left edge)
col1_start = distance_from_edge + 1
col1_end = col1_start + row_width - 1
# Calculate column 2 (from the right edge)
col2_end = N - distance_from_edge
col2_start = col2_end - row_width + 1
# --- Further Validation for placement ---
if col1_end > N || col2_start < 1
error("Columns go out of bounds. Adjust N, row_width, or distance_from_edge.")
end
if col1_end >= col2_start # Check for overlap or touching
error("Columns overlap or touch. Adjust N, row_width, or distance_from_edge such that 2 * (distance_from_edge + row_width) <= N.")
end
# Apply the first column
u[:, col1_start:col1_end] .= -0.01
# Apply the second column
u[:, col2_start:col2_end] .= -0.01
return vec(u), vec(v)
end
function center_band_ic(N)
u = fill(0.0, N, N)
v = fill(0.0, N, N)
band_width = div(N, 8)
row_start = div(N, 2) - div(band_width, 2)
row_end = div(N, 2) + div(band_width, 2)
u[row_start:row_end, :] .= 0.1 .+ 0.01 .* randn(band_width + 1, N)
v[row_start:row_end, :] .= 0.1 .+ 0.01 .* randn(band_width + 1, N)
return vec(u), vec(v)
end
function circle_ic(N)
u = fill(0.01, N, N)
v = fill(0.99, N, N)
cx, cy = div(N, 2), div(N, 2) # center of matrix
radius = 0.125 * N # circle radius = 3/4 of N divided by 2
for i in 1:N, j in 1:N
if (i - cx)^2 + (j - cy)^2 radius^2
u[i, j] = -0.01
end
end
return vec(u), vec(v)
end
function three_circles_random_ic(N)
u = fill(0.01, N, N)
v = fill(0.99, N, N)
radius = 0.125 * N
# Define the bounds for random centers to ensure the circle stays within the matrix
min_coord = ceil(Int, radius) + 1
max_coord = floor(Int, N - radius)
if min_coord > max_coord
error("Matrix size N is too small to place circles of this radius without overlap or going out of bounds.")
end
for _ in 1:5 # Place 3 circles
# Generate random center coordinates
cx = rand(min_coord:max_coord)
cy = rand(min_coord:max_coord)
# Apply the circle to the matrix
for i in 1:N, j in 1:N
if (i - cx)^2 + (j - cy)^2 radius^2
u[i, j] = -0.01
end
end
end
return vec(u), vec(v)
end
function squiggle_ic(N, Lx=400.0, Ly=400.0)
uplus = 0.01
vplus = 0.99
uminus = -uplus
# Create coordinate grids
x = LinRange(0, Lx, N)
y = LinRange(0, Ly, N)
X = repeat(x', N, 1) # Transposed to align with meshgrid X
Y = repeat(y, 1, N) # Broadcasted to align with meshgrid Y
# Squiggle pattern
cos_term = 0.05 * Lx .* sin.(10 * 2π .* Y ./ Ly .+ π * 0.3)
exp_term = exp.(-((Y .- Ly / 2) ./ (0.1 * Ly)) .^ 2)
width = 0.05 * Lx
Z = exp.(-((X .- Lx / 2 .+ cos_term .* exp_term) ./ width) .^ 2)
u = fill(uplus, N, N)
v = fill(vplus, N, N)
# Apply squiggle
u[Z .> 0.8] .= uminus
return vec(u), vec(v)
end
function coral_ic(N)
u = fill(0.534522, N, N)
v = fill(0.381802, N, N)
for _ in 1:40 # place 15 noisy seeds
i, j = rand(10:N-10), rand(10:N-10)
u[i-2:i+2, j-2:j+2] .= -0.534522 .+ 0.2 * rand(5, 5)
end
return vec(u), vec(v)
end

View File

@ -1,43 +1,8 @@
module Visualization
include("gray_scott_solver.jl")
#include("fhn_solver.jl")
using GLMakie, Observables, Makie
using .GrayScottSolver
"""
step_through_solution(sol::SolutionType, N::Int)
Function for visualization for the output of run_simulation
# Arguments
- `sol`: computed differential equation by run_simulation
- `N`: size of the N×N grid
# Returns
- ``: Displays created figure
"""
function step_through_solution(sol, N::Int)
fig = Figure(resolution=(600, 600))
ax = Axis(fig[1, 1])
slider = Slider(fig[2, 1], range=1:length(sol), startvalue=1)
textbox = Textbox(fig[1, 2], placeholder="Feed Rate", validator=Float64)
F = Observable(0.060)
# Initialize heatmap with first time step
u0 = reshape(sol[1][1:N^2], N, N)
heat_obs = Observable(u0)
hmap = heatmap!(ax, heat_obs, colormap=:magma)
on(textbox.stored_string) do s
F[] = parse(Float64, s)
end
# Update heatmap on slider movement
on(slider.value) do i
u = reshape(sol[i][1:N^2], N, N)
heat_obs[] = u
end
display(fig)
end
function coord_to_index(x, y, N)
ix = clamp(round(Int, x), 1, N)
@ -45,6 +10,20 @@ function coord_to_index(x, y, N)
return ix, iy
end
"""
reset(U, V, heat_obs)
Resets heatmap to original state by replacing each cell.
Currently only places a square in the center
# Arguments
- `U`: Matrix filled with ones
- `V`: Empty matrix filled with zeros
- `heat_obs`: Heatmap observable
# Returns
- ``: resetted heatmap observable
"""
function reset!(U, V, heat_obs)
U .= 1.0
V .= 0.0
@ -68,7 +47,7 @@ function param_box!(grid, row, labeltxt, observable::Observable)
end
end
function build_ui(U, V, Du, Dv, F, k, params_obs, heat_obs)
function build_ui(U, V, param_obs_map::NamedTuple, params_obs, heat_obs)
reset!(U, V, heat_obs)
fig = Figure(size=(800, 800))
gh = GridLayout(fig[1, 1])
@ -81,7 +60,7 @@ function build_ui(U, V, Du, Dv, F, k, params_obs, heat_obs)
stepsize = Observable(30)
spoint = select_point(ax.scene)
# # Controls
# Controls
fig[2, 1] = buttongrid = GridLayout(ax.scene, tellwidth=false)
btn_step = Button(buttongrid[1, 1], width=50, label="Step")
btn_start = Button(buttongrid[1, 2], width=50, label=run_label)
@ -95,10 +74,17 @@ function build_ui(U, V, Du, Dv, F, k, params_obs, heat_obs)
rowsize!(gh, 1, Relative(1.0))
param_box!(textboxgrid, 1, "Du", Du)
param_box!(textboxgrid, 2, "Dv", Dv)
param_box!(textboxgrid, 3, "Feed", F)
param_box!(textboxgrid, 4, "kill", k)
param_box!(textboxgrid, 1, "Du", param_obs_map.Du)
param_box!(textboxgrid, 2, "Dv", param_obs_map.Dv)
if haskey(param_obs_map, :F)
param_box!(textboxgrid, 3, "Feed", param_obs_map.F)
param_box!(textboxgrid, 4, "kill", param_obs_map.k)
elseif haskey(param_obs_map, )
param_box!(textboxgrid, 3, "ϵ", param_obs_map.ϵ)
param_box!(textboxgrid, 4, "a", param_obs_map.a)
param_box!(textboxgrid, 5, "b", param_obs_map.b)
end
# Timer and state for animation
running = Observable(false)
@ -159,6 +145,5 @@ function build_ui(U, V, Du, Dv, F, k, params_obs, heat_obs)
return fig
end
export step_through_solution, build_ui
export build_ui
end