diff --git a/scripts/main.jl b/scripts/main.jl index 7bf1f84..394dc86 100644 --- a/scripts/main.jl +++ b/scripts/main.jl @@ -9,53 +9,26 @@ using GLMakie using .Constants using .Visualization - -# Rebuild when model or sliders change -function setup_param_binding!(model_type, gray_params, fhn_params, params_obs) - if model_type[] == :gray_scott - return gray_params - else - return fhn_params - end -end - -model_type = Observable(:gray_scott) # or :fhn - -# GSParams +# GSParams AND FHNParams N = 128 dx = 1.0 -gray_params = ( - Du = Observable(0.16), - Dv = Observable(0.08), - F = Observable(0.060), - k = Observable(0.062) +params = ( + N=Observable(128), + dx=Observable(1.0), + Du=Observable(0.16), + Dv=Observable(0.08), + F=Observable(0.060), + k=Observable(0.062), + ϵ=Observable(0.05), + a=Observable(0.7), + b=Observable(0.8) ) -# FHNParams -N = 128 -dx = 1.0 -fhn_params = ( - Du = Observable(0.16), - Dv = Observable(0.08), - ϵ = Observable(0.05), - a = Observable(0.7), - b = Observable(0.8) -) - -params_obs = Observable(Constants.GSParams(N, dx, gray_params.Du[], gray_params.Dv[], gray_params.F[], gray_params.k[])) -#params_obs = Observable(Constants.FHNParams(N=N, dx=dx, Du=Du[], Dv=Dv[], ϵ=ϵ[], a=a[], b=b[])) - -param_observables = setup_param_binding!(model_type, gray_params, fhn_params, params_obs) - -""" -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 -""" +params_obs = Observable{Constants.CombinedPDEParams}(CombinedPDEParams(N, dx, params.Du[], params.Dv[], params.F[], params.k[], params.ϵ[], params.a[], params.b[])) U = ones(N, N) V = zeros(N, N) heat_obs = Observable(U) -fig = build_ui(U, V, param_observables, params_obs, heat_obs) +fig = build_ui(U, V, params, params_obs, heat_obs) display(fig) diff --git a/src/utils/constants.jl b/src/utils/constants.jl index 1908d86..d3e37a0 100644 --- a/src/utils/constants.jl +++ b/src/utils/constants.jl @@ -22,6 +22,18 @@ struct GSParams <: PDEParams end -export PDEParams, FHNParams, GSParams +struct CombinedPDEParams <: PDEParams + N::Int + dx::Float64 + Du::Float64 + Dv::Float64 + F::Float64 + k::Float64 + ϵ::Float64 + a::Float64 + b::Float64 +end + +export PDEParams, FHNParams, GSParams, CombinedPDEParams end # module Constants diff --git a/src/visualization.jl b/src/visualization.jl index a7c8f6e..ecfe9e0 100644 --- a/src/visualization.jl +++ b/src/visualization.jl @@ -56,32 +56,35 @@ function param_box!(grid, row, labeltxt, observable::Observable) end end -function rebuild_param_boxes!(grid, model_type, gray_params, fhn_params) +function rebuild_param_boxes!(grid, model_type::Symbol, param_obs_map::NamedTuple) empty!(grid) - if model_type[] == :gray_scott - param_box!(grid, 1, "Du", gray_params.Du) - param_box!(grid, 2, "Dv", gray_params.Dv) - param_box!(grid, 3, "Feed", gray_params.F) - param_box!(grid, 4, "Kill", gray_params.k) + param_box!(grid, 1, "Du", param_obs_map.Du) + param_box!(grid, 2, "Dv", param_obs_map.Dv) + + if model_type == :gray_scott + param_box!(grid, 3, "Feed", param_obs_map.F) + param_box!(grid, 4, "Kill", param_obs_map.k) + elseif model_type == :fhn + param_box!(grid, 3, "ϵ", param_obs_map.ϵ) + param_box!(grid, 4, "a", param_obs_map.a) + param_box!(grid, 5, "b", param_obs_map.b) else - param_box!(grid, 1, "Du", fhn_params.Du) - param_box!(grid, 2, "Dv", fhn_params.Dv) - param_box!(grid, 3, "ϵ", fhn_params.ϵ) - param_box!(grid, 4, "a", fhn_params.a) - param_box!(grid, 5, "b", fhn_params.b) + @warn "Unknown model type in rebuild_param_boxes!: $model_type" end end -function setup_param_binding!(model_type, gray_params, fhn_params, params_obs) - if model_type[] == :gray_scott - lift(gray_params.Du, gray_params.Dv, gray_params.F, gray_params.k) do Du, Dv, F, k - params_obs[] = Constants.GSParams(N, dx, Du, Dv, F, k) +function setup_param_binding!(model_type::Symbol, param_obs_map::NamedTuple, params_obs::Observable) + if model_type == :gray_scott + lift(param_obs_map.N, param_obs_map.dx, param_obs_map.Du, param_obs_map.Dv, param_obs_map.F, param_obs_map.k) do N, dx, Du, Dv, F, k + params_obs[] = Constants.CombinedPDEParams(N, dx, Du, Dv, F, k) + end + elseif model_type == :fhn + lift(param_obs_map.N, param_obs_map.dx, param_obs_map.Du, param_obs_map.Dv, param_obs_map.F, param_obs_map.k, param_obs_map.ϵ, param_obs_map.a, param_obs_map.b) do N, dx, Du, Dv, F, k, ϵ, a, b + params_obs[] = Constants.CombinedPDEParams(N, dx, Du, Dv, F, k, ϵ, a, b) end else - lift(fhn_params.Du, fhn_params.Dv, fhn_params.ϵ, fhn_params.a, fhn_params.b) do Du, Dv, ϵ, a, b - params_obs[] = Constants.FHNParams(N, dx, Du, Dv, ϵ, a, b) - end + @warn "Unknown model type in setup_param_binding!: $model_type" end end @@ -104,10 +107,10 @@ function build_ui(U, V, param_obs_map::NamedTuple, params_obs, heat_obs) run_label = Observable{String}("Run") stepsize = Observable(30) spoint = select_point(ax.scene) - step_method = Observable(step_gray_scott!) + step_method = Observable{Function}(step_gray_scott!) # Controls - dropdown = Menu(fig, options = ["Gray-Scott" => :gray_scott, "FHN" => :fhn]) + dropdown = Menu(fig, options=["Gray-Scott" => :gray_scott, "FHN" => :fhn]) 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) @@ -200,8 +203,10 @@ function build_ui(U, V, param_obs_map::NamedTuple, params_obs, heat_obs) end # Update param bindings and input fields - setup_param_binding!(selected_model, gray_params, fhn_params, params_obs) - rebuild_param_boxes!(textboxgrid, selected_model, gray_params, fhn_params) + lift(param_obs_map.N, param_obs_map.dx, param_obs_map.Du, param_obs_map.Dv, param_obs_map.F, param_obs_map.k, param_obs_map.ϵ, param_obs_map.a, param_obs_map.b) do N, dx, Du, Dv, F, k, ϵ, a, b + params_obs[] = Constants.CombinedPDEParams(N, dx, Du, Dv, F, k, ϵ, a, b) + end + rebuild_param_boxes!(textboxgrid, selected_model, param_obs_map) end return fig