-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathBG_1D.jl
95 lines (67 loc) · 1.5 KB
/
BG_1D.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
# BG_1D
function minmod2(theta, s0, s1, s2)
#
if (s0 < s1 && s1 < s2) {
d1 = theta*(s1 - s0);
d2 = (s2 - s0) / 2.0;
d3 = theta*(s2 - s1);
if (d2 < d1) d1 = d2;
return min(d1, d3);
}
if (s0 > s1 && s1 > s2) {
d1 = theta*(s1 - s0)
d2 = (s2 - s0) / 2.0
d3 = theta*(s2 - s1);
if (d2 > d1) d1 = d2;
return max(d1, d3);
}
return 0.0;
end
function gradient(nx, theta, delta, a, dadx)
ix=collect(1:nx);
xplus = min.(ix + 1, nx);
xminus = max.(ix - 1, 1);
as=a;
al=a[xminus];
ar=a[xplus];
dadx = minmod2.(theta, al, a, ar) ./ delta;
end
function kurganov()
#
ix=collect(1:nx);
dx=0.5*delta
xplus = min.(ix + 1, nx);
xminus = max.(ix - 1, 1);
dhdxmin = dhdx[xminus];
hi=h;
hn=h[xminus];
wet=(hi.>eps) .| (hn.>eps)
zi=zs.-hi;
zl = zi .- dx.*(dzsdx .- dhdx);
zn = zs[xminus] .- hn;
zr = zn .+ dx.*(dzsdx[xminus] .- dhdxmin);
zlr = max(zl, zr);
hl = hi .- dx.*dhdx;
up = uu .- dx.*dudx;
hp = max.(0.0, hl .+ zl .- zlr);
hr = hn .+ dx.*dhdxmin;
um = uu[xminus] + dx*dudx[xminus];
hm = max(0.0, hr + zr - zlr);
### To be continued
end
function loop(h,zs,u,v)
# Calculate gradients for h zs u v
gradient(nx, theta, delta, h, dhdx);
gradient(nx, theta, delta, zs, dzsdx);
gradient(nx, theta, delta, u, dudx);
gradient(nx, theta, delta, v, dvdx)
# Kurganov scheme
# Reduce dtmax
# Update step 1
# Advance 0.5*dt
# Calculate gradient on advance
# Kurganov scheme
# update step 2
# Advance full step
# Clean up
end