Ionization
The ionization package extends RIOT to partially ionized plasmas with a two-temperature (2T) description in which the ions and free electrons carry separate temperatures and internal energies. Each material must supply a separate electron equation of state.
Enabling ionization does two distinct things, and the organization of this chapter follows that split. First, it establishes the 2T plasma state: the mean ionization state \(\bar{Z}\), the free-electron number density \(n_e\), and a separate electron energy and temperature \(T_e\) alongside the ion temperature \(T_i\). No other package produces these quantities. Second, it provides a family of optional transport processes defined on that state — electron–ion energy exchange, electron and ion thermal conduction, and ion viscosity. These share a common character: each is an independent physical process with its own governing equation, but each closes on the same plasma variables (\(n_e\), \(T_e\), \(T_i\), \(\bar{Z}\)), which is why they live in one package and one input block rather than in separate packages. Each is turned on by its own switch in the <ionization> block and, having no plasma state to act on otherwise, requires ionization to be enabled.
The subsections below treat the state-defining physics first (energy/pressure splitting and the mean ionization state), then each transport process in turn, each with the specific equation it solves.
Governing Equations
Energy and Pressure Splitting
Ionization is a per-material property closed on a shared electron temperature. Each material \(m\) carries its own mean ionization state \(\bar{Z}_m\), electron internal energy \(u_{e,m}\), and electron pressure \(p_{e,m}\); these aggregate to bulk electron quantities that split the bulk energy and pressure,
Here \(u_i\), \(u_e\) are the bulk ion and electron internal-energy densities and \(p_i\), \(p_e\) the corresponding bulk pressures. Following the aggregation rules of Section Per-Material and Bulk Quantities, the bulk electron energy is a cell-averaged sum of per-material electron energy densities while the bulk electron pressure is a volume-fraction-weighted sum,
with each material’s electron specific energy \(e_{e,m}\) and pressure \(p_{e,m}\) supplied by its own electron equation of state.
Crucially, the electron temperature \(T_e\) is a single bulk quantity shared by all materials: it is found by a root solve enforcing that the per-material electron energies sum to the transported bulk electron energy,
which is the electron-side analogue of the PTE temperature equilibrium.
Electron Energy Transport
By default the electron internal energy is advected with the flow and does \(p\,\mathrm{d}V\) work against the electron pressure,
Alternatively the package can instead advance a conserved electron entropy density \(s_e\) (which assumes an ideal electron gas and avoids the volumetric work source),
converting between \(s_e\) and \(u_e\) as needed. The choice is controlled by advect_electron_entropy.
Electron–Ion Energy Exchange
When electron_ion_coupling is enabled, the (bulk) electron and ion temperatures relax toward a common value on a coupling time scale \(\tau_{ei}\),
integrated with a first-order exponential (analytic) update so the equilibrium \(T_e = T_i\) is recovered stably for any step size. In a mixed cell the heat capacities \(\rho c_{v,i}\), \(\rho c_{v,e}\) and the coupling rate are formed as volume-fraction-weighted sums over the per-material contributions (evaluated at \(T_e\), \(T_i\) and each material’s \(\rho_m\), \(\bar{Z}_m\)), so a single bulk relaxation represents the whole cell. The coupling time may be a user-supplied constant (tau_ei) or the Landau–Spitzer form (Blancard et al., High Energy Density Phys. 9, 247, 2013),
with the Coulomb logarithm \(\ln\Lambda\) selected by coulomb_logarithm.
Mean Ionization State
The mean ionization state is computed per material: for each material \(m\), \(\bar{Z}_m\) is evaluated from the Thomas–Fermi statistical model with the fit of More (UCRL-84991, 1981; see Salzmann, Atomic Physics in Hot Plasmas, 1998), using that material’s atomic number \(Z_{\text{nuc},m}\), atomic mass, and material-averaged density \(\rho_m\), evaluated at the shared bulk electron temperature \(T_e\),
The per-material ionization states set the free-electron number density \(n_e = \sum_m \bar\rho_m\,\bar{Z}_m/m_{\text{nuc},m}\). Setting fully_ionized forces \(\bar{Z}_m = Z_{\text{nuc},m}\).
Thermal Conduction
Optionally, electron and/or ion heat conduction are solved as implicit diffusion equations on the shared bulk temperature,
using a BiCGSTAB linear solve. In a mixed cell the effective conductivity is a volume-fraction average (arithmetic or harmonic, selectable) of the per-material conductivities \(\kappa_m\), each evaluated at the shared bulk temperature with that material’s \(\rho_m\) and \(\bar{Z}_m\). The per-material electron conductivity \(\kappa_{e,m}\) defaults to the Spitzer–Härm form (Molvig, Simakov & Vold, Phys. Plasmas 21, 092709, 2014),
and the per-material ion conductivity \(\kappa_{i,m}\) to the Braginskii form. Either may instead be set to a constant.
Plasma Viscosity
Optionally (plasma_viscosity), an ion viscous stress \(\mathsf{\sigma}_{\text{visc}}\) is added to the bulk momentum and total-energy equations of Chapter Hydrodynamics as a divergence source,
so momentum diffuses and the associated viscous dissipation heats the fluid. The stress is Newtonian in the (bulk) strain rate \(\mathsf{e}\) (Chapter Material Strength),
with \(\eta\) the shear viscosity and \(\eta_b\) the bulk viscosity. The shear viscosity is set by ion_viscosity_model: either a user-supplied constant (ion_shear_viscosity, ion_bulk_viscosity), or the Fokker–Planck–Landau plasma model (Arnault, High Energy Density Phys. 9, 711, 2013; Vold et al., Phys. Plasmas 24, 042702, 2017),
where the ion–ion momentum-exchange rates \(\nu_{ij}\) are summed over the ion species in the cell, \(n_i\) is the ion number density, and \(T_i\) the ion temperature. This is a bulk (whole-cell) transport coefficient built from the per-material ion states, in the same spirit as the conductivities above.
Input Parameters
Ionization is enabled with the ionization toggle in the <physics> block (Section Enabling Physics: the <physics> Block). When it is on, every material must provide an electron_eos block (Chapter Materials and Equations of State). The remaining controls live in the <ionization> block.
Parameter |
Type |
Default |
Description |
|---|---|---|---|
fully_ionized |
bool |
|
Force \(\bar{Z} = Z_{\text{nuc}}\) (fully ionized). |
root_tol |
Real |
|
Root-find tolerance for the electron temperature. |
advect_electron_entropy |
bool |
|
Advect electron entropy density instead of solving the electron energy with a \(p\,\mathrm{d}V\) source. |
electron_ion_coupling |
bool |
|
Relax \(T_e\) and \(T_i\) toward equilibrium. |
electron_ion_coupling_model |
string |
|
Coupling model: |
tau_ei |
Real |
|
Constant coupling time (used when model is |
coulomb_logarithm |
string |
|
\(\ln\Lambda\) model: |
electron_thermal_conduction |
bool |
|
Solve electron heat conduction. |
electron_conductivity_model |
string |
|
Electron conductivity model (Spitzer variants or |
electron_conductivity |
Real |
|
Constant electron conductivity (if selected). |
ion_thermal_conduction |
bool |
|
Solve ion heat conduction. |
ion_conductivity_model |
string |
|
Ion conductivity model: |
ion_conductivity |
Real |
|
Constant ion conductivity (if selected). |
plasma_viscosity |
bool |
|
Add the ion viscous stress to the momentum and energy equations. |
ion_viscosity_model |
string |
|
Viscosity model: |
ion_shear_viscosity |
Real |
|
Constant shear viscosity \(\eta\) (if model is |
ion_bulk_viscosity |
Real |
|
Constant bulk viscosity \(\eta_b\) (if model is |
timestep_control |
string |
|
Conduction step control: |
T_scale_floor |
Real |
|
Temperature-scale floor for |
fractional_change_scale |
Real |
|
Allowed fractional \(T_e\) change per conduction step. |
zbar_floor |
Real |
|
Floor on \(\bar{Z}\) in microphysics evaluations. |
ion_number_density_floor |
Real |
|
Floor on ion number density (cm\(^{-3}\)). |
Registered Fields
The ionization package registers the bulk electron fields in the table below, and (through the materials package) the per-material \(\bar{Z}\) and electron-energy fields. The transported electron quantity is either electron_internal_energy (the default) or, when advect_electron_entropy is set, electron_entropy; the remaining bulk electron fields are derived. The implicit conduction solve additionally allocates operator-split auxiliary fields (diffusion coefficients, temperature deltas) that are internal to the solver and omitted here.
Field |
Symbol |
Components |
Metadata / description |
|---|---|---|---|
ccbulk::electron_internal_energy |
\(u_e\) |
1 |
Cell, Independent, Intensive, FillGhost, Advected, WithFluxes; electron energy density (default transported quantity). |
ccbulk::electron_entropy |
\(s_e\) |
1 |
Cell, Independent, Intensive, FillGhost, Advected, WithFluxes, Conserved; electron entropy density (when |
ccbulk::electron_temperature |
\(T_e\) |
1 |
Cell, Intensive, Derived, OneCopy; electron temperature. |
ccbulk::electron_pressure |
\(p_e\) |
1 |
Cell, Intensive, Derived, OneCopy; electron pressure. |
ccbulk::electron_number_density |
\(n_e\) |
1 |
Cell, Intensive, Derived, OneCopy; free-electron number density. |
ccbulk::electron_bulk_modulus |
\(B_e\) |
1 |
Cell, Intensive, Derived, OneCopy; electron bulk modulus. |
ccbulk::electron_gruneisen_parameter |
\(\Gamma_e\) |
1 |
Cell, Intensive, Derived, OneCopy; electron Grüneisen parameter. |
ccbulk::ion_shear_viscosity |
\(\eta\) |
1 |
Cell, Intensive, Derived, OneCopy; ion shear viscosity (when |
cm::ionization_zbar |
\(\bar{Z}\) |
1 |
Cell, Sparse, Derived, OneCopy, FillGhost; per-material mean ionization state. |
Example
A single ionized material with electron–ion coupling and electron conduction:
riot.input("physics", ionization=True)
riot.input("ionization",
electron_ion_coupling=True,
electron_ion_coupling_model="landau_spitzer",
coulomb_logarithm="brysk",
electron_thermal_conduction=True)
riot.input("material0", label="plasma",
eos_type="IdealGas", Gamma=1.66667, Cv=1.0e12,
electron_eos="plasma_electrons")
riot.input("plasma_electrons", eos_type="IdealElectrons")