Corrections to tag v2.5

Small set of corrections to the tag v2.5.

Includes changes to python scripts to plot data.

Includes new 'fast' setup conditions that allow to output cases in an
hour or so with still a good CFL condition and grid resolution.
This commit is contained in:
Jorge Gonzalez 2025-04-08 16:32:59 +02:00
commit 052a4dc05e
20 changed files with 790 additions and 107 deletions

View file

@ -37,6 +37,7 @@ program VlaPlEx
real(dp), parameter:: gamma_e = 4.0_dp / 3.0_dp ! Adiabatic coefficient for electrons
real(dp), parameter:: gamma_e_exp = 1.0_dp /(gamma_e - 1.0_dp) ! Exponent for polytropic electrons
real(dp), parameter:: gamma_e_dexp = (2.0_dp - gamma_e)/(gamma_e - 1.0_dp) ! Exponent for polytropic db_dphi
real(dp), parameter:: n_epsilon = 1.0e-16_dp
real(dp):: r0, rf
real(dp), allocatable, dimension(:):: r
@ -46,6 +47,7 @@ program VlaPlEx
real(dp):: time
real(dp):: dr, dv, dt
integer:: nr, nv, nt, nz
integer:: nzMin, nzMax
integer:: i, iz, j, t, z_inj
integer:: j0 ! First integer of positive velocity
@ -89,7 +91,7 @@ program VlaPlEx
integer:: rCum_index
! Set number of threads
call omp_set_num_threads(8)
call omp_set_num_threads(16)
! Set reference numbers (in SI units)
Temp_ref = 30.0_dp * eV_to_K
@ -126,9 +128,9 @@ program VlaPlEx
! Index for cumulative sum
rCum_index = minloc(abs(r - rCum), 1)
v0 =-1.0e1_dp*c_s
vf = 2.0e1_dp*c_s
dv = 1.0e-1_dp
v0 =-0.5e1_dp*c_s
vf = 1.0e1_dp*c_s
dv = 2.0e-1_dp
nv = nint((vf - v0) / dv) + 1
dv = (vf - v0) / float(nv-1)
@ -146,7 +148,7 @@ program VlaPlEx
t0 = 0.0_dp
tf = 2.0e-7_dp / t_ref
! tf = 1.0e1_dp * (rf - r0) / c_s
dt = 1.0e-2_dp*dr/c_s
dt = 5.0e-2_dp*dr/c_s
nt = nint((tf - t0) / dt)
dt = (tf - t0) / float(nt)
@ -164,7 +166,10 @@ program VlaPlEx
write(*, '(A,ES0.4e3)') 'CFL: ', dt*vf/dr
nz = 2
nzMin = 3
nzMax = 14
nz = nzMax - nzMin + 1
nz = nz + 1 ! Add bin for low Z plasma
! Allocate vectors
allocate(f_i(1:nz,1:nr,1:nv), f_i_old(1:nz,1:nr,1:nv))
allocate(n_i(1:nz,1:nr))
@ -178,14 +183,17 @@ program VlaPlEx
f_i = 0.0_dp
f_i_old = 0.0_dp
n_i = 0.0_dp
sum_ni = 0.0_dp
sum_ni = 0.0_dp
u_i = 0.0_dp
E_i = 0.0_dp
T_i = 0.0_dp
n_e = 0.0_dp
T_e = 0.0_dp
Zave = 0.0_dp
Z_list = (/ 6.0, 12.0 /)
Z_list(1) = 1.0_dp ! Low Z bin
do iz = nzMin, nzMax
Z_list(iz-nzMin+1+1) = float(iz)
end do
Zave_bc_old = 0.0_dp
phi = 0.0_dp
phi_old = 0.0_dp
@ -247,18 +255,24 @@ program VlaPlEx
! Main loop
do t = 1, nt
time = t * dt + t0
! Find new \bar{Z}_i based on T and density
call boundaryConditions%get(time, n_bc, u_bc, Temp_bc)
! Reset previous value
Zave_bc_old = 0.0_dp
! Initial guess based on average table
call TtoZ%get(Temp_bc, Zave_bc)
z_inj = minloc(abs(Z_list - Zave_bc),1)
Zave_bc = Z_list(z_inj)
Zave_bc = Z_list(z_inj)
! Start iterative process based on T, n_e table
do while (Zave_bc - Zave_bc_old > 0.1_dp)
Zave_bc_old = Zave_bc
call TtoZne%get(Temp_bc, Zave_bc * n_bc, Zave_bc)
z_inj = minloc(abs(Z_list - Zave_bc),1)
Zave_bc = Z_list(z_inj)
Zave_bc = Z_list(z_inj)
end do
call writeOutputBoundary(t, dt, Zave_bc*n_bc, u_bc, Temp_bc, Zave_bc, Zave_bc)
u_bc = sqrt(Zave_bc * Temp_bc)
call writeOutputBoundary(t, dt, n_bc, u_bc, Temp_bc, Zave_bc)
! f0(j0:nv) = v(j0:nv)**2 / sqrt(PI*Temp_bc**3) * exp(-(v(j0:nv) - u_bc)**2 / Temp_bc)
f0(j0:nv) = 1.0_dp / sqrt(PI*Temp_bc) * exp(-(v(j0:nv) - u_bc)**2 / Temp_bc)
@ -279,7 +293,7 @@ program VlaPlEx
sum_ni = 0.0_dp
! Advect in the r direction
do iz = 1, nz
if (all(n_i(iz,:) < 1.0e-16_dp) .and. iz .NE. z_inj) then
if (all(n_i(iz,:) < n_epsilon) .and. iz .ne. z_inj) then
cycle
end if
!$omp parallel do
@ -296,13 +310,15 @@ program VlaPlEx
end if
n_i(iz,i) = sum(f_i(iz,i,:))*dv
if (n_i(iz,i) > 1.0e-10_dp) then
u_i(iz,i) = sum(v(:) *f_i(iz,i,:))*dv / n_i(iz,i)
E_i(i) = sum(v(:)**2*f_i(iz,i,:))*dv / n_i(iz,i)
T_i(iz,i) = 2.0_dp*E_i(i) - 2.0_dp*u_i(iz,i)**2
if (n_i(iz,i) > n_epsilon) then
u_i(iz,i) = sum(v(:) *f_i(iz,i,:))*dv / n_i(iz,i)
E_i(i) = sum(v(:)**2*f_i(iz,i,:))*dv / n_i(iz,i)
T_i(iz,i) = 2.0_dp*E_i(i) - 2.0_dp*u_i(iz,i)**2
else
u_i(iz,i) = 0.0_dp
T_i(iz,i) = 0.0_dp
f_i(iz,i,:) = 0.0_dp
n_i(iz,i) = 0.0_dp
u_i(iz,i) = 0.0_dp
T_i(iz,i) = 0.0_dp
end if
end do
@ -360,7 +376,7 @@ program VlaPlEx
end if
! ! Calculate new potential to ensure 0 current at the edge
! if (n_i(nr) > 1.0e-10_dp) then
! if (n_i(nr) > n_epsilon) then
! phiF = phi0 + T_e * log((2.0_dp*sqrt(pi)*Zave(nr)*n_i(nr)*u_i(nr)) / (Zave(1)*n_i(1)*sqrt(m_i*T_e/m_e)))
!
! else
@ -386,7 +402,7 @@ program VlaPlEx
f_i_old = f_i
do iz = 1, nz
if (all(n_i(iz,:) < 1.0e-16_dp) .and. iz .NE. z_inj) then
if (all(n_i(iz,:) < n_epsilon) .and. iz .ne. z_inj) then
cycle
end if
! Advect in the v direction
@ -423,14 +439,14 @@ program VlaPlEx
! Reset values for next iteration
f_i_old = f_i
do iz = 1, nz
if (all(n_i(iz,:) < 1.0e-16_dp) .and. iz .NE. z_inj) then
if (all(n_i(iz,:) < n_epsilon) .and. iz .ne. z_inj) then
cycle
end if
fCum_i(iz,:) = fCum_i(iz,:) + f_i_old(iz,rCum_index,:)
end do
! Write output
if (mod(t,everyOutput) == 0 .or. t == nt) then
call writeOutputF(t, dt, nz, nr, r, nv, v, f_i_old, Z_list)
! call writeOutputF(t, dt, nz, nr, r, nv, v, f_i_old, Z_list)
call writeOutputPhi(t, dt, nr, r, phi, E, n_e)
call writeOutputMom(t, dt, nz, nr, r, n_i, u_i, T_i, Z_list)
call writeOutputFCum(t, dt, nz, r(rCum_index), nv, v, fCum_i, Z_list)