Skip to content

Commit 5655842

Browse files
committed
Implement PBC for all cases
1 parent 79a7722 commit 5655842

1 file changed

Lines changed: 19 additions & 8 deletions

File tree

fdm-devito-notebooks/04_advec/src-advec/advec1D.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def solver_FECS(I, U0, v, L, dt, C, T, user_action=None):
1616
C = v*dt/dx
1717

1818
grid = Grid(shape=(Nx+1,), extent=(L,))
19-
t_s=grid.stepping_dim
19+
t_s=grid.time_dim
2020

2121
u = TimeFunction(name='u', grid=grid, space_order=2, save=Nt+1)
2222

@@ -29,7 +29,7 @@ def solver_FECS(I, U0, v, L, dt, C, T, user_action=None):
2929
u.data[1, :] = [I(xi) for xi in x]
3030

3131
# Insert boundary condition
32-
bc = [Eq(u[t_s+1, 0], U0)]
32+
bc = [Eq(u[t_s, 0], U0)]
3333

3434
op = Operator([eq] + bc)
3535
op.apply(time_m=1, dt=dt)
@@ -67,6 +67,9 @@ def u(to=1, so=1):
6767
u = u(so=2)
6868
pde = u.dtr + v*u.dxc
6969

70+
pbc = [Eq(u[t_s+1, 0], u[t_s, 0] - 0.5*C*(u[t_s, 1] - u[t_s, Nx]))]
71+
pbc += [Eq(u[t_s, Nx], u[t_s, 0])]
72+
7073
elif scheme == 'LF':
7174
# Use UP scheme for first timestep
7275
u1 = TimeFunction(name='u1', grid=grid, save=2)
@@ -78,15 +81,15 @@ def u(to=1, so=1):
7881
# Set initial condition u(x,0) = I(x)
7982
u1.data[0, :] = [I(xi) for xi in x]
8083

81-
bc1 = [Eq(u1[t_s+1, 0], U0)] # non-periodic boundary condition
82-
pbc1 = [Eq(u1[t_s, 0], u1[t_s, Nx])] # periodic boundary condition
84+
bc1 = [Eq(u1[t_s+1, 0], U0)]
85+
pbc1 = [Eq(u1[t_s, 0], u1[t_s, Nx])]
8386

8487
integral[0] = dx*(0.5*u1.data[0][0] + 0.5*u1.data[0][Nx] + np.sum(u1.data[0][1:Nx]))
8588

8689
if user_action is not None:
8790
user_action(u1.data[0], x, t, 0)
8891

89-
op1 = Operator(bc1 + (pbc1 if periodic_bc else []) + [eq1] + (bc1 if not periodic_bc else []))
92+
op1 = Operator(bc1 + (pbc1 if periodic_bc else []) + [eq1])
9093
op1.apply(dt=dt)
9194

9295
integral[1] = dx*(0.5*u1.data[1][0] + 0.5*u1.data[1][Nx] + np.sum(u1.data[1][1:Nx]))
@@ -100,14 +103,23 @@ def u(to=1, so=1):
100103
u = u(to=2, so=2)
101104
u.data[0:2, :] = u1.data
102105
pde = u.dtc + v*u.dxc
106+
107+
pbc = [Eq(u[t_s+1, 0], u[t_s-1, 0] - C*(u[t_s, 1] - u[t_s, Nx - 1]))]
108+
pbc += [Eq(u[t_s, Nx], u[t_s, 0])]
103109

104110
elif scheme == 'UP':
105111
u = u()
106112
pde = u.dtr + v*u.dxl
113+
114+
pbc = [Eq(u[t_s, 0], u[t_s, Nx])]
107115

108116
elif scheme == 'LW':
109117
u = u(so=2)
110118
pde = u.dtr + v*u.dxc - 0.5*dt*v**2*u.dx2
119+
120+
pbc = [Eq(u[t_s+1, 0], u[t_s, 0] - 0.5*C*(u[t_s, 1] - u[t_s, Nx - 1]) + \
121+
0.5*C*(u[t_s, 1] - 2*u[t_s, 0] + u[t_s, Nx-1]))]
122+
pbc += [Eq(u[t_s, Nx], u[t_s, 0])]
111123

112124
else:
113125
raise ValueError('scheme="%s" not implemented' % scheme)
@@ -125,10 +137,9 @@ def u(to=1, so=1):
125137
if user_action is not None:
126138
user_action(u.data[0], x, t, 0)
127139

128-
bc = [Eq(u[t_s+1, 0], U0)] # non-periodic boundary condition
129-
pbc = [Eq(u[t_s, 0], u[t_s, Nx])] # periodic boundary condition
140+
bc = [Eq(u[t_s+1, 0], U0)]
130141

131-
op = Operator(bc + (pbc if periodic_bc else []) + [eq] + (bc if not periodic_bc else []))
142+
op = Operator(bc + (pbc if periodic_bc else []) + [eq])
132143
op.apply(time_m=1 if scheme == 'LF' else 0, time_M=Nt-1, dt=float(dt))
133144

134145
for n in range(2 if scheme == 'LF' else 1, Nt+1):

0 commit comments

Comments
 (0)