A commonly needed in plasma physics is the energy it takes to ionize a single atom or ion. The Particle class should have an attribute called ionization_energy that returns this value. Example functionality is:
>>> from plasmapy.atomic import Particle
>>> ion = Particle('Fe 6+')
>>> ion.ionization_energy
<Quantity 2.00233625e-17 J>
When this is called for an element or isotope with no charge specified, the energy to ionize a neutral atom should be returned. The returned value should be in joules because PlasmaPy uses SI units.
The ionization energy might depend on the mass number for the lightest elements, so it would be worth checking if there are different ionization energies for protium, deuterium, and tritium; and also for He-3 and He-4.
When ionization energy is not available for a particular ion, a MissingAtomicDataError exception should be raised.
The terms "ionization energy" and "ionization potential" are used interchangeably, so Particle.ionization_potential would be an alternative. I prefer Particle.ionization_energy because it is explicit that it is an energy, because it is shorter, and because it appears to be somewhat more commonly used (565K Google results for "ionization energy" vs. 491K Google results for "ionization potential").
The NIST Atomic Spectra Database Ionization Energies Form would be a good place to get the data for this. It's tricky to get all of the data, so we have to list the atomic symbols of the elements that we want the ionization energy for. We can get a list of the elements by running:
from plasmapy.atomic import atomic_symbol
elements = ""
for i in range(1,105): # Information for the highest atomic number elements is not available
elements += f"{atomic_symbol(i)}, "
print(elements[:-2])
This yields:
H, He, Li, Be, B, C, N, O, F, Ne, Na, Mg, Al, Si, P, S, Cl, Ar, K, Ca, Sc, Ti, V, Cr, Mn, Fe, Co, Ni, Cu, Zn, Ga, Ge, As, Se, Br, Kr, Rb, Sr, Y, Zr, Nb, Mo, Tc, Ru, Rh, Pd, Ag, Cd, In, Sn, Sb, Te, I, Xe, Cs, Ba, La, Ce, Pr, Nd, Pm, Sm, Eu, Gd, Tb, Dy, Ho, Er, Tm, Yb, Lu, Hf, Ta, W, Re, Os, Ir, Pt, Au, Hg, Tl, Pb, Bi, Po, At, Rn, Fr, Ra, Ac, Th, Pa, U, Np, Pu, Am, Cm, Bk, Cf, Es, Fm, Md, No, Lr, Rf
We can then copy that into the NIST form to get an ASCII table containing the atomic number, the ion charge, and the ionization energy.
Many of the ionization energies for heavier elements and for higher ionization states are not known precisely or even at all, so I'm wondering if we should somehow include data on the errors as well. We would probably need to raise a MissingAtomicDataError for cases where the ionization energy is not known.
This is extremely helpful!
Many of the ionization energies for heavier elements and for higher ionization states are not known precisely or even at all
Do we want all ionization states of the element, or just the first one? I think once the code is written for the first state, it will be easier to add in functionality for any higher ionization states the element might have.
We would want this for all of the ionization states for each element for which the ionization energy is known. For a lot of solar physics and astronomy applications, it's common to have to deal with ions in high charge states, so there will be times when that information ends up being needed.
Thanks!
I will once again resume my sworn duty as the CHIANTI representative and note that CHIANTI provides the ionization potential for all ions in the database.
For example, in fiasco, to get the ionization potential for an ion,
>>> import astropy.units as u
>>> import fiasco
>>> ion = fiasco.Ion('H 1', [1e6]*u.K)
>>> ion.ip.to(u.eV)
<Quantity 13.59843473 eV>
This would likely be part of a larger discussion, but perhaps Plasmapy could allow for multiple backends (e.g. NIST, AtomDB, CHIANTI) for reading atomic data? This could be set at the command line or in the users ".rc" file.
Ummmmmm I've already previously stated that I want to so this for SpectroscoPyx and I already have a working script that fetches ionization energies from NIST (just need to push it). Also also, the Mendeleev package provides a lot of ionization energies.
Looks like even for unknown ionization energies NIST lists theoretical values. For example, here is Uranium.
So I think my script for fetching energies from NIST will be suitable for this issue.
We could also implement a similar theoretical equation to what NIST uses. I assume NIST values are based on a Rydberg-like equation.
I've just opened a PR on SpectroscoPyx dealing with fetching ionization energies from NIST
Most helpful comment
I will once again resume my sworn duty as the CHIANTI representative and note that CHIANTI provides the ionization potential for all ions in the database.
For example, in fiasco, to get the ionization potential for an ion,
This would likely be part of a larger discussion, but perhaps Plasmapy could allow for multiple backends (e.g. NIST, AtomDB, CHIANTI) for reading atomic data? This could be set at the command line or in the users ".rc" file.