@@ -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