-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnumerical_methods.jl
105 lines (83 loc) · 2.37 KB
/
numerical_methods.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# flux for Euler equations
function f(u)
ρ = u[1]
v = u[2] / ρ
E = u[3]
γ = 7/5
p = (γ-1)*(E - 1/2 * ρ*v^2)
return [u[2];
u[2]*v + p;
v * (E + p)]
end
# initial conditions for shu osher test
function initialCondition(N)
Δx = 10/(N-1)
x = 0:Δx:10
ε = 0.2
γ = 7/5
ρ₀(x) = x < 1 ? 3.857153 : 1 + ε * sin(5*x)
v₀(x) = x < 1 ? 2.629 : 0
p₀(x) = x < 1 ? 10.333 : 1
return Δx, x, hcat(ρ₀.(x), ρ₀.(x) .* v₀.(x), p₀.(x) / (γ - 1) + 1/2 * ρ₀.(x) .* v₀.(x) .^ 2)'
end
function laxFriedrichs(N,tn)
Δx, x, u0 = initialCondition(N)
Δt = Δx * 0.2
t = 0:Δt:(tn+Δt) # dependent on the CFL number of the method used
n = size(t,1)
u = zeros(Float64,3,N,n+1)
u[:,:,1] = u0
for i = 1:n
# constant boundary condition
u[:,1,i+1] = u[:,1,i]
u[:,end,i+1] = u[:,end,i]
for k = 2:N-1
# Lax-Friedrichs scheme
u[:,k,i+1] = (u[:,k+1,i] + u[:,k-1,i]) / 2 - Δt / (2 * Δx) * (f(u[:,k+1,i]) - f(u[:,k-1,i]))
end
end
return x, t, u
end
# Godunov flux for local Riemann problems
function fG(ul,ur)
flux = zeros(Float64,3,1)
fl = f(ul)
fr = f(ur)
f0 = f(zeros(Float64,3))
for i = 1:size(ul,1)
if ul[i] > ur[i]
if ul[i,1] + ur[i,1] >= 0
flux[i,1] = fl[i,1]
else
flux[i,1] = fr[i,1]
end
elseif ul[i,1] <= ur[i,1]
if ul[i,1] >= 0
flux[i,1] = fl[i,1]
elseif ul[i,1] <= 0 <= ur[i,1]
flux[i,1] = f0[i,1]
else
flux[i,1] = fr[i,1]
end
end
end
return flux
end
function godunov(N,tn)
Δx, x, u0 = initialCondition(N)
Δt = Δx * 0.2 # dependent on the CFL number of the method used
t = 0:Δt:(tn+Δt)
n = size(t,1)
u = zeros(Float64,3,N,n+1)
u[:,:,1] = u0
for i = 1:n
# constant boundary conditions
u[:,1,i+1] = u[:,1,i]
u[:,end,i+1] = u[:,end,i]
for k = 2:N-1
# Godunov scheme
u[:,k,i+1] = u[:,k,i] + Δt / Δx * (fG(u[:,k-1,i],u[:,k,i]) - fG(u[:,k,i],u[:,k+1,i]))
end
end
return x, t, u
end