Case with Diko's peak

So I'd to make some changes to the Newton iterative method, but it's
working now. It's not giving noise, it converges, and with these
conditions the case reproduces the Diko's peak.
This commit is contained in:
Jorge Gonzalez 2024-10-01 21:00:44 +02:00
commit 0cfbdd2d07

View file

@ -307,6 +307,8 @@ program plasmaExpansion
real(dp):: Temp_bc ! Temperature real(dp):: Temp_bc ! Temperature
real(dp):: Temp0, TempF real(dp):: Temp0, TempF
real(dp):: Zave_bc ! Average charge state
real(dp):: Zave0, ZaveF
real(dp):: n_ecr ! Electron critical density for the laser real(dp):: n_ecr ! Electron critical density for the laser
real(dp):: c_s ! Ion sound speed real(dp):: c_s ! Ion sound speed
real(dp):: u_bc ! Injection velocity real(dp):: u_bc ! Injection velocity
@ -352,12 +354,14 @@ 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 = 10.0_dp * eV_to_K / Temp_ref
Zave0 = 12.0_dp
ZaveF = 3.0_dp
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(Zave0 * gam * Temp0)
u_bc0 = c_s!sqrt(Temp0) u_bc0 = c_s!sqrt(Temp0)
u_bcF = sqrt(TempF) u_bcF = sqrt(TempF)
n_bc0 = n_ecr / T_to_Z(Temp0) n_bc0 = n_ecr / Zave0
n_bcF = n_bc0!n_ecr*1.0e-1 / T_to_Z(Temp0) n_bcF = 1.0e-1*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
@ -487,19 +491,22 @@ program plasmaExpansion
! Main loop ! Main loop
Temp_bc = Temp0 Temp_bc = Temp0
Zave_bc = Zave0
u_bc = u_bc0 u_bc = u_bc0
n_bc = n_bc0 n_bc = n_bc0
do t = 1, nt do t = 1, nt
if (t > t_bc0 .and. t <= t_bcF) then if (t > t_bc0 .and. t <= t_bcF) then
Temp_bc = (TempF - Temp0) / float(t_bcF - t_bc0)*(t - t_bc0) + Temp0 Temp_bc = (TempF - Temp0) / float(t_bcF - t_bc0)*(t - t_bc0) + Temp0
Zave_bc = (ZaveF - Zave0) / float(t_bcF - t_bc0)*(t - t_bc0) + Zave0
u_bc = (u_bcF - u_bc0) / float(t_bcF - t_bc0)*(t - t_bc0) + u_bc0 u_bc = (u_bcF - u_bc0) / float(t_bcF - t_bc0)*(t - t_bc0) + u_bc0
n_bc = (n_bcF - n_bc0) / float(t_bcF - t_bc0)*(t - t_bc0) + n_bc0 n_bc = (n_bcF - n_bc0) / float(t_bcF - t_bc0)*(t - t_bc0) + n_bc0
else if (t > t_bcF) then else if (t > t_bcF) then
Temp_bc = TempF Temp_bc = TempF
Zave_bc = ZaveF
u_bc = u_bcF u_bc = u_bcF
n_bc = n_bcF n_bc = n_bcF
end if end if
call writeOutputBoundary(t, dt, n_bc, u_bc, Temp_bc, T_to_Z(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) = v(j0:nv)**2 / sqrt(PI*Temp_bc**3) * exp(-(v(j0:nv) - u_bc)**2 / Temp_bc)
f0 = f0 * n_bc / (sum(f0)*dv) f0 = f0 * n_bc / (sum(f0)*dv)
@ -508,7 +515,7 @@ program plasmaExpansion
f_i_old(1,j0:nv) = f0 f_i_old(1,j0:nv) = f0
f_i(1,j0:nv) = f_i_old(1,j0:nv) f_i(1,j0:nv) = f_i_old(1,j0:nv)
T_i(1) = Temp_bc T_i(1) = Temp_bc
Zave(1) = T_to_Z(Temp_bc) Zave(1) = Zave_bc
! r = rf, v<0 ! r = rf, v<0
f_i_old(nr,1:j0-1) = 0.0_dp f_i_old(nr,1:j0-1) = 0.0_dp
f_i(nr,1:j0-1) = f_i_old(nr,1:j0-1) f_i(nr,1:j0-1) = f_i_old(nr,1:j0-1)
@ -534,7 +541,7 @@ program plasmaExpansion
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
Zave(i) = T_to_Z(T_i(i)) Zave(i) = Zave_bc
else else
u_i(i) = 0.0_dp u_i(i) = 0.0_dp
@ -574,7 +581,7 @@ program plasmaExpansion
! 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 + 1.0e-1_dp*Res
! phi0=phi(1) ! phi0=phi(1)
! Calculate distribution of electrons ! Calculate distribution of electrons