""" Visualization for Burgers source identification. """ using TuePlots function _icml_theme(; single_column=false, nrows=1, ncols=1, ratio=0.85) Theme( TuePlots.SETTINGS[:ICML]; font=true, fontsize=true, figsize=true, single_column=single_column, nrows=nrows, ncols=ncols, subplot_height_to_width_ratio=ratio, ) end function plot_source_comparison(result, s_true, xs, ys; filename::Union{Nothing,String}=nothing) set_theme!(_icml_theme(single_column=false, nrows=1, ncols=4, ratio=1.0)) fig = Figure() s_err = abs.(s_true .- result.s_mean) vmin = min(minimum(s_true), minimum(result.s_mean)) vmax = max(maximum(s_true), maximum(result.s_mean)) ax1 = Axis(fig[1,1]; aspect=DataAspect(), title="True source", xlabel=L"x", ylabel=L"y") hm1 = heatmap!(ax1, xs, ys, s_true; colorrange=(vmin, vmax), colormap=:viridis) ax2 = Axis(fig[1,2]; aspect=DataAspect(), title="Posterior mean", xlabel=L"x", yticklabelsvisible=false) heatmap!(ax2, xs, ys, result.s_mean; colorrange=(vmin, vmax), colormap=:viridis) Colorbar(fig[1,3], hm1; width=8) ax3 = Axis(fig[1,4]; aspect=DataAspect(), title="|Error|", xlabel=L"x", yticklabelsvisible=false) hm3 = heatmap!(ax3, xs, ys, s_err; colormap=:inferno) Colorbar(fig[1,5], hm3; width=8) ax4 = Axis(fig[1,6]; aspect=DataAspect(), title="Posterior std", xlabel=L"x", yticklabelsvisible=false) hm4 = heatmap!(ax4, xs, ys, result.s_std; colormap=:inferno) Colorbar(fig[1,7], hm4; width=8) if !isnothing(filename) mkpath(dirname(filename)) save(filename, fig, pt_per_unit=1) end set_theme!() return fig end function plot_solution_snapshots(result, u_truth, xs, ys, ts; snapshot_times=nothing, filename::Union{Nothing,String}=nothing, obs_data=nothing) n_t_total = size(u_truth, 3) if isnothing(snapshot_times) snapshot_times = round.(Int, range(1, n_t_total, length=4)) end n_snap = length(snapshot_times) set_theme!(_icml_theme(single_column=false, nrows=3, ncols=n_snap, ratio=1.0)) fig = Figure() for (col, t) in enumerate(snapshot_times) vmin = min(minimum(u_truth[:,:,t]), minimum(result.u_mean[:,:,t])) vmax = max(maximum(u_truth[:,:,t]), maximum(result.u_mean[:,:,t])) ax1 = Axis(fig[1, col]; aspect=DataAspect(), title=L"t=%$(round(ts[t], digits=2))", ylabel=col==1 ? "Truth" : "", yticklabelsvisible=col==1) hm = heatmap!(ax1, xs, ys, u_truth[:,:,t]; colorrange=(vmin, vmax), colormap=:viridis) ax2 = Axis(fig[2, col]; aspect=DataAspect(), ylabel=col==1 ? "GP-FVM" : "", yticklabelsvisible=col==1) heatmap!(ax2, xs, ys, result.u_mean[:,:,t]; colorrange=(vmin, vmax), colormap=:viridis) if col == n_snap Colorbar(fig[1:2, n_snap+1], hm; width=8) end ax3 = Axis(fig[3, col]; aspect=DataAspect(), ylabel=col==1 ? "Std" : "", yticklabelsvisible=col==1) hm_std = heatmap!(ax3, xs, ys, result.u_std[:,:,t]; colormap=:inferno) # Show observation locations at timesteps where we observe if !isnothing(obs_data) && t in obs_data.obs_timesteps scatter!(ax3, obs_data.obs_x, obs_data.obs_y; color=:white, markersize=3, strokewidth=0.4, strokecolor=:black) end if col == n_snap Colorbar(fig[3, n_snap+1], hm_std; width=8) end end if !isnothing(filename) mkpath(dirname(filename)) save(filename, fig, pt_per_unit=1) end set_theme!() return fig end function plot_convergence(iteration_log; filename::Union{Nothing,String}=nothing) fig = Figure(size=(500, 350), fontsize=12) ax = Axis(fig[1, 1]; xlabel="Gauss-Newton iteration", ylabel="Newton decrement", yscale=log10, title="Convergence of nonlinear solve") scatterlines!(ax, 1:length(iteration_log), iteration_log; color=:royalblue, linewidth=2, markersize=6) if !isnothing(filename) mkpath(dirname(filename)) save(filename, fig, px_per_unit=3) end return fig end