Conductivity and induction

src/system/conductivity_terms.jl

Public

Runes2P.ConductivityModel — Type
ConductivityModel(plasma; reference=:braams_karney, kinetic=:none, operator=nothing,
                  pitch_rule=:linear)

The conductivity σ(r, t) = σ_reference − σ_kinetic of a term σ E in the equation of the ohmic current (ConductivityTerm). plasma is a PlasmaState or a function of time that returns one. model(t) gives the conductivity [S/m] per radius at the time t [s].

  • reference = :braams_karney: braams_karney_conductivity, which is DREAM's conductivity of Sauter and Redl in cylindrical geometry.
  • kinetic = :none: nothing is subtracted, for Ohm's law of a fluid, j_ohm = σ E.
  • kinetic = :dream_fit: DREAM's corrected conductivity of the fully kinetic mode. The ohmic current is the current of the distribution plus E (σ − F σ), with the fit F of the conductivity of the kinetic operator (test_particle_conductivity_fraction).
  • kinetic = :discrete_operator: the same with the conductivity of the discrete operator of the run in place of the fit (kinetic_conductivity). operator is the Fokker-Planck operator of the bulk or its term, and pitch_rule that of the current moment of the run: a system refuses a model whose rule differs from that of a CurrentMomentTerm in the same equation. The steady state of a small field then has the conductivity of the reference, whatever the grid and the collision settings are. On two grids the operator is that of the hot-tail grid. The equilibrium has the cold density of the plasma (kinetic_conductivity). With a plasma that changes in time the operator is a FokkerPlanckTerm with that plasma as its source, and every rebuild of its coefficients costs a sparse factorization of the bordered operator per radius. The field-particle operator is not an option here: a system with it takes no correction. Neither is a system whose terms read the temperature from an unknown: this model needs a prescribed plasma, and the system refuses a prescribed temperature next to the unknown. :dream_fit follows the unknown.

The correction is a statement on the steady state. While the distribution relaxes to the shape of the ohmic one, within collision times after a change of the field, the current of the distribution is below its steady value and the sum is below σ E.

A run with the momentum-conserving field-particle term has the conductivity of Spitzer in its distribution and takes no correction. The derivatives of the conductivity with respect to the temperature and the densities are not part of the Jacobian: the plasma is prescribed.

source
Runes2P.ConductivityTerm — Type
ConductivityTerm(electric_field, model::ConductivityModel; coefficient=1)

coefficient times σ(r, t) E(r) [A/m²] with the conductivity [S/m] of model and the radial unknown electric_field [V/m], added to the row of a radial unknown with one component: Ohm's law of a fluid, 0 = σ E − j_ohm, or the correction of the ohmic current of a fully kinetic run, 0 = j(f, all p) − j_hot + E (σ − σ_kinetic) − j_ohm (DREAM's j_ohm with correctedConductivity). The conductivity is that of the plasma of the evaluation. It is kept until the plasma values of a radius change, or the coefficients of the operator of kinetic = :discrete_operator. The term is linear in the field.

source
Runes2P.conductivity_at — Method
conductivity_at(term::ConductivityTerm, t)
conductivity_at(term::ConductivityTerm, u, layout, t)

The conductivity of the term per radius [S/m] at the time t [s] and the state u of the system (nothing for a prescribed plasma).

source
Runes2P.kinetic_conductivity — Method
kinetic_conductivity(operator::AdvectionDiffusion; pitch_rule=:linear,
                     density=cold density of the plasma of the operator, field_particle=nothing)

Conductivity [S/m] of the discrete kinetic operator at every radius, from its linear response to a small electric field. operator (the collisions, and the radiation when it holds it) is C, and ∂L/∂E the derivative of the operator with the field as an argument at zero field, by dual numbers (apply!(...; electric_field)). Per radius the two bordered systems

\[\begin{pmatrix} C & g \\ w^\mathsf{T} & 0 \end{pmatrix} \begin{pmatrix} f_0 \\ \lambda_0 \end{pmatrix} = \begin{pmatrix} 0 \\ n \end{pmatrix}, \qquad \begin{pmatrix} C & g \\ w^\mathsf{T} & 0 \end{pmatrix} \begin{pmatrix} f_1 \\ \lambda_1 \end{pmatrix} = \begin{pmatrix} -(\partial L / \partial E) f_0 \\ 0 \end{pmatrix}\]

give the equilibrium f₀ of the discrete operator with the density n and the response f₁ without a change of the density, with w the density weights of the cells and g a particle source with the shape of a relativistic Maxwellian at the cold temperature (ParticleSourceTerm). This is the linearization of a run whose particle source holds the density, so the conductivity is that which such a run with this operator, this grid and these collision settings reaches in the steady state of a small field. The current of the run exceeds it by a term of the order of the square of the field: 1.7e-7 of it at a ten-thousandth of the Dreicer field (5 critical fields at 10 eV), 1.7e-5 at a thousandth.

operator holds coefficients built without a field, by fokker_planck_operator(...; field_in_coefficients = false) or from a plasma without a field, knows its plasma (coefficient_source) and has no radial transport.

  • For a flux limiter, the operator is that with the limiter frozen at the Maxwellian, which is linear in f.
  • The flux boundaries at p_max (:constant_flux, DREAM's default BC_PHI_CONST, and the extrapolated fluxes) leave the last momentum cell without a net flux in the steady state, so the bordered systems are singular with them. The response takes f = 0 beyond p_max in their place. The distribution at p_max of a conductivity run is far below that of the bulk, so DREAM's steady current is the same with BC_F_0 and BC_PHI_CONST.
  • The boundary :interface of a hot-tail grid below a runaway grid takes f = 0 beyond p_max as well: the response is that of the bulk on the hot-tail grid, and the flux into the runaway grid at a small field is far below the current of the bulk.
  • pitch_rule is that of the current moment (current_density).
  • density is the density [m⁻³] of the equilibrium per radius, the electrons that carry the current, by default the cold density of the plasma of the operator. It differs from the cold density of the collision coefficients in the limit of the Lorentz gas, which has no electron-electron collisions. In a fully kinetic run the current of f_hot over all momenta is carried by n_cold + n_hot: the conductivity with the default density leaves out a part of the order n_hot / n_cold.
  • field_particle, a FieldParticleOperator on the grid of operator, adds the momentum-conserving field-particle term to C.

The test-particle operator gives 0.296 of the Lorentz conductivity at Z = 1, against the 0.5816 of Spitzer and Härm, since it does not return the momentum of the electron-electron collisions.

source

src/system/induction_terms.jl

Public

Runes2P.CrossSectionIntegralTerm — Type
CrossSectionIntegralTerm(unknown; coefficient=1)

coefficient times the integral of the radial unknown unknown over the cross-section of the plasma, Σ 2π V' Δr u with the spatial Jacobian V' of the radial grid (r in a cylinder), added to the row of a scalar unknown: the plasma current from the current density, 0 = Σ 2π r Δr j − I_p (DREAM's TotalPlasmaCurrentFromJTot). The entries of its row are assembled directly.

source
Runes2P.InductionNames — Type
InductionNames(; electric_field=:electric_field, poloidal_flux=:poloidal_flux,
               total_current_density=:total_current_density,
               plasma_current=:plasma_current, edge_poloidal_flux=:edge_poloidal_flux,
               wall_poloidal_flux=:wall_poloidal_flux)

Names of the unknowns of the induction equations (induction_unknowns, induction_equations).

source
Runes2P.PoloidalFluxDiffusionTerm — Type
PoloidalFluxDiffusionTerm(poloidal_flux, edge_poloidal_flux; coefficient=1)

coefficient times (1/V') ∂_r (V' ∂_r ψ) of the radial unknown poloidal_flux, added to the row of a radial unknown with one component: the side of Ampère's law that holds the flux, 0 = (1/r) ∂_r (r ∂_r ψ) − 2π μ₀ j. V' is the spatial Jacobian of the radial grid (r in a cylinder).

The gradient at a face between two cells is the difference of the cell values over the distance of the centres. No flux passes the first face. The gradient at the edge of the plasma is (ψ_edge − ψ_N)/(a − r_N), with the scalar unknown edge_poloidal_flux and the last cell N (DREAM's AmperesLawDiffusionTerm and AmperesLawBoundaryAtRMax).

source
Runes2P.edge_to_wall_inductance — Method
edge_to_wall_inductance(minor_radius, wall_radius)

Inductance per major radius between the edge of the plasma and the wall, μ₀ ln(b/a), of the flux at the edge ψ_edge = ψ_wall − μ₀ ln(b/a) I_p (DREAM's PlasmaEdgeToWallInductanceTerm). Zero for a wall at the edge of the plasma.

source
Runes2P.induction_equations — Method
induction_equations(radial_grid; wall_radius=minor radius, loop_voltage_at_wall=0,
                    current_density_scale=1e6, names=InductionNames())

The induction equations in cylindrical geometry, with DREAM's pairing of rows and unknowns:

UnknownEquation
electric fielddψ/dt = 2π E (Faraday's law, the time derivative of the flux)
poloidal flux0 = (1/r) ∂_r (r ∂_r ψ) − 2π μ₀ j_tot (Ampère's law)
plasma current0 = Σ 2π r Δr j_tot − I_p
flux at the edge0 = ψ_wall − μ₀ ln(b/a) I_p − ψ_edge
flux at the walldψ_wall/dt = V_loop,wall

wall_radius is the radius b of the wall. loop_voltage_at_wall is the loop voltage per major radius at the wall [V/m], a number or a function of time: zero for a perfectly conducting wall, which holds the flux at the wall. The row of Ampère's law takes the scale 2π μ₀ times current_density_scale. The equation of the total current density, the sum of the currents of the run, comes from the caller.

source
Runes2P.induction_unknowns — Method
induction_unknowns(radial_grid; electric_field_scale=1, current_density_scale=1e6,
                   names=InductionNames())

The unknowns of the induction equations with their scales: the electric field [V/m], the poloidal flux per major radius [V s/m] and the total current density [A/m²] at each radius, and the scalars plasma current [A], flux at the edge and flux at the wall. The scales of the flux and of the plasma current follow from that of the current density (current_density_scale, 1 MA/m² by default) and the minor radius: μ₀ I_p and π a² j. The total current density gets its equation from the caller, the sum of the currents of the run, the others from induction_equations.

source
Runes2P.initial_poloidal_flux — Method
initial_poloidal_flux(radial_grid, total_current_density; wall_radius=minor radius,
                      wall_poloidal_flux=0)

The poloidal flux that satisfies the discrete Ampère's law of PoloidalFluxDiffusionTerm for the current density total_current_density (one value per radius), as DREAM initializes it (a steady solve of the equation of the flux, with the flux at the wall zero). Returns the named tuple (poloidal_flux, plasma_current, edge_poloidal_flux, wall_poloidal_flux): the state of the induction unknowns at the start of a run, next to the field and the current density.

source