Reactions#
The following content gives some background to the reactions implemented in Hermes-3. Please see the Post-processing section for related diagnostics.
See also
For a more detailed description of how reaction source terms are handled in the code, please see the ‘Reactions’ section of the developer manual.
Reaction basics#
The formula for the reaction is used as the name of the component. This
makes writing the input file harder, since the formula must be in the exact same format
(e.g. h + e and e + h won’t be recognised as being the same thing),
but makes reading and understanding the file easier.
To include a set of reactions, it is probably easiest to group them, and then include the group name in the components list
[hermes]
components = ..., reactions
[reactions]
type = (
h + e -> h+ + 2e, # ionisation
h+ + e -> h, # Radiative + 3-body recombination
)
Note that brackets can be used to split the list of reactions over multiple lines, and trailing commas are ignored. Comments can be used if needed to add explanation. The name of the section does not need to be “reactions”, and multiple components could be created with different reaction sets. Be careful not to include the same reaction twice.
When reactions are added, all the species involved must be included, or an exception should be thrown.
Transfer channels#
Reactions typically convert species from one to another, leading to a transfer of mass momentum and energy. For a reaction converting species \(a\) to species \(b\) at rate \(S\) (units of events per second per volume) we have transfers:
where both species have the same mass: \(m_a = m_b = m\). In the pressure equations the \(-F_{ab}u_a\) comes from splitting the kinetic and thermal energies; \(E_{ab}=-E_{ba}\) is the energy transfer term that we need to find; The final term balances the loss of kinetic energy at fixed momentum due to a particle source or sink.
The momentum transfer \(F_{ab}=-F_{ba}\) is the momentum carried by the converted ions: \(F_{ab}=-m S u_a\). To find \(E_{ab}\) we note that for \(p_a = 0\) the change in pressure must go to zero: \(-F_{ab}u_a + E_{ab} -\frac{1}{2}mSu_a^2 = 0\).
Substituting into the above gives:
This has the property that the change in pressure of both species is Galilean invariant. This transfer term is included in the Amjuel reactions and hydrogen charge exchange.
Adjusting reactions#
The reaction rates can be adjusted by a user-specified arbitrary multiplier. This can be useful for
the analysis of the impact of individual reactions. The multiplier setting must be placed under the
neutral species corresponding to the reaction, e.g. under [d] when adjusting deuterium ionisation, recombination or charge exchange.
The multiplier for the fixed fraction impurity radiation must be placed under the impurity species header, e.g. under [ar] for argon.
This functionality is not yet currently implemented for helium or neon reactions.
Setting |
Specified under |
Reaction |
|---|---|---|
K_iz_multiplier |
Neutral species |
Ionisation rate |
R_ex_multiplier |
Neutral species |
Ionisation (excitation) radiation rate |
K_rec_multiplier |
Neutral species |
Recombination rate |
R_rec_multiplier |
Neutral species |
Recombination radiation rate |
K_cx_multiplier |
Neutral species |
Charge exchange rate |
R_multiplier |
Impurity species |
Fixed frac. impurity radiation rate |
The charge exchange reaction can also be modified so that the momentum transfer channel is disabled. This can be useful when testing the impact of the full neutral momentum equation equation compared to purely diffusive neutrals. A diffusive only model leads to all of the ion momentum being lost during charge exchange due to the lack of a neutral momentum equation. Enabling neutral momentum introduces a more accurate transport model but also prevents CX momentum from being lost, which can have a significant impact on the solution and may be difficult to analyse. Disabling the momentum transfer channel allows you to study the impact of the improved transport only and is set as:
[hermes]
components = ..., c, ...
[reactions]
no_neutral_cx_mom_gain = true
Fixed fraction radiation model#
In the fixed fraction radiation model, the impurity density is assumed to be a constant fraction of the electron density. The impurity only affects the plasma solution through radiation, which is calculated using a “cooling curve”, which is a function of the radiation in terms of temperature in units of \(Wm^{-3}\). More information on cooling curves can be found in literature, e.g. A. Kallenbach PPCF 55(12) (2013).
To use this component you can just add it to the list of components and then configure the impurity fraction:
[hermes]
components = ..., c, ...
[c]
type = fixed_fraction_carbon
fraction = 0.05 # 5% of electron density
diagnose = true # Saves Rc (R + section name)
This will create a diagnostic variable named Rc containing the radiation
source in \(Wm^{-3}\) where c is the species name.
Several ADAS rates are provided: nitrogen, neon, argon, krypton, xenon and tungsten.
The component names are fixed_fraction_carbon, fixed_fraction_nitrogen, fixed_fraction_neon,
fixed_fraction_argon, fixed_fraction_krypton, fixed_fraction_xenon and fixed_fraction_tungsten.
Each rate is in the form of a 10 coefficient log-log polynomial fit of data obtained using the open source tool radas, except xenon and tungsten that use 15 and 20 coefficients respectively. The \(n {\tau}\) parameter representing the density and residence time assumed in the radas collisional-radiative model has been set to \(1\times 10^{20} \times 0.5ms\) based on David Moulton et al 2017 PPCF 59(6).
Each rate has an upper and lower bound beyond which the rate remains constant.
Please refer to the source code in fixed_fraction_radiation.hxx for the coefficients and bounds used for each rate.
In addition to the above rates, there are three simplified cooling curves for Argon: fixed_fraction_argon_simplified1,
fixed_fraction_argon_simplified2 and fixed_fraction_argon_simplified3. They progressively reduce the nonlinearity in the
rate by taking out the curvature from the slopes, taking out the RHS shoulder and taking out the LHS-RHS asymmetry, respectively.
These rates may be useful in investigating the impact of the different kinds of curve nonlinearities on the solution.
There is also a very simple carbon radiation function fixed_fraction_hutchinson_carbon which is
in coronal equilibrium, using a simple formula from I.H.Hutchinson Nucl. Fusion 34 (10) 1337 - 1348 (1994):
which has units of \(Wm^3\) with \(T_e\) in eV.
- NOTE:
By default, fixed fraction radiation is disabled in the core region. This represents the fact that the impurity will likely be coronal on closed field lines and feature reduced radiation. This can prevent unphysical MARFE-like behaviour in deep detachment. This behaviour can be disabled by setting
no_core_radiation=falsein the impurity options block.
Implemented reactions#
Hydrogen and Helium#
Reionisation and recombination reactions for Hydrogen isotopes and Helium are handled by
the IznReaction and RecReaction classes. Reaction rates themselves are evaluated by
the RateHelper class, using Amjuel datasets by default.
Multiple isotopes of Hydrogen can be evolved and are kept track of using species labels
h, d and t. The following could therefore be used to enable ionisation of Deuterium
and Tritium in the configuration file:
[hermes]
components = d, t, reactions
[reactions]
type = (
d + e -> d+ + 2e, # Deuterium ionisation
t + e -> t+ + 2e, # Tritium ionisation
)
The full set of ionisation and recombination reactions currently available for Hydrogen isotopes and Helium are:
Reaction |
Description |
Reference / Notes |
|---|---|---|
h + e -> h+ + 2e |
Hydrogen ionisation |
D.Reiter, K.Sawada and T.Fujimoto (2016) |
d + e -> d+ + 2e |
Deuterium ionisation |
|
t + e -> t+ + 2e |
Tritium ionisation |
|
h+ + e -> h |
Hydrogen recombination |
Effective rates, including both radiative and 3-body contributions. |
d+ + e -> d |
Deuterium recombination |
|
t+ + e -> t |
Tritium recombination |
|
he + e -> he+ + 2e |
He ionisation |
Unresolved metastables |
he+ + e -> he |
He+ recombination |
Unresolved metastables |
Energy losses associated with both the ionisation potential energy cost and photon emission during excitation and de-excitation during multi-step ionisation are also included. The default datasets for these calculations are Amjuel reaction H.10 2.1.5 for ionisation and Amjuel reaction H.10 2.1.8 for recombination.
Charge exchange reactions between Hydrogen isotopes are handled by the CXReaction class.
By default, rates are calculated using Amjuel H.3 3.1.8, parameterised by an effective
temperature scaled to different isotope masses and finite neutral particle temperatures
according to (Amjuel p43):
The available charge exchange reactions for Hydrogen isotopes are:
Reaction |
Description (default data source) |
|---|---|
h + h+ -> h+ + h |
Hydrogen charge exchange (Amjuel H.3 3.1.8) |
d + d+ -> d+ + d |
Deuterium charge exchange (Amjuel H.3 3.1.8) |
t + t+ -> t+ + t |
Tritium charge exchange (Amjuel H.3 3.1.8) |
h + d+ -> h+ + d |
Mixed Hydrogen isotope CX (Amjuel H.3 3.1.8) |
d + h+ -> d+ + h |
“ |
h + t+ -> h+ + t |
“ |
t + h+ -> t+ + h |
“ |
d + t+ -> d+ + t |
“ |
t + d+ -> t+ + d |
“ |
Lithium#
These rates are taken from ADAS (‘96 and ‘89)
Reaction |
Description |
|---|---|
li + e -> li+ + 2e |
Lithium ionisation |
li+ + e -> li+2 + 2e |
|
li+2 + e -> li+3 + 2e |
|
li+ + e -> li |
Lithium recombination |
li+2 + e -> li+ |
|
li+3 + e -> li+2 |
|
li+ + h -> li + h+ |
Charge exchange with hydrogen |
li+2 + h -> li+ + h+ |
|
li+3 + h -> li+2 + h+ |
|
li+ + d -> li + d+ |
Charge exchange with deuterium |
li+2 + d -> li+ + d+ |
|
li+3 + d -> li+2 + d+ |
|
li+ + t -> li + t+ |
Charge exchange with tritium |
li+2 + t -> li+ + t+ |
|
li+3 + t -> li+2 + t+ |
The implementation of these rates is in ADASLithiumIonisation,
ADASLithiumRecombination and ADASLithiumCX template classes:
-
template<int level>
struct ADASLithiumIonisation : public OpenADAS ADAS effective ionisation (ADF11)
- Template Parameters:
level – The ionisation level of the ion on the left of the reaction
-
template<int level>
struct ADASLithiumRecombination : public OpenADAS ADAS effective recombination coefficients (ADF11)
- Template Parameters:
level – The ionisation level of the ion on the right of the reaction
Public Functions
-
inline ADASLithiumRecombination(std::string, Options &alloptions, Solver*)
- Parameters:
alloptions – The top-level options. Only uses the [“units”] subsection.
-
template<int level, char Hisotope>
struct ADASLithiumCX : public OpenADASChargeExchange - Template Parameters:
level – The ionisation level of the ion on the right of the reaction
Hisotope – The hydrogen isotope (‘h’, ‘d’ or ‘t’)
Public Functions
-
inline ADASLithiumCX(std::string, Options &alloptions, Solver*)
- Parameters:
alloptions – The top-level options. Only uses the [“units”] subsection.
Neon#
These rates are taken from ADAS (96): SCD and PLT are used for the ionisation rate and radiation energy loss; ACD and PRB for the recombination rate and radiation energy loss; and CCD (89) for the charge exchange coupling to hydrogen. The ionisation potential is also included as a source or sink of energy for the electrons.
Reaction |
Description |
|---|---|
ne + e -> ne+ + 2e |
Neon ionisation |
ne+ + e -> ne+2 + 2e |
|
ne+2 + e -> ne+3 + 2e |
|
ne+3 + e -> ne+4 + 2e |
|
ne+4 + e -> ne+5 + 2e |
|
ne+5 + e -> ne+6 + 2e |
|
ne+6 + e -> ne+7 + 2e |
|
ne+7 + e -> ne+8 + 2e |
|
ne+8 + e -> ne+9 + 2e |
|
ne+9 + e -> ne+10 + 2e |
|
ne+ + e -> ne |
Neon recombination |
ne+2 + e -> ne+ |
|
ne+3 + e -> ne+2 |
|
ne+4 + e -> ne+3 |
|
ne+5 + e -> ne+4 |
|
ne+6 + e -> ne+5 |
|
ne+7 + e -> ne+6 |
|
ne+8 + e -> ne+7 |
|
ne+9 + e -> ne+8 |
|
ne+10 + e -> ne+9 |
|
ne+ + h -> ne + h+ |
Charge exchange with hydrogen |
ne+2 + h -> ne+ + h+ |
|
ne+3 + h -> ne+2 + h+ |
|
ne+4 + h -> ne+3 + h+ |
|
ne+5 + h -> ne+4 + h+ |
|
ne+6 + h -> ne+5 + h+ |
|
ne+7 + h -> ne+6 + h+ |
|
ne+8 + h -> ne+7 + h+ |
|
ne+9 + h -> ne+8 + h+ |
|
ne+10 + h -> ne+9 + h+ |
|
ne+ + d -> ne + d+ |
Charge exchange with deuterium |
ne+2 + d -> ne+ + d+ |
|
ne+3 + d -> ne+2 + d+ |
|
ne+4 + d -> ne+3 + d+ |
|
ne+5 + d -> ne+4 + d+ |
|
ne+6 + d -> ne+5 + d+ |
|
ne+7 + d -> ne+6 + d+ |
|
ne+8 + d -> ne+7 + d+ |
|
ne+9 + d -> ne+8 + d+ |
|
ne+10 + d -> ne+9 + d+ |
|
ne+ + t -> ne + t+ |
Charge exchange with tritium |
ne+2 + t -> ne+ + t+ |
|
ne+3 + t -> ne+2 + t+ |
|
ne+4 + t -> ne+3 + t+ |
|
ne+5 + t -> ne+4 + t+ |
|
ne+6 + t -> ne+5 + t+ |
|
ne+7 + t -> ne+6 + t+ |
|
ne+8 + t -> ne+7 + t+ |
|
ne+9 + t -> ne+8 + t+ |
|
ne+10 + t -> ne+9 + t+ |
The implementation of these rates is in ADASNeonIonisation,
ADASNeonRecombination and ADASNeonCX template classes:
-
template<std::size_t level>
struct ADASNeonIonisation : public OpenADAS ADAS effective ionisation (ADF11)
- Template Parameters:
level – The ionisation level of the ion on the left of the reaction
-
template<std::size_t level>
struct ADASNeonRecombination : public OpenADAS ADAS effective recombination coefficients (ADF11)
- Template Parameters:
level – The ionisation level of the ion on the right of the reaction
Public Functions
-
inline ADASNeonRecombination(std::string, Options &alloptions, Solver*)
- Parameters:
alloptions – The top-level options. Only uses the [“units”] subsection.
-
template<std::size_t level, char Hisotope>
struct ADASNeonCX : public OpenADASChargeExchange - Template Parameters:
level – The ionisation level of the ion on the right of the reaction
Hisotope – The hydrogen isotope (‘h’, ‘d’ or ‘t’)
Public Functions
-
inline ADASNeonCX(std::string, Options &alloptions, Solver*)
- Parameters:
alloptions – The top-level options. Only uses the [“units”] subsection.