http://fiscomp.if.ufrgs.br/index.php?title=C%C3%B3digo_2_-_M%C3%A9todo_FTCS_expl%C3%ADcito&feed=atom&action=history
Código 2 - Método FTCS explícito - Histórico de revisão
2024-03-29T13:45:02Z
Histórico de revisões para esta página neste wiki
MediaWiki 1.39.4
http://fiscomp.if.ufrgs.br/index.php?title=C%C3%B3digo_2_-_M%C3%A9todo_FTCS_expl%C3%ADcito&diff=5968&oldid=prev
Schmokel: Criou página com '<source lang="python"> Lx = 500.0 #define o número de pontos na direção x px = 1001 #define o espaçamento entre os pontos mais próximos dx = Lx / (px -...'
2021-10-19T14:44:17Z
<p>Criou página com '<source lang="python"> Lx = 500.0 #define o número de pontos na direção x px = 1001 #define o espaçamento entre os pontos mais próximos dx = Lx / (px -...'</p>
<p><b>Página nova</b></p><div><source lang="python"><br />
<br />
Lx = 500.0 <br />
<br />
#define o número de pontos na direção x<br />
px = 1001 <br />
<br />
#define o espaçamento entre os pontos mais próximos<br />
dx = Lx / (px - 1) <br />
<br />
# Localiza o número de pontos ao longo das direções x e y<br />
x = np.linspace(0.0, Lx, num=px)<br />
<br />
<br />
#profundidade do oceano h = 50 m<br />
h = 2 * np.ones_like(x)<br />
<br />
# Condição inicial da onda gerado pelo sismo <br />
eta0 = 3. * np.exp(-((x-80)**2/70))<br />
eta0_analitico = 2 + 3. * np.exp(-((x-80)**2/70))<br />
<br />
# velocidade constante<br />
u = 4.3<br />
<br />
# constante da gravidade<br />
g = 9.81 <br />
<br />
# define o tempo máximo e o intervalo infinitesimal de tempo <br />
Tmax = 30.<br />
dt = 0.01<br />
nt = (int)(Tmax/dt)<br />
<br />
eta = shallow_water(eta0,eta0_analitico,h,g,nt,dx,dt,px,x,u)<br />
<br />
</source><br />
<br />
<source lang="python"><br />
<br />
def shallow_water(eta0,eta0_analitico,h,g,nt,dx,dt,px,x,u):<br />
<br />
<br />
# Copia a amplitude inicial da onda no espaço <br />
eta = eta0.copy()<br />
<br />
<br />
nx = eta.shape<br />
fundo = 0 * np.ones_like(x)<br />
conta = 0<br />
<br />
# Loop over timesteps<br />
for k in range(1,nt):<br />
<br />
<br />
eta = atualiza_eta(eta, dx, dt, nx,px,h,u)<br />
eta0_analitico = 2 + 3. * np.exp(-((x-80 -u*(k*dt))**2/70)) <br />
<br />
conta = conta + 1<br />
<br />
if(conta == 100):<br />
<br />
plt.clf()<br />
<br />
# titulos<br />
plt.suptitle('Propagação da onda- FTCS', fontsize=14)<br />
plt.title(f'Tempo: {round(dt*k, 3)} s', fontsize=10)<br />
plt.ylim(-1, 12)<br />
plt.xlim(0, 250)<br />
plt.plot(x,eta0_analitico,label='$\eta$ analítico')<br />
plt.plot(x, eta+h, label='$\eta$ numérico')<br />
plt.plot(x,fundo,label='$h(x)$')<br />
plt.xlabel('x [m]')<br />
plt.legend()<br />
plt.ylabel('$\eta$ [m]')<br />
<br />
plt.show()<br />
plt.close()<br />
<br />
conta=0<br />
<br />
return eta, M<br />
<br />
</source><br />
<br />
<source lang="python"><br />
<br />
def atualiza_eta(eta, dx, dt, nx, px, h, u):<br />
<br />
for j in range(1,px-2):<br />
<br />
D = eta + h<br />
<br />
dDdx = u*(D[j+1] - D[j-1]) / (2. * dx)<br />
eta[j] = eta[j] - dt * (dDdx)<br />
<br />
return eta <br />
<br />
</source></div>
Schmokel