A non-thermal electron deposition (Spencer-Fano equation) solver.
Project description
pynonthermal
pynonthermal is a Spencer-Fano equation solver for non-thermal electron energy deposition in plasmas. It computes how deposited energy is partitioned into heating, ionisation, and excitation, and provides non-thermal ionisation and excitation rate coefficients.
Contents
- Quick start
- Installation
- Usage
- Units and conventions
- Example output
- Method background
- Cross-section dataset choice
- Citing pynonthermal
- License
Quick start
import pynonthermal
sf = pynonthermal.SpencerFanoSolver(emin_ev=1.0, emax_ev=3000.0, npts=4000)
# Add ions that can be non-thermally ionised.
# Here: O II (ion_stage=2, i.e. charge +1) with number density in cm^-3.
sf.add_ionisation(Z=8, ion_stage=2, n_ion=1.0e8)
# Solve for a deposition rate density in eV s^-1 cm^-3.
sf.solve(depositionratedensity_ev=1.0e8)
print("heating fraction:", sf.get_frac_heating())
print("total ionisation fraction:", sf.get_frac_ionisation_tot())
print("total excitation fraction:", sf.get_frac_excitation_tot())
print("sum of fractions:", sf.get_frac_sum())
print("ionisation rate coeff [cm^3 s^-1]:", sf.get_ionisation_ratecoeff(Z=8, ion_stage=2))
The quickstart notebook contains a fuller worked example, and can be launched on Binder:
Installation
Released package (recommended for most users):
pip install pynonthermal
Development install with uv:
git clone https://github.com/lukeshingles/pynonthermal.git
cd pynonthermal
uv sync --frozen
source ./.venv/bin/activate
uv pip install --editable .
prek install
Usage
Typical solver workflow:
- Create
SpencerFanoSolverwith an energy grid (emin_ev,emax_ev,npts). - Add ionisation channels with
add_ionisation(Z, ion_stage, n_ion). - Optionally add excitation channels with
add_excitation(...)oradd_ion_ltepopexcitation(...). - Call
solve(depositionratedensity_ev=..., override_n_e=...). - Query outputs such as
get_frac_heating(),get_frac_ionisation_tot(),get_frac_excitation_tot(),get_ionisation_ratecoeff(Z, ion_stage), andget_excitation_ratecoeff(Z, ion_stage, transitionkey).
Units and conventions
- Energies are in eV.
- Number densities are in cm^-3.
- Cross sections are in cm^2.
ion_stage = charge + 1(for example, Fe I hasion_stage=1, Fe II hasion_stage=2).depositionratedensity_evinsolve()is in eV s^-1 cm^-3.
Example output
The following plot shows the energy distribution of contributions to ionisation, excitation, and heating for a pure oxygen plasma (electron fraction 0.01), reproducing Figure 2 of Kozma and Fransson (1992). The area under each curve gives the fraction of deposited energy in that channel.
This figure is generated from the same solver setup demonstrated in the quickstart workflow.
Method background
When high-energy leptons (electrons and positrons) are injected into a plasma, they lose energy through ionisation, excitation, and Coulomb interactions with thermal electrons. Tracking these rates is important, for example, in late-time Type Ia supernova modelling.
The numerical solver is similar to the Spencer-Fano implementation in the ARTIS radiative transfer code (Shingles et al. 2020), itself an independent implementation of Kozma and Fransson (1992), based on Spencer and Fano (1945). A similar approach is used in CMFGEN.
Impact ionisation cross sections use fits from Arnaud and Rothenflug (1985) and Arnaud and Raymond (1992) for Z=1 to 28 (H to Ni). Heavier elements use the approximation of Axelrod (1980), Eq. 3.38 with Lotz (1967).
If internal level/transition data are used (for example, via add_ion_ltepopexcitation()), they are imported from the CMFGEN atomic data compilation. See source data files for references.
Cross-section datasets
Ionization cross sections from H (Z=1) to Ni (Z=28) are sourced from the analytical fits to data from M. Arnaud & R. Rothenflug (1985, A&AS, 60, 425), with updates to Fe from M. Arnaud & J. Raymond (1992, ApJ, 398, 394). For heavier elements (Z>28), the approximation of Axelrod (1980, PhD thesis, Eq. 3.38) is used, with Lotz (1967, Z. Phys., 206, 205) for the required parameters.
Advanced usage: custom excitation cross sections
You can supply your own excitation cross section table:
sf.add_excitation(Z, ion_stage, n_level, xs_vec, epsilon_trans_ev, transitionkey=(lower, upper))
Z: atomic number.ion_stage: one more than ion charge.xs_vec: NumPy array of cross sections (cm^2), defined at every energy insf.engrid(eV).transitionkey: any unique key within the ion, used to retrieve the excitation rate coefficient.
Retrieve the non-thermal excitation rate coefficient with:
nt_exc = sf.get_excitation_ratecoeff(Z, ion_stage, transitionkey)
Citing pynonthermal
If you use pynonthermal, please cite it via the Zenodo record.
License
Distributed under the MIT license. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pynonthermal-2026.4.27.tar.gz.
File metadata
- Download URL: pynonthermal-2026.4.27.tar.gz
- Upload date:
- Size: 5.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d6feb105db7e97fe281f86fd737853279a13efa9ee0ca9f27356b5b700501a1
|
|
| MD5 |
4937eea7b9a2d4ac1a2607684ad5c044
|
|
| BLAKE2b-256 |
a170ab6d4b8af530dfeca80afd42c728a8a71aa9c929180faa33a67b413e9dd0
|
Provenance
The following attestation bundles were made for pynonthermal-2026.4.27.tar.gz:
Publisher:
deploypypi.yml on lukeshingles/pynonthermal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pynonthermal-2026.4.27.tar.gz -
Subject digest:
6d6feb105db7e97fe281f86fd737853279a13efa9ee0ca9f27356b5b700501a1 - Sigstore transparency entry: 1392920230
- Sigstore integration time:
-
Permalink:
lukeshingles/pynonthermal@bbf5690fcb8cc93ef5ac1a28ac7cfadb74e578c7 -
Branch / Tag:
refs/tags/v2026.4.27 - Owner: https://github.com/lukeshingles
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploypypi.yml@bbf5690fcb8cc93ef5ac1a28ac7cfadb74e578c7 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pynonthermal-2026.4.27-py3-none-any.whl.
File metadata
- Download URL: pynonthermal-2026.4.27-py3-none-any.whl
- Upload date:
- Size: 5.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ee6de7001028a76286672263d3b4efeccb7de5c3e0433e98d2d9c5a5feec2f0
|
|
| MD5 |
0bc8a17c5353ea8348274af34b4a1be6
|
|
| BLAKE2b-256 |
95d736aeb7c8a8b46687aeba082309fe8d442469e2795760f36398339bebe25f
|
Provenance
The following attestation bundles were made for pynonthermal-2026.4.27-py3-none-any.whl:
Publisher:
deploypypi.yml on lukeshingles/pynonthermal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pynonthermal-2026.4.27-py3-none-any.whl -
Subject digest:
2ee6de7001028a76286672263d3b4efeccb7de5c3e0433e98d2d9c5a5feec2f0 - Sigstore transparency entry: 1392920282
- Sigstore integration time:
-
Permalink:
lukeshingles/pynonthermal@bbf5690fcb8cc93ef5ac1a28ac7cfadb74e578c7 -
Branch / Tag:
refs/tags/v2026.4.27 - Owner: https://github.com/lukeshingles
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
deploypypi.yml@bbf5690fcb8cc93ef5ac1a28ac7cfadb74e578c7 -
Trigger Event:
release
-
Statement type: