annotate examples/wave_eq.jl @ 876:4f3924293894 laplace_benchmarks

Add examples and benchmarks folders
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Thu, 27 Jan 2022 11:00:31 +0100
parents wave_eq.jl@7e9ebd572deb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
874
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
1 using Sbplib.Grids, Sbplib.SbpOperators, Sbplib.LazyTensors, Sbplib.RegionIndices
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
2 using OrdinaryDiffEq, Plots, Printf, Base.Threads
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
3
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
4 function apply_tm!(f,u,tm,ind)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
5 for I in ind
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
6 @inbounds f[I] = (tm*u)[I]
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
7 end
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
8 end
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
9
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
10 function apply_tm_all_regions!(f,u,tm,rinds)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
11 apply_tm!(f,u,tm,rinds[1])
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
12 apply_tm!(f,u,tm,rinds[2])
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
13 apply_tm!(f,u,tm,rinds[3])
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
14 end
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
15
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
16 region_indices(L, N, ::Lower) = map(x->Index{Lower}(x),1:closure_size(L))
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
17 region_indices(L, N, ::Interior) = map(x->Index{Interior}(x),closure_size(L)+1:N-closure_size(L))
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
18 region_indices(L, N, ::Upper) = map(x->Index{Upper}(x),N-closure_size(L)+1:N)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
19
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
20 function get_region_indices(L,N)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
21 ind_lower = region_indices(L, N, Lower())
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
22 ind_interior = region_indices(L, N, Interior())
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
23 ind_upper = region_indices(L, N, Upper())
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
24 return (ind_lower, ind_interior, ind_upper)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
25 end
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
26
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
27 function wave_eq_sim(alg,T,CFL)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
28 # Domain
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
29 N = 101
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
30 g = EquidistantGrid(N,0.,1.)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
31 dx = min(spacing(g)...)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
32
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
33 # Spatial discretization
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
34 Δ = Laplace(g,sbp_operators_path()*"standard_diagonal.toml"; order=4)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
35 (id_l, id_r) = boundary_identifiers(g)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
36 SAT_l = boundary_condition(Δ,id_l,NeumannBC())
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
37 SAT_r = boundary_condition(Δ,id_r,NeumannBC())
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
38 tm = (Δ + SAT_l + SAT_r)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
39
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
40 # RHS function
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
41 rinds = get_region_indices(Δ,N)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
42 function f(du,u,p,t)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
43 du[1:N] .= u[N+1:end]
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
44 apply_tm_all_regions!(view(du,N+1:2*N), view(u,1:N), tm, rinds)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
45 end
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
46 # Initial condition
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
47 sigma = 0.1
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
48 ic_u = x->1/(sigma*sqrt(2*pi))*exp(-1/2*((x-0.5)^2/sigma^2))
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
49 ic_u_t = x->0
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
50 w0 = [evalOn(g,ic_u);
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
51 evalOn(g,ic_u_t)]
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
52 # Setup ODE and solve
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
53 tspan = (0.,T)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
54 prob = ODEProblem(f,w0,tspan)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
55 sol = solve(prob, alg, dt=CFL*dx, saveat=0.05)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
56
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
57 # Plotting
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
58 x = [x[1] for x in points(g)]
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
59 anim = @animate for i ∈ eachindex(sol.t)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
60 u_i = sol.u[i]
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
61 plot(x, u_i[1:N], ylims = (0,4), lw=3,ls=:dash,label="",title=@sprintf("u at t = %.3f", sol.t[i]))
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
62 end
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
63 gif(anim, "wave.gif", fps = 15)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
64 end
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
65
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
66 wave_eq_sim(CarpenterKennedy2N54(),1.,0.25)
7e9ebd572deb Add file for wave equation
Vidar Stiernström <vidar.stiernstrom@it.uu.se>
parents:
diff changeset
67