so close. I swear
parent
3aaef9fabe
commit
08bb01fc85
|
|
@ -9,53 +9,26 @@ using GLMakie
|
||||||
using .Constants
|
using .Constants
|
||||||
using .Visualization
|
using .Visualization
|
||||||
|
|
||||||
|
# GSParams AND FHNParams
|
||||||
# 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
|
|
||||||
N = 128
|
N = 128
|
||||||
dx = 1.0
|
dx = 1.0
|
||||||
gray_params = (
|
params = (
|
||||||
Du = Observable(0.16),
|
N=Observable(128),
|
||||||
Dv = Observable(0.08),
|
dx=Observable(1.0),
|
||||||
F = Observable(0.060),
|
Du=Observable(0.16),
|
||||||
k = Observable(0.062)
|
Dv=Observable(0.08),
|
||||||
|
F=Observable(0.060),
|
||||||
|
k=Observable(0.062),
|
||||||
|
ϵ=Observable(0.05),
|
||||||
|
a=Observable(0.7),
|
||||||
|
b=Observable(0.8)
|
||||||
)
|
)
|
||||||
|
|
||||||
# FHNParams
|
params_obs = Observable{Constants.CombinedPDEParams}(CombinedPDEParams(N, dx, params.Du[], params.Dv[], params.F[], params.k[], params.ϵ[], params.a[], params.b[]))
|
||||||
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
|
|
||||||
"""
|
|
||||||
|
|
||||||
U = ones(N, N)
|
U = ones(N, N)
|
||||||
V = zeros(N, N)
|
V = zeros(N, N)
|
||||||
heat_obs = Observable(U)
|
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)
|
display(fig)
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,18 @@ struct GSParams <: PDEParams
|
||||||
|
|
||||||
end
|
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
|
end # module Constants
|
||||||
|
|
|
||||||
|
|
@ -56,32 +56,35 @@ function param_box!(grid, row, labeltxt, observable::Observable)
|
||||||
end
|
end
|
||||||
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)
|
empty!(grid)
|
||||||
|
|
||||||
if model_type[] == :gray_scott
|
param_box!(grid, 1, "Du", param_obs_map.Du)
|
||||||
param_box!(grid, 1, "Du", gray_params.Du)
|
param_box!(grid, 2, "Dv", param_obs_map.Dv)
|
||||||
param_box!(grid, 2, "Dv", gray_params.Dv)
|
|
||||||
param_box!(grid, 3, "Feed", gray_params.F)
|
if model_type == :gray_scott
|
||||||
param_box!(grid, 4, "Kill", gray_params.k)
|
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
|
else
|
||||||
param_box!(grid, 1, "Du", fhn_params.Du)
|
@warn "Unknown model type in rebuild_param_boxes!: $model_type"
|
||||||
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)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function setup_param_binding!(model_type, gray_params, fhn_params, params_obs)
|
function setup_param_binding!(model_type::Symbol, param_obs_map::NamedTuple, params_obs::Observable)
|
||||||
if model_type[] == :gray_scott
|
if model_type == :gray_scott
|
||||||
lift(gray_params.Du, gray_params.Dv, gray_params.F, gray_params.k) do Du, Dv, F, k
|
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.GSParams(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
|
end
|
||||||
else
|
else
|
||||||
lift(fhn_params.Du, fhn_params.Dv, fhn_params.ϵ, fhn_params.a, fhn_params.b) do Du, Dv, ϵ, a, b
|
@warn "Unknown model type in setup_param_binding!: $model_type"
|
||||||
params_obs[] = Constants.FHNParams(N, dx, Du, Dv, ϵ, a, b)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -104,10 +107,10 @@ function build_ui(U, V, param_obs_map::NamedTuple, params_obs, heat_obs)
|
||||||
run_label = Observable{String}("Run")
|
run_label = Observable{String}("Run")
|
||||||
stepsize = Observable(30)
|
stepsize = Observable(30)
|
||||||
spoint = select_point(ax.scene)
|
spoint = select_point(ax.scene)
|
||||||
step_method = Observable(step_gray_scott!)
|
step_method = Observable{Function}(step_gray_scott!)
|
||||||
|
|
||||||
# Controls
|
# 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)
|
fig[2, 1] = buttongrid = GridLayout(ax.scene, tellwidth=false)
|
||||||
btn_step = Button(buttongrid[1, 1], width=50, label="Step")
|
btn_step = Button(buttongrid[1, 1], width=50, label="Step")
|
||||||
btn_start = Button(buttongrid[1, 2], width=50, label=run_label)
|
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
|
end
|
||||||
|
|
||||||
# Update param bindings and input fields
|
# Update param bindings and input fields
|
||||||
setup_param_binding!(selected_model, gray_params, fhn_params, params_obs)
|
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
|
||||||
rebuild_param_boxes!(textboxgrid, selected_model, gray_params, fhn_params)
|
params_obs[] = Constants.CombinedPDEParams(N, dx, Du, Dv, F, k, ϵ, a, b)
|
||||||
|
end
|
||||||
|
rebuild_param_boxes!(textboxgrid, selected_model, param_obs_map)
|
||||||
end
|
end
|
||||||
|
|
||||||
return fig
|
return fig
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue