VFP-1D Configuration Reference
This document describes how to construct a configuration file for the vfp-1d solver.
Top-Level Structure
solver: vfp-1d
units:
# Physical unit normalizations
density:
# Species definitions
grid:
# Simulation grid parameters
save:
# Output configuration
mlflow:
# Experiment tracking
drivers:
# External drivers
terms:
# Solver configuration
units
Physical unit normalizations for the simulation.
Field |
Type |
Description |
|---|---|---|
|
string |
Laser wavelength with unit, e.g., |
|
string |
Reference electron temperature with unit, e.g., |
|
string |
Reference ion temperature with unit, e.g., |
|
string |
Reference electron density with unit, e.g., |
|
int |
Ionization state |
|
string |
Ion species label, e.g., |
|
string or float |
Coulomb logarithm: |
Example:
units:
laser_wavelength: 351nm
reference electron temperature: 3000eV
reference ion temperature: 300eV
reference electron density: 2.275e21/cm^3
Z: 6
Ion: Au+
logLambda: nrl
density
Species and density configuration. Multiple species are supported via keys prefixed with species-.
Field |
Type |
Description |
|---|---|---|
|
bool |
Whether to enforce quasineutrality |
Species Definition
Each species is defined with a key starting with species- (e.g., species-background, species-hote).
Field |
Type |
Description |
|---|---|---|
|
int |
Random seed for noise initialization |
|
string |
|
|
float |
Amplitude of noise |
|
float |
Drift velocity (normalized) |
|
float |
Temperature (normalized to reference temperature) |
|
float |
Super-Gaussian exponent. |
|
object |
Density spatial profile (see Basis Types) |
|
object |
Temperature spatial profile (see Basis Types) |
Basis Types
Each of n and T has a basis field that determines the spatial profile.
uniform: Constant profile
n:
basis: uniform
baseline: 1.0
bump_or_trough: bump
center: 0m
rise: 1m
bump_height: 0.0
width: 1m
sine: Sinusoidal perturbation
T:
basis: sine
baseline: 1.0
amplitude: 1.0e-3
wavelength: 250um
cosine: Cosine perturbation (useful with reflective BCs where dT/dx=0 at boundaries)
T:
basis: cosine
baseline: 1.0
amplitude: 1.0e-3
wavelength: 250um
tanh: Hyperbolic tangent profile
T:
basis: tanh
baseline: 1.0
bump_or_trough: bump
center: 50um
rise: 5um
bump_height: 0.1
width: 20um
file: Tabulated profile from a two-column (coordinate, value) CSV or whitespace-delimited text file. Header rows are skipped automatically; the profile is interpolated onto the grid and clamped to the endpoint values outside the tabulated range. Density values are normalized by units.reference electron density, temperature values by units.reference electron temperature.
n:
basis: file
path: /path/to/electrondensity.csv
units: 1/cm^3 # units of the value column
coordinate_units: um # units of the coordinate column (default um)
Ion block (optional)
An optional density.ion block sets a spatially varying ion density and ionization state from a tabulated mass-density profile:
density:
ion:
A: 9.0122 # ion mass number (amu)
mass_density:
basis: file # only "file" is supported
path: /path/to/massdensity.csv
units: g/cm^3
coordinate_units: um
This sets \(n_i(x) = \rho(x) / (A \, m_u)\) and \(Z(x) = n_e(x)/n_i(x)\) pointwise. When the block is omitted, \(Z\) is uniform (units.Z) and \(n_i = n_e / Z\).
For atomic mixtures (e.g. fully ionized CD), add a mixture list. The plasma is then represented by a single effective ion species that preserves both quasineutrality (\(Z n_i = n_e\)) and the electron-ion collision rate (\(Z^2 n_i = \sum_i n_i Z_i^2 = Z_\text{eff}\, n_e\)), with \(Z_\text{eff} = \langle Z^2\rangle / \langle Z\rangle\). Set units.Z to \(Z_\text{eff}\) — it is the collisional/transport Z that enters the Epperlein-Haines and SNB coefficients. The mass-density profile is used to cross-check full-ionization quasineutrality (\(\bar{Z}\rho/(A m_u)\) vs \(n_e\)); a warning is printed if they disagree by more than 5%.
density:
ion:
A: 6.304 # mean atomic weight (optional; default sum of fractions * A)
mixture:
- { Z: 6, A: 12.011, fraction: 0.4 } # C
- { Z: 1, A: 2.0141, fraction: 0.6 } # D
mass_density:
basis: file
path: /path/to/massdensity.csv
units: g/cm^3
coordinate_units: um
grid
Simulation grid parameters. All dimensioned quantities use astropy-style unit strings.
Field |
Type |
Description |
|---|---|---|
|
string |
Timestep with unit, e.g., |
|
int |
Number of velocity grid points |
|
int |
Number of spatial grid cells |
|
string |
Start time with unit |
|
string |
End time with unit |
|
float |
Maximum velocity (normalized to \(c\)) |
|
string |
Domain minimum x with unit |
|
string |
Domain maximum x with unit |
|
int |
Maximum spherical harmonic order (typically |
|
string |
Spatial boundary condition: |
|
string |
Spatial geometry: |
Example:
grid:
dt: 1fs
nv: 256
nx: 32
tmin: 0.ps
tmax: 2ps
vmax: 8.0
xmin: 0.0um
xmax: 500um
nl: 1
boundary: periodic
Boundary conditions
periodic: Standard periodic wrapping. Suitable for full-wavelength perturbations.reflective: Zero-flux boundaries. Vector quantities (\(f_{10}\), \(E\)) are zero at domain edges. Scalar quantities (\(f_0\)) use mirror ghost cells. Suitable for half-wavelength (cosine) perturbations where symmetry allows simulating half the domain.
Geometry
cartesian: Planar 1D geometry (default). The spatial coordinate is \(x\).spherical: Radial 1D geometry with spherical symmetry. The spatial coordinate is the radius \(r\). Requiresxmin >= 0andboundary: reflective(whenxmin: 0the flux through \(r=0\) vanishes by symmetry;xmin > 0gives an annular domain with a reflecting inner wall; the outer edge is a reflecting wall). Velocity space is unchanged. For \(n_l = 1\) the only modification to the equations is the \(f_0\) advection term becoming a radial divergence,
(the angular coupling term \(\propto (1-\mu^2)/r\) only feeds \(f_2\) into the \(f_{10}\) equation, which is dropped at \(n_l = 1\)). The divergence is discretized in conservative finite-volume form with exact cell volumes \((r_+^3 - r_-^3)/3\).
save
Configures what data to save and at what times.
save:
fields:
t:
tmin: 0.0ps
tmax: 2.0ps
nt: 11
electron:
t:
tmin: 0.0ps
tmax: 2.0ps
nt: 6
Save Key |
Description |
|---|---|
|
Fluid moments and electromagnetic fields (\(n\), \(T\), \(U\), \(P\), \(v\), \(q\), \(E\), \(B\)) |
|
Electron distribution functions (\(f_0\), \(f_{10}\)) |
Each save key contains a t sub-key with:
Field |
Type |
Description |
|---|---|---|
|
string |
Start time for saving |
|
string |
End time for saving |
|
int |
Number of save points |
mlflow
Experiment tracking configuration.
Field |
Type |
Description |
|---|---|---|
|
string |
MLflow experiment name |
|
string |
MLflow run name |
Example:
mlflow:
experiment: vfp1d
run: epperlein-short
drivers
External drivers for heating, cooling, and electromagnetic fields.
drivers:
ib: {} # Inverse Bremsstrahlung heating (optional)
maxwellian_heating: {} # Maxwellian heating/cooling (optional)
drivers.ib
Inverse Bremsstrahlung (IB) laser heating. Augments the Fokker-Planck diffusion coefficient \(D\) by \(v_\text{osc}^2 g(v) / (6v)\) where \(g(v) = [1 + (Z^2 n_i / (\omega_0 v^3))^2]^{-1}\) (Ridgers eq 4.39). Drives the distribution toward a Langdon/super-Gaussian shape.
Field |
Type |
Default |
Description |
|---|---|---|---|
|
float |
|
Laser intensity in units of \(10^{15}\) W/cm². |
|
string or float |
|
|
The quiver velocity \(v_\text{osc}^2\) and normalised laser frequency \(\omega_0\) are derived automatically from units.laser_wavelength and units.reference electron temperature:
drivers.maxwellian_heating
Maxwellian heating or cooling. Augments \(D\) by \(D_0 v^2\) (Ridgers eq E.2), which changes the temperature while preserving the Maxwellian shape of the distribution.
Field |
Type |
Default |
Description |
|---|---|---|---|
|
float |
|
Maxwellian heating/cooling rate (normalised). Positive heats, negative cools. |
The heating rate is \(\partial T / \partial t = D_0 / \hat{Z}\) (constant, independent of temperature), where both \(T\) and \(t\) are in normalised units (\(T_0\) and \(1/\omega_p\) respectively). In physical units this corresponds to a volumetric power density \(P/V = n T_0 \omega_p D_0 / \hat{Z}\).
Example:
drivers:
ib:
intensity_1e15_Wcm2: 1.0
polarisation: linear
# OR for Maxwellian heating:
# maxwellian_heating:
# D0: 0.1
terms
Solver algorithm configuration.
Field |
Type |
Description |
|---|---|---|
|
string |
Electric field solver: |
|
object |
Fokker-Planck collision operator configuration |
e_solver
oshun: Implicit E-field via Taylor expansion of \(J(E)\) (Tzoufras 2013). Recommended for most simulations.ampere: Explicit Ampere update.
fokker_planck
Configuration for the two collision operators.
fokker_planck.f00
Isotropic (\(f_0\)) collision operator.
Field |
Type |
Description |
|---|---|---|
|
string |
Collision model (see below) |
|
string |
Differencing scheme: |
Available models:
Model |
Description |
|---|---|
|
Standard Landau/Rosenbluth operator with kernel \(g(\varepsilon,\varepsilon') = \min(\varepsilon^{3/2}, \varepsilon'^{3/2})\). Default. |
|
Rank-1 kernel \(g(\varepsilon,\varepsilon') = \sqrt{\varepsilon \cdot \varepsilon'}\) from high-velocity limit of linearized collision operator. O(N) computation. |
|
Beta-based model with \(D = 1/(2\beta v)\), giving constant drift \(C = 1\). From Bell & Sherlock (2024). |
Note: Energy is not conserved for non-Maxwellian distributions with the current Chang-Cooper scheme. A proper Buet weak-form scheme is planned for improved energy conservation.
fokker_planck.flm
Anisotropic (\(f_{lm}\)) collision operator (FLM).
Field |
Type |
Description |
|---|---|---|
|
bool |
Include electron-electron collisions. When |
Example
terms:
e_solver: oshun
fokker_planck:
f00:
model: CoulombianKernel
scheme: chang_cooper
flm:
ee: true
diagnostics
Optional post-processing diagnostics configuration. The Spitzer-Härm / SNB / kinetic heat-flux comparison always runs during post-processing (it writes plots/fields/heat-flux-comparison.png and binary/heat-flux-comparison.nc, and logs the q_ratio_kinetic_over_sh and q_ratio_snb_over_sh metrics). The diagnostics.snb block tunes the SNB model (Schurtz et al. 2000; the “separated” variant recommended by Brodrick et al. 2017):
Field |
Type |
Default |
Description |
|---|---|---|---|
|
int |
|
Number of energy groups on the absolute-energy grid \(\varepsilon = v^2/2\) spanning \([0,\ \beta_\text{max}\max(T)]\) |
|
float |
|
\(\beta = \varepsilon/T\) coverage at the hottest cell (sets the grid’s top energy \(\varepsilon_\text{max} = \beta_\text{max}\max(T)\)) |
|
float |
|
e-e absorption scaling of the group mfp, \(\lambda_g^{ee}/r\) |
The energy groups are bands of fixed kinetic energy \(\varepsilon = v^2/2\) (uniform in space), so the multigroup diffusion transports each group at fixed energy — required for the nonlocal preheat to be captured correctly. ngroups needs to be a few hundred because cold cells sample the grid coarsely in \(\beta = \varepsilon/T\); the flux-carrying groups sit at \(\beta \approx 16\), so beta_max \(\gtrsim 20\) keeps them on the grid.
diagnostics:
snb:
ngroups: 300
beta_max: 20.0
r: 2.0
Complete Examples
Epperlein-Short Heat Transport
See configs/vfp-1d/epp-short.yaml - Epperlein-Short heat transport benchmark with sinusoidal temperature perturbation and multi-species (background + hot electrons).
Hotspot Relaxation
See configs/vfp-1d/hotspot.yaml - Temperature hotspot relaxation with tanh temperature profile.
Spherical Heat Flow from Tabulated Profiles
See configs/vfp-1d/spherical-heatflow.yaml - Radial (spherical) geometry with \(n_e(r)\), \(T_e(r)\), and mass-density profiles loaded from CSV files, set up for a kinetic vs SNB vs Spitzer-Härm heat-flow comparison.