Trying to implement floating potential
These things are never easy.
This commit is contained in:
parent
8eab3b5610
commit
c39e9ab3fc
5 changed files with 38 additions and 27 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,4 @@
|
||||||
plasmaExpansion
|
plasmaExpansion
|
||||||
|
*.pyc
|
||||||
*.csv
|
*.csv
|
||||||
*.mod
|
*.mod
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ module output
|
||||||
integer, parameter:: dataF_id = 30
|
integer, parameter:: dataF_id = 30
|
||||||
integer, parameter:: dataPhi_id = 40
|
integer, parameter:: dataPhi_id = 40
|
||||||
integer, parameter:: dataCum_id = 50
|
integer, parameter:: dataCum_id = 50
|
||||||
character(len=7), parameter:: formatFloat = 'ES0.4e3'
|
character(len=7), parameter:: formatFloat = 'ES0.6e3'
|
||||||
character(len=3), parameter:: formatSep = '","'
|
character(len=3), parameter:: formatSep = '","'
|
||||||
character(len=7):: formatTime
|
character(len=7):: formatTime
|
||||||
|
|
||||||
|
|
@ -103,7 +103,7 @@ module output
|
||||||
|
|
||||||
end subroutine writeOutputF
|
end subroutine writeOutputF
|
||||||
|
|
||||||
subroutine writeOutputPhi(t, dt, nr, r, phi, n_e)
|
subroutine writeOutputPhi(t, dt, nr, r, phi, E, n_e)
|
||||||
use constantParameters, only: eV_to_K
|
use constantParameters, only: eV_to_K
|
||||||
use referenceValues, only: L_ref, phi_ref, t_ref, n_ref
|
use referenceValues, only: L_ref, phi_ref, t_ref, n_ref
|
||||||
|
|
||||||
|
|
@ -112,6 +112,7 @@ module output
|
||||||
real(dp), intent(in):: dt
|
real(dp), intent(in):: dt
|
||||||
real(dp), intent(in):: r(1:nr)
|
real(dp), intent(in):: r(1:nr)
|
||||||
real(dp), intent(in):: phi(1:nr)
|
real(dp), intent(in):: phi(1:nr)
|
||||||
|
real(dp), intent(in):: E(1:nr)
|
||||||
real(dp), intent(in):: n_e(1:nr)
|
real(dp), intent(in):: n_e(1:nr)
|
||||||
character(:), allocatable:: filename
|
character(:), allocatable:: filename
|
||||||
integer:: i
|
integer:: i
|
||||||
|
|
@ -124,11 +125,12 @@ module output
|
||||||
open(unit=dataPhi_id, file=pathOutput//filename)
|
open(unit=dataPhi_id, file=pathOutput//filename)
|
||||||
write(dataPhi_id, '(A)') "t (s)"
|
write(dataPhi_id, '(A)') "t (s)"
|
||||||
write(dataPhi_id, '('//formatFloat//')') t*dt*t_ref
|
write(dataPhi_id, '('//formatFloat//')') t*dt*t_ref
|
||||||
write(dataPhi_id, '(A,2('//formatSep//',A))') "r (m)","phi (V)","n_e (m^-3)"
|
write(dataPhi_id, '(A,3('//formatSep//',A))') "r (m)","phi (V)","E (V m^-1)","n_e (m^-3)"
|
||||||
do i = 1, nr
|
do i = 1, nr
|
||||||
write(dataPhi_id, '('//formatFloat//',2('//formatSep //','//formatFloat//'))') &
|
write(dataPhi_id, '('//formatFloat//',3('//formatSep //','//formatFloat//'))') &
|
||||||
r(i)*L_ref, &
|
r(i)*L_ref, &
|
||||||
phi(i)*phi_ref, &
|
phi(i)*phi_ref, &
|
||||||
|
E(i)*phi_ref/L_ref, &
|
||||||
n_e(i)*n_ref
|
n_e(i)*n_ref
|
||||||
|
|
||||||
end do
|
end do
|
||||||
|
|
@ -328,7 +330,7 @@ program plasmaExpansion
|
||||||
|
|
||||||
real(dp), allocatable, dimension(:):: phi, phi_old, E
|
real(dp), allocatable, dimension(:):: phi, phi_old, E
|
||||||
real(dp):: phiConv
|
real(dp):: phiConv
|
||||||
real(dp):: phi0
|
real(dp):: phi0, phiF, JF
|
||||||
integer:: k
|
integer:: k
|
||||||
|
|
||||||
real(dp), allocatable, dimension(:):: fCum_i
|
real(dp), allocatable, dimension(:):: fCum_i
|
||||||
|
|
@ -352,17 +354,17 @@ program plasmaExpansion
|
||||||
|
|
||||||
! Set input parameters (remember these have to be in non-dimensional units)
|
! Set input parameters (remember these have to be in non-dimensional units)
|
||||||
Temp0 = 60.0_dp * eV_to_K / Temp_ref
|
Temp0 = 60.0_dp * eV_to_K / Temp_ref
|
||||||
TempF = 10.0_dp * eV_to_K / Temp_ref
|
TempF = 60.0_dp * eV_to_K / Temp_ref
|
||||||
n_ecr = 1.0e19_dp * cm3_to_m3 / n_ref
|
n_ecr = 1.0e19_dp * cm3_to_m3 / n_ref
|
||||||
c_s = sqrt(T_to_Z(Temp0) * gam * Temp0)
|
c_s = sqrt(T_to_Z(Temp0) * gam * Temp0)
|
||||||
u_bc0 = sqrt(Temp0)
|
u_bc0 = sqrt(Temp0)
|
||||||
u_bcF = sqrt(TempF)
|
u_bcF = sqrt(TempF)
|
||||||
n_bc0 = n_ecr / T_to_Z(Temp0)
|
n_bc0 = n_ecr / T_to_Z(Temp0)
|
||||||
n_bcF = n_ecr*1.0e-1 / T_to_Z(Temp0)
|
n_bcF = n_bc0!n_ecr*1.0e-1 / T_to_Z(Temp0)
|
||||||
|
|
||||||
! Set domain boundaries (non-dimensional units)
|
! Set domain boundaries (non-dimensional units)
|
||||||
r0 = 200.0e-6_dp / L_ref
|
r0 = 200.0e-6_dp / L_ref
|
||||||
rf = 1.0e-2_dp / L_ref
|
rf = 6.0e-3_dp / L_ref
|
||||||
dr = 1.0e3_dp
|
dr = 1.0e3_dp
|
||||||
nr = nint((rf - r0) / dr) + 1
|
nr = nint((rf - r0) / dr) + 1
|
||||||
dr = (rf - r0) / float(nr-1)
|
dr = (rf - r0) / float(nr-1)
|
||||||
|
|
@ -470,8 +472,9 @@ program plasmaExpansion
|
||||||
! Set boundary values
|
! Set boundary values
|
||||||
! phi0 = 0.0_dp / phi_ref ! Dirichlet
|
! phi0 = 0.0_dp / phi_ref ! Dirichlet
|
||||||
! phi(1) = phi0 ! Dirichlet
|
! phi(1) = phi0 ! Dirichlet
|
||||||
phi0 = phi(1) ! Neumann
|
phi0 = phi(1) ! Neumann
|
||||||
phi(nr) = 0.0_dp ! Dirichlet
|
phiF = 0.0_dp ! Dirichlet
|
||||||
|
JF = 0.0_dp ! Current at the edge for floating potential
|
||||||
allocate(f0(j0:nv))
|
allocate(f0(j0:nv))
|
||||||
f0 = 0.0_dp
|
f0 = 0.0_dp
|
||||||
|
|
||||||
|
|
@ -481,7 +484,7 @@ program plasmaExpansion
|
||||||
t = 0
|
t = 0
|
||||||
call writeOutputRef()
|
call writeOutputRef()
|
||||||
call writeOutputF(t, dt, nr, r, nv, v, f_i_old)
|
call writeOutputF(t, dt, nr, r, nv, v, f_i_old)
|
||||||
call writeOutputPhi(t, dt, nr, r, phi, n_e)
|
call writeOutputPhi(t, dt, nr, r, phi, E, n_e)
|
||||||
call writeOutputMom(t, dt, nr, r, n_i, u_i, T_i, Zave)
|
call writeOutputMom(t, dt, nr, r, n_i, u_i, T_i, Zave)
|
||||||
|
|
||||||
! Main loop
|
! Main loop
|
||||||
|
|
@ -528,7 +531,7 @@ program plasmaExpansion
|
||||||
end if
|
end if
|
||||||
|
|
||||||
n_i(i) = sum(f_i(i,:)*dv)
|
n_i(i) = sum(f_i(i,:)*dv)
|
||||||
if (n_i(i) > 0.0_dp) then
|
if (n_i(i) > 1.0e-10_dp) then
|
||||||
u_i(i) = sum(v(:) *f_i(i,:)*dv) / n_i(i)
|
u_i(i) = sum(v(:) *f_i(i,:)*dv) / n_i(i)
|
||||||
E_i(i) = sum(v(:)**2*f_i(i,:)*dv) / n_i(i)
|
E_i(i) = sum(v(:)**2*f_i(i,:)*dv) / n_i(i)
|
||||||
T_i(i) = 2.0_dp*E_i(i) - 2.0_dp*u_i(i)**2
|
T_i(i) = 2.0_dp*E_i(i) - 2.0_dp*u_i(i)**2
|
||||||
|
|
@ -544,7 +547,7 @@ program plasmaExpansion
|
||||||
!$omp end parallel do
|
!$omp end parallel do
|
||||||
|
|
||||||
! Solve Poission (maximum number of iterations, break if convergence is reached before)
|
! Solve Poission (maximum number of iterations, break if convergence is reached before)
|
||||||
do k = 1, 200
|
do k = 1, 100
|
||||||
! Store previous value
|
! Store previous value
|
||||||
phi_old = phi
|
phi_old = phi
|
||||||
|
|
||||||
|
|
@ -566,20 +569,25 @@ program plasmaExpansion
|
||||||
b = -(Zave*n_i - n_e)
|
b = -(Zave*n_i - n_e)
|
||||||
! Apply boundary conditions
|
! Apply boundary conditions
|
||||||
! b(1) = phi0 ! Dirichlet
|
! b(1) = phi0 ! Dirichlet
|
||||||
b(nr) = 0.0_dp ! Dirichlet
|
b(nr) = phiF ! Dirichlet
|
||||||
|
|
||||||
! Calculate residual
|
! Calculate residual
|
||||||
!$omp parallel workshare
|
!$omp parallel workshare
|
||||||
Res = -(MATMUL(A, phi_old) - b)
|
Res = -(MATMUL(A, phi_old) - b)
|
||||||
!$omp end parallel workshare
|
!$omp end parallel workshare
|
||||||
! Res(1) = 0.0_dp ! Dirichlet
|
|
||||||
Res(nr) = 0.0_dp ! Dirichlet
|
|
||||||
|
|
||||||
! Iterate system
|
! Iterate system
|
||||||
call dgtsv(nr, 1, diag_low, diag, diag_high, Res, nr, info)
|
call dgtsv(nr, 1, diag_low, diag, diag_high, Res, nr, info)
|
||||||
phi = phi_old + Res
|
phi = phi_old + Res
|
||||||
phi0 = phi(1) ! Neumann
|
phi(1) = phi(2) ! Neumann
|
||||||
phi(nr-10:nr) = phi(nr-11)
|
phi0 = phi(1) ! Neumann
|
||||||
|
! phi(nr) = phi(nr-5) ! Dirichlet quasi-floating
|
||||||
|
|
||||||
|
! Calculate updated current
|
||||||
|
JF = Zave(nr)*n_i(nr)*u_i(nr) - n_e(nr)*sqrt(qe*T_i(1)*Temp_ref/9.1e-31_dp)/u_ref
|
||||||
|
|
||||||
|
! Iterate floating potential
|
||||||
|
phiF = phi(nr-5)! + 1.0e-2_dp*JF
|
||||||
|
|
||||||
! Check if the solution has converged
|
! Check if the solution has converged
|
||||||
phiConv = maxval(abs(Res),1)
|
phiConv = maxval(abs(Res),1)
|
||||||
|
|
@ -602,7 +610,6 @@ program plasmaExpansion
|
||||||
E(nr) = - (phi(nr) - phi(nr-1)) / dr ! Dirichlet
|
E(nr) = - (phi(nr) - phi(nr-1)) / dr ! Dirichlet
|
||||||
! E(nr) = 0.0_dp ! Neumann
|
! E(nr) = 0.0_dp ! Neumann
|
||||||
! Trick to avoid problems at the sheath
|
! Trick to avoid problems at the sheath
|
||||||
E(nr-5:nr) = 0.0_dp
|
|
||||||
|
|
||||||
! Update intermediate f
|
! Update intermediate f
|
||||||
f_i_old = f_i
|
f_i_old = f_i
|
||||||
|
|
@ -644,7 +651,7 @@ program plasmaExpansion
|
||||||
! Write output
|
! Write output
|
||||||
if (mod(t,everyOutput) == 0 .or. t == nt) then
|
if (mod(t,everyOutput) == 0 .or. t == nt) then
|
||||||
call writeOutputF(t, dt, nr, r, nv, v, f_i_old)
|
call writeOutputF(t, dt, nr, r, nv, v, f_i_old)
|
||||||
call writeOutputPhi(t, dt, nr, r, phi, n_e)
|
call writeOutputPhi(t, dt, nr, r, phi, E, n_e)
|
||||||
call writeOutputMom(t, dt, nr, r, n_i, u_i, T_i, Zave)
|
call writeOutputMom(t, dt, nr, r, n_i, u_i, T_i, Zave)
|
||||||
call writeOutputFCum(t, dt, r(rCum_index), nv, v, fCum_i)
|
call writeOutputFCum(t, dt, r(rCum_index), nv, v, fCum_i)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,9 @@ from scipy.constants import e, k
|
||||||
|
|
||||||
m_i = 1.9712e-25
|
m_i = 1.9712e-25
|
||||||
|
|
||||||
paths = ['../quasiNeutral_fullAblation/','../Poisson_fullAblation/']
|
# paths = ['../quasiNeutral_fullAblation/','../Poisson_fullAblation/']
|
||||||
# paths = ['../quasiNeutral_partialAblation/','../Poisson_partialAblation/']
|
# paths = ['../quasiNeutral_partialAblation/','../Poisson_partialAblation/']
|
||||||
|
paths = ['../2024-09-27_17.41.21/']
|
||||||
for path in paths:
|
for path in paths:
|
||||||
filesCum_i = sorted(glob.glob(path+'time_*_fCum_i.csv'))
|
filesCum_i = sorted(glob.glob(path+'time_*_fCum_i.csv'))
|
||||||
start = 0
|
start = 0
|
||||||
|
|
|
||||||
|
|
@ -8,23 +8,24 @@ from scipy.constants import e, k
|
||||||
|
|
||||||
# paths = ['../quasiNeutral_fullAblation/','../2024-09-26_11.48.04/']
|
# paths = ['../quasiNeutral_fullAblation/','../2024-09-26_11.48.04/']
|
||||||
# paths = ['../2024-09-26_12.47.11/']
|
# paths = ['../2024-09-26_12.47.11/']
|
||||||
paths = ['../quasiNeutral_partialAblation/','../2024-09-26_13.58.24/']
|
# paths = ['../quasiNeutral_partialAblation/','../2024-09-26_13.58.24/']
|
||||||
# path = '../quasiNeutral_fullAblation/'
|
# path = '../quasiNeutral_fullAblation/'
|
||||||
# path = '../quasiNeutral_partialAblatio/'
|
# path = '../quasiNeutral_partialAblatio/'
|
||||||
|
paths = ['../2024-09-27_17.41.21/']
|
||||||
|
|
||||||
for path in paths:
|
for path in paths:
|
||||||
filesPhi = sorted(glob.glob(path+'time_*_phi.csv'))
|
filesPhi = sorted(glob.glob(path+'time_*_phi.csv'))
|
||||||
filesMom_i = sorted(glob.glob(path+'time_*_mom_i.csv'))
|
filesMom_i = sorted(glob.glob(path+'time_*_mom_i.csv'))
|
||||||
start = 0
|
start = 0
|
||||||
end = len(filesMom_i)
|
end = len(filesMom_i)
|
||||||
every = 100
|
every = 50
|
||||||
fig, ax = plt.subplots(4, sharex='all')
|
fig, ax = plt.subplots(4, sharex='all')
|
||||||
for fileMom_i, filePhi in zip(filesMom_i[start:end+1:every], filesPhi[start:end+1:every]):
|
for fileMom_i, filePhi in zip(filesMom_i[start:end+1:every], filesPhi[start:end+1:every]):
|
||||||
time, r, phi, n_e = readPhi.read(filePhi)
|
time, r, phi, E, n_e = readPhi.read(filePhi)
|
||||||
time, r, n_i, u_i, T_i, Zave = readMom.read(fileMom_i)
|
time, r, n_i, u_i, T_i, Zave = readMom.read(fileMom_i)
|
||||||
|
|
||||||
ax[0].plot(r, phi, label='t = {:.3f} ns'.format(time*1e9))
|
# ax[0].plot(r, phi, label='t = {:.3f} ns'.format(time*1e9))
|
||||||
|
ax[0].plot(r, E, label='t = {:.3f} ns'.format(time*1e9))
|
||||||
ax[1].set_yscale('log')
|
ax[1].set_yscale('log')
|
||||||
ax[1].set_ylim([1e14,2e25])
|
ax[1].set_ylim([1e14,2e25])
|
||||||
ax[1].plot(r, Zave*n_i)
|
ax[1].plot(r, Zave*n_i)
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,9 @@ def read(filename):
|
||||||
df = pandas.read_csv(filename,skiprows=2)
|
df = pandas.read_csv(filename,skiprows=2)
|
||||||
x = df['r (m)'].to_numpy()
|
x = df['r (m)'].to_numpy()
|
||||||
phi = df['phi (V)'].to_numpy()
|
phi = df['phi (V)'].to_numpy()
|
||||||
|
E = df['E (V m^-1)'].to_numpy()
|
||||||
n_e = df['n_e (m^-3)'].to_numpy()
|
n_e = df['n_e (m^-3)'].to_numpy()
|
||||||
|
|
||||||
return time, x, phi, n_e
|
return time, x, phi, E, n_e
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue