Kinetic model

VlasovAmpereOneSpecies

Vlasov-Ampère system for a single kinetic species in an electric field.

Overview

This model couples the kinetic Vlasov equation for the particle distribution function

with Ampère's law for the electric field evolution. It includes the effect of a static background magnetic field and solves the initial Poisson equation to satisfy Gauss's law at . The model uses a particle-in-cell (PIC) method with finite element exterior calculus (FEEC) for the electromagnetic fields.

All field variables are perturbations around a reference equilibrium distribution. The model enables studies of kinetic instabilities, particle-wave interactions, and nonlinear plasma physics without assuming a fluid approximation.

Use cases

This model is appropriate for:
  • studying kinetic instabilities in collisionless plasmas
  • particle-wave interactions and nonlinear plasma physics
  • initial value problems with prescribed equilibrium distributions
  • benchmark problems for kinetic-field coupling schemes
  • verification of PIC methods in simplified geometries

Governing equations

PDEs solved by model:

Vlasov equation:

Ampère's law:

Initial Poisson equation: At , solve weakly for the electric potential :

Normalization

Velocity and field normalizations:

Dimensionless parameters:

where

For electrons: , .

Discretization

Time integration is performed by the following propagators (in sequence):
  1. struphy.propagators.push_eta.PushEta
  2. struphy.propagators.push_vxb.PushVxB (if with_B0 is True)
  3. struphy.propagators.vlasov_ampere_coupling.VlasovAmpereCoupling

Diagnostics

The following scalars are tracked during simulation:

  • Electric field energy:
  • Kinetic energy:
  • Total energy:

Example

Create and initialize a Vlasov-Ampère model:

from struphy.models import VlasovAmpereOneSpecies

model = VlasovAmpereOneSpecies()

# Access fields
model.em_fields.e_field
model.em_fields.phi
model.kinetic_ions.var

# Access tracked scalar quantities
model.scalars["electric_energy"]
model.scalars["kinetic_energy"]
model.scalars["total_energy"]