|
50 | 50 | nt = np.size(time) |
51 | 51 |
|
52 | 52 | "Initialize solution variable" |
53 | | -U = np.zeros((N+2,nt)) |
| 53 | +U = np.zeros((N+1,nt)) |
54 | 54 |
|
55 | 55 |
|
56 | 56 | for it in range(nt-1): |
57 | 57 |
|
58 | 58 | "System matrix and RHS term" |
59 | 59 | "Diffusion term" |
60 | | - Diff = nu*(1/Dx**2)*(2*np.diag(np.ones(N+2)) - np.diag(np.ones(N+1),-1) - np.diag(np.ones(N+1),1)) |
| 60 | + Diff = nu*(1/Dx**2)*(2*np.diag(np.ones(N+1)) - np.diag(np.ones(N),-1) - np.diag(np.ones(N),1)) |
61 | 61 |
|
62 | 62 | "Advection term:" |
63 | 63 |
|
64 | 64 | "Sensor" |
65 | 65 | U0 = U[:,it] |
66 | | - uaux = np.concatenate(([U0[0]],U0,[U0[N+1]])) |
67 | | - Du = uaux[1:N+4] - uaux[0:N+3] + 1e-8 |
68 | | - r = Du[0:N+2]/Du[1:N+3] |
| 66 | + uaux = np.concatenate(([U0[0]], U0,[U0[N]])) |
| 67 | + Du = uaux[1:N+3] - uaux[0:N+2] + 1e-8 |
| 68 | + r = Du[0:N+1]/Du[1:N+2] |
69 | 69 |
|
70 | 70 | "Limiter" |
71 | 71 | if beta>0: |
|
74 | 74 | else: |
75 | 75 | phi = 2*r/(r**2 + 1) |
76 | 76 |
|
77 | | - phim = phi[0:N+1] |
78 | | - phip = phi[1:N+2] |
| 77 | + phim = phi[0:N] |
| 78 | + phip = phi[1:N+1] |
79 | 79 |
|
80 | 80 |
|
81 | 81 | "Upwind scheme" |
|
97 | 97 | "Source term" |
98 | 98 | sine = np.sin(2*pi*time[it+1]) |
99 | 99 | sineplus = 0.5*(sine + np.abs(sine)) |
100 | | - F = 100*np.exp(-((xN-0.8)/0.01)**2)*sineplus |
| 100 | + F = 100*np.exp(-((x-0.8)/0.01)**2)*sineplus |
101 | 101 |
|
102 | 102 | "Temporal terms" |
103 | | - A = A + (1/dt)*np.diag(np.ones(N+2)) |
| 103 | + A = A + (1/dt)*np.diag(np.ones(N+1)) |
104 | 104 | F = F + U0/dt |
105 | 105 |
|
106 | 106 | "Boundary condition at x=0" |
107 | | - A[0,:] = (1/Dx)*np.concatenate(([-1, 0, 1],np.zeros(N-1))) |
| 107 | + A[0,:] = (1/Dx)*np.concatenate(([1.5, -2, 0.5],np.zeros(N-2))) |
108 | 108 | F[0] = 0 |
109 | 109 |
|
110 | 110 | "Boundary condition at x=1" |
111 | | - A[N+1,:] = np.concatenate((np.zeros(N+1),[1])) |
112 | | - F[N+1] = u0 |
| 111 | + A[N,:] = np.concatenate((np.zeros(N),[1])) |
| 112 | + F[N] = u0 |
113 | 113 |
|
114 | 114 |
|
115 | 115 | "Solution of the linear system AU=F" |
116 | 116 | u = np.linalg.solve(A,F) |
117 | 117 | U[:,it+1] = u |
118 | | - u = u[1:N+2] |
| 118 | + u = u[0:N+1] |
119 | 119 |
|
120 | 120 |
|
121 | 121 | "Animation of the results" |
|
128 | 128 |
|
129 | 129 | def animate(i): |
130 | 130 |
|
131 | | - u = U[1:N+2,i] |
| 131 | + u = U[0:N+1,i] |
132 | 132 | plt.plot(x,u) |
133 | 133 | myAnimation.set_data(x, u) |
134 | 134 | return myAnimation, |
135 | 135 |
|
136 | 136 | anim = animation.FuncAnimation(fig,animate,frames=range(1,nt),blit=True,repeat=False) |
137 | 137 |
|
138 | 138 |
|
139 | | -"Peclet number" |
140 | | -P = np.abs(c*Dx/nu) |
141 | | -print("Pe number Pe=%g\n" % P); |
| 139 | +if nu>0: |
| 140 | + "Peclet number" |
| 141 | + P = np.abs(c*Dx/nu) |
| 142 | + print("Pe number Pe=%g\n" % P); |
142 | 143 |
|
143 | 144 | "CFL number" |
144 | 145 | CFL = np.abs(c*dt/Dx) |
|
0 commit comments