Difusão ambipolar em plasmas
Equação da difusão ambipolar
Esse trabalho tem como objetivo demonstrar uma resolução numérica para o caso unidimensional da difusão ambipolar de um plasma(gás formado de elétrons e íons). A difusão é o modo como um fluido se dilui em um meio. Estudar as equações que governam esse fenômeno e as formas de resolvê-las é de extremo interesse para a física de fluidos e de plasmas, entre outras áreas.
IMAGEM (1)
Quando a partição é removida ha uma pertubação instantanea na condição de equilibrio. Os elétrons por ser mais leve difundem-se mais rápido que os íons devido a sua menor massa.
Essa separação de cargas gera um campo elétrico de polarização que aumenta a taxa de difusão dos íons e diminui a dos elétrons até que ocorra um equilíbrio.
Esses movimentos coletivos são caracterizados por uma frequência natural de oscilação(Oscilações de Langmuir).
IMAGEM (2):
Como mostrado por Shimony e Cahn[1], esse problema é descrito por uma equação de onda amortecida para a função de densidade :
,
onde e , sendo a frequência de colisão ambipolar e o coeficiente de difusão ambipolar.
Como tratamos do caso unidimensional, a equação 1 torna-se
.
O Método
A resolução numérica do problema foi baseada no artigo de Najafi e Izadi [2]. Começamos com a forma mais usual de escrever a equação da onda amortecida unidimencional
.
No nosso caso e .
Discretizando as variáveis do problema, temos que
,
.
Substituindo as derivadas que aparecem na equação por diferenças finitas, obtemos
,
,
.
Substituindo essas relações na equação 3, obtemos
.
Omitindo todos os temos de ordem e isolando , obtemos
,
sendo .
Essa é a equação para resolver o problema para , porém o problema envolve uma derivada de segunda ordem no tempo, o que faz com que precisemos saber os dois passos anteriores para calcular o próximo. Então necessitamos ainda de uma maneira de determinar a paritr de , para então calcular os demais passos. Para isso assumimos que a função é inicialmente estacionária e fazemos
.
Substituindo na equação 4 para obtemos
.
Com as equações 4 e 5, e tomando as devidas condições de contorno nas bordas (no caso desse trabalho usamos bordas fixas em 0 e também condições periódicas de contorno), podemos calcular a evolução temporal da função de densidade. Esse método é estável para e seu erro é
.
Resultados e Discussão
Aplicamos o método descrito acima para simular a evolução da densidade de um plasma se difundindo em um tubo de largura . Fizemos o plasma inicialmente concentrado na região central do tubo: para e para fora dessa região. Usamos e , que resulta em , e criamos gifs mostrando a evlução temporal da função de densidade para diferentes valores de e . Para garantir a estabilidade do método, essas constantes devem ser tais que .
Quanto à solução nas bordas, fizemos de duas manerias: A primeira foi com condições de contorno fixas em 0 () e represenda o caso em que as bordas são um sumidouro, como se fosse um tubo aberto. A segunda foi usando condições de contorno periódicas () e representa o caso de um tubo fechado.
Evolução temporal da densidade do plasma para diferentes valores de e | |
---|---|
Evolução temporal da densidade do plasma para diferentes valores de e | |
---|---|
Podemos observar que é o parâmetro que domina a velocidade com que que a densidade decai, o que é esperado, uma vez que um coeficiente de difusão maior faz o plasma se difundir mais rápido. Já parece estar ligado à "suavidade" da distribuição, sendo que com frequências baixas começam a aparecer diversos picos de densidade.
Programas Utilizados
Para implementar o método computacionalmente e criar os gifs foram usados códigos em python. O código abaixo é a solução para as bordas fixas em 0:
import numpy as np
import matplotlib.pyplot as plt
import imageio
dt = 0.01
dx = 0.1
L = 10
T = 50
#constantes do plasma
nu_a = 0.1
Da = 0.5
#constantes para a eq da onda
c = np.sqrt(nu_a*Da)
h = nu_a/2
s = (c*dt/dx)**2
x = np.linspace(0, L, int(L/dx)) #array com as coordenadas espaciais
t = np.linspace(0, T, int(T/dt)) #array com as coordenadas temporais
n = np.zeros((len(t), len(x))) #matriz com a densidade n(x,t)
#fazemos o plasma inicialmente concentrado em uma regiao
for i in range(int(len(x)/4),int(3*len(x)/4)):
n[0,i] = 1
plt.plot(x,n[0]) #plota estado inicial da funcao
plt.title(r'$\nu_a=$'+str(nu_a)+' $D_a=$'+str(Da))
plt.xlabel('L')
plt.ylabel('n(x)')
plt.ylim([0,1.1])
plt.xlim([0,L])
plt.text(8,0.9,'T = 0.0')
plt.savefig('n_0.png')
plt.clf()
#calculamos o próximo passo considerando dn/dt = 0 inicialmente
for i in range(1,len(x)-1):
n[1,i] = 0.5*(2*(1-s)*n[0,i] + s*(n[0,i+1] + n[0,i-1]))
#calculamos a posterior evolucao
for k in range(1, len(t)-1):
for i in range(1,len(x)-1): #isso fixa os contornos em 0
n[k+1,i] = (1/(1+h*dt))*(2*(1-s)*n[k,i] - (1-h*dt)*n[k-1,i] + s*(n[k,i+1] + n[k,i-1]))
if k*dt - int(k*dt) == 0: #plota figuras para valores inteiros de t
plt.plot(x,n[k])
plt.title(r'$\nu_a=$'+str(nu_a)+' $D_a=$'+str(Da))
plt.xlabel('L')
plt.ylabel('n(x)')
plt.xlim([0,L])
plt.ylim([0,1.1])
plt.text(8,0.9,'T = '+str(k*dt))
plt.savefig('n_'+str(int(k*dt))+'.png')
plt.clf()
#criamos gifs usando os plots
images = []
for k in range(T):
images.append(imageio.imread('n_'+str(k)+'.png'))
imageio.mimsave('difusao_ambipolar_'+str(nu_a)+'_'+str(Da)+'.gif', images, format='GIF', duration=1./10)
O código para as condições de contorno periódicas é levemente diferente, exigindo o acrécimo de duas duas linhas dentro do terceiro loop. Vale notar que aqui não nos preocupamos com o contorno no cáculo de porque a função nos contornos é 0 nos primeiros passos, independente de adotarmos ou não contornos periódicos.
import numpy as np
import matplotlib.pyplot as plt
import imageio
dt = 0.01
dx = 0.1
L = 10
T = 50
#constantes do plasma
nu_a = 0.1
Da = 0.5
#constantes para a eq da onda
c = np.sqrt(nu_a*Da)
h = nu_a/2
s = (c*dt/dx)**2
x = np.linspace(0, L, int(L/dx)) #array com as coordenadas espaciais
t = np.linspace(0, T, int(T/dt)) #array com as coordenadas temporais
n = np.zeros((len(t), len(x))) #matriz com a densidade n(x,t)
#fazemos o plasma inicialmente concentrado em uma regiao
for i in range(int(len(x)/4),int(3*len(x)/4)):
n[0,i] = 1
plt.plot(x,n[0]) #plota estado inicial da funcao
plt.title(r'$\nu_a=$'+str(nu_a)+' $D_a=$'+str(Da))
plt.xlabel('L')
plt.ylabel('n(x)')
plt.ylim([0,1.1])
plt.xlim([0,L])
plt.text(8,0.9,'T = 0.0')
plt.savefig('n_0.png')
plt.clf()
#calculamos o próximo passo considerando dn/dt = 0 inicialmente
for i in range(1,len(x)-1):
n[1,i] = 0.5*(2*(1-s)*n[0,i] + s*(n[0,i+1] + n[0,i-1]))
#calculamos a posterior evolucao
for k in range(1, len(t)-1):
for i in range(1,len(x)-1):
n[k+1,i] = (1/(1+h*dt))*(2*(1-s)*n[k,i] - (1-h*dt)*n[k-1,i] + s*(n[k,i+1] + n[k,i-1]))
#condicoes de contorno periodicas
n[k+1,0] = (1/(1+h*dt))*(2*(1-s)*n[k,0] - (1-h*dt)*n[k-1,0] + s*(n[k,1] + n[k,-1]))
n[k+1,-1] = (1/(1+h*dt))*(2*(1-s)*n[k,-1] - (1-h*dt)*n[k-1,-1] + s*(n[k,0] + n[k,-2]))
if k*dt - int(k*dt) == 0: #plota figuras para valores inteiros de t
plt.plot(x,n[k])
plt.title(r'$\nu_a=$'+str(nu_a)+' $D_a=$'+str(Da))
plt.xlabel('L')
plt.ylabel('n(x)')
plt.xlim([0,L])
plt.ylim([0,1.1])
plt.text(8,0.9,'T = '+str(k*dt))
plt.savefig('n_'+str(int(k*dt))+'.png')
plt.clf()
#criamos gifs usando os plots
images = []
for k in range(T):
images.append(imageio.imread('n_'+str(k)+'.png'))
imageio.mimsave('difusao_ambipolar_'+str(nu_a)+'_'+str(Da)+'PBC.gif', images, format='GIF', duration=1./10)