something fishy with P_ion

This commit is contained in:
Benoît Sierro
2021-11-01 17:58:54 +01:00
parent 8659c6bca9
commit fe9fac6a8c
3 changed files with 31 additions and 8 deletions

View File

@@ -1,6 +1,7 @@
from typing import Union from typing import Union
import numpy as np import numpy as np
from scipy.integrate import cumulative_trapezoid
from scipy.special import jn_zeros from scipy.special import jn_zeros
from .cache import np_cache from .cache import np_cache
@@ -9,6 +10,11 @@ pi = np.pi
c = 299792458.0 c = 299792458.0
def inverse_integral_exponential(x: np.ndarray, y: np.ndarray) -> np.ndarray:
"""evaluates exp(-func(y)) from x=-inf to x"""
return np.exp(-cumulative_trapezoid(y, x, initial=0))
def span(*vec): def span(*vec):
"""returns the min and max of whatever array-like is given. can accept many args""" """returns the min and max of whatever array-like is given. can accept many args"""
out = (np.inf, -np.inf) out = (np.inf, -np.inf)

View File

@@ -1,8 +1,17 @@
from dataclasses import dataclass
import numpy as np import numpy as np
import scipy.special import scipy.special
from scipy.integrate import cumulative_trapezoid from scipy.integrate import cumulative_trapezoid
from .units import e, hbar, me from .units import e, hbar, me
from ..math import inverse_integral_exponential
@dataclass
class PlasmaInfo:
electron_density: np.ndarray
dn_dt: np.ndarray
polarization: np.ndarray
class IonizationRate: class IonizationRate:
@@ -12,7 +21,7 @@ class IonizationRate:
class IonizationRateADK(IonizationRate): class IonizationRateADK(IonizationRate):
def __init__(self, ionization_energy: float, atomic_number: int): def __init__(self, ionization_energy: float, atomic_number: int):
self.Z = -(atomic_number - 1) * e self.Z = (atomic_number - 1) * e
self.ionization_energy = ionization_energy self.ionization_energy = ionization_energy
self.omega_p = ionization_energy / hbar self.omega_p = ionization_energy / hbar
@@ -24,7 +33,8 @@ class IonizationRateADK(IonizationRate):
return e * np.abs(field) / np.sqrt(2 * me * self.ionization_energy) return e * np.abs(field) / np.sqrt(2 * me * self.ionization_energy)
def __call__(self, field: np.ndarray) -> np.ndarray: def __call__(self, field: np.ndarray) -> np.ndarray:
opt4 = 4 * self.omega_p / self.omega_t(field) ot = self.omega_t(field)
opt4 = 4 * self.omega_p / (ot + 1e-14 * ot.max())
return self.omega_pC * opt4 ** (2 * self.nstar - 1) * np.exp(-opt4 / 3) return self.omega_pC * opt4 ** (2 * self.nstar - 1) * np.exp(-opt4 / 3)
@@ -35,7 +45,7 @@ class Plasma:
self.atomic_number = atomic_number self.atomic_number = atomic_number
self.rate = IonizationRateADK(self.Ip, self.atomic_number) self.rate = IonizationRateADK(self.Ip, self.atomic_number)
def __call__(self, field: np.ndarray, N0: float) -> np.ndarray: def __call__(self, field: np.ndarray, N0: float) -> PlasmaInfo:
"""returns the number density of free electrons as function of time """returns the number density of free electrons as function of time
Parameters Parameters
@@ -50,13 +60,20 @@ class Plasma:
np.ndarray np.ndarray
number density of free electrons as function of time number density of free electrons as function of time
""" """
Ne = free_electron_density(self.t, field, N0, self.rate) # Ne = free_electron_density(self.t, field, N0, self.rate)
return cumulative_trapezoid( field_abs = np.abs(field)
np.gradient(Ne, self.t) * self.Ip / field delta = 1e-14 * field_abs.max()
+ e ** 2 / me * cumulative_trapezoid(Ne * field, self.t, initial=0), exp_int = inverse_integral_exponential(self.t, self.rate(field_abs))
electron_density = N0 * (1 - exp_int)
dn_dt = N0 * self.rate(field_abs) * exp_int
out = cumulative_trapezoid(
# np.gradient(self.density, self.t) * self.Ip / field
dn_dt * self.Ip / (field + delta)
+ e ** 2 / me * cumulative_trapezoid(electron_density * field, self.t, initial=0),
self.t, self.t,
initial=0, initial=0,
) )
return PlasmaInfo(electron_density, dn_dt, out)
def adiabadicity(w: np.ndarray, I: float, field: np.ndarray) -> np.ndarray: def adiabadicity(w: np.ndarray, I: float, field: np.ndarray) -> np.ndarray:

View File

@@ -14,7 +14,7 @@ R = 8.31446261815324
kB = 1.380649e-23 kB = 1.380649e-23
epsilon0 = 8.85418781e-12 epsilon0 = 8.85418781e-12
me = 9.1093837015e-31 me = 9.1093837015e-31
e = -1.602176634e-19 e = 1.602176634e-19
prefix = dict(P=1e12, G=1e9, M=1e6, k=1e3, d=1e-1, c=1e-2, m=1e-3, u=1e-6, n=1e-9, p=1e-12, f=1e-15) prefix = dict(P=1e12, G=1e9, M=1e6, k=1e3, d=1e-1, c=1e-2, m=1e-3, u=1e-6, n=1e-9, p=1e-12, f=1e-15)