-
Notifications
You must be signed in to change notification settings - Fork 225
Fix effective principal quantum number nEff in ADK
#2011
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix effective principal quantum number nEff in ADK
#2011
Conversation
|
offline discussion: the H-like models will be removed as they only made sense for the last bound e- and are error prune (usage) plus lead to the same result as "fixed" for the last e-. The Zeff model in BSI (and an added follow-up for ADK) are interesting for users to tune their rates but are not necessarily better, as we can e.g. see for the BSI/ADK thresholds where a 24eV C2+ e- is estimated with the same threshold as a 13.6 eV Hydrogen e-, which is obviously weird and caused by the common approximation to increase Zeff only per closed shell. Luckily, we allow the user to change that at will, but we need to document that Zeff does not necessarily mean its "better" as in the example here. for this PR, we will add a description for the sphinx docs with the models and the image above (without the two orange lines) and a follow-up PR will include add ADK with Zeff, although it might be as (consistently) bad as BSI with Zeff, but at least it's configurable. |
n01r
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Still some kernel optimizations to do.
| plt.draw() | ||
| plt.show() | ||
|
|
||
| plt.savefig("field_ionization_effective_potentials.svg") No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
missing EOF newline
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
| E. Clementi and D. Raimondi. | ||
| *Atomic Screening Constant from SCF Functions. II. Atoms with 37 to 86 Electrons*, | ||
| The Journal of Chemical Physics 47, 1300-1307 (1967) | ||
| https://dx.doi.org/10.1063/1.1712084 No newline at end of file |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
missing EOF newline
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
| /* the charge that attracts the electron that is to be ionized: | ||
| * equals `protonNumber - #allInnerElectrons` | ||
| */ | ||
| float_X effectiveCharge = chargeState + float_X(1.0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
float_X const
as well as above where:
const float_X protonNumber = GetAtomicNumbers::type::numberOfProtons;
float_X chargeState = attribute::getChargeState(parentIon);
| /* nameless variable for convenience dFromADK*/ | ||
| float_X dBase = float_X(4.0) * util::cube(protonNumber) / (eInAU * util::quad(nEff)) ; | ||
| float_X dBase = float_X(4.0) * util::cube(effectiveCharge) / (eInAU * util::quad(nEff)) ; | ||
| float_X dFromADK = math::pow(dBase,nEff); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
float_X const
| float_X nEff = effectiveCharge / math::sqrt(float_X(2.0) * iEnergy ); | ||
| /* nameless variable for convenience dFromADK*/ | ||
| float_X dBase = float_X(4.0) * util::cube(protonNumber) / (eInAU * util::quad(nEff)) ; | ||
| float_X dBase = float_X(4.0) * util::cube(effectiveCharge) / (eInAU * util::quad(nEff)) ; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
float_X const
| float_X effectiveCharge = chargeState + float_X(1.0); | ||
| /* effective principal quantum number (unitless) */ | ||
| float_X nEff = protonNumber / math::sqrt(float_X(2.0) * iEnergy ); | ||
| float_X nEff = effectiveCharge / math::sqrt(float_X(2.0) * iEnergy ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
float_X const
|
|
||
| const float_X pi = precisionCast<float_X>(M_PI); | ||
| /* electric field in atomic units - only absolute value */ | ||
| float_X eInAU = math::abs(eField) / ATOMIC_UNIT_EFIELD; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
float_X const
Fixes the calculation of the effective principal quantum number `nEff` for
the implemented ADK ionization model. The quantity `nEff` arises from scaling
an ionic potential of an arbitrary configuration and charge state Z to the
hydrogenic Bohr model. In the Bohr model:
n = Z / sqrt(2 * E_n)
where E_n denotes the energy of the n-th level/shell.
In order to extrapolate that to arbitrary ions one has to do the following
replacements:
Z (nuclear charge) --> Z_i (ionic residual charge)
E_n (n-th shell energy) --> E_i (ionization energy of the state)
Here atomic residual charge means charge AFTER ionization since this is the
charge that the electron to be ionized 'feels'.
55b2306 to
6f75a2c
Compare
ax3l
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pushed my changed directly to the branch
|
Thanks! The script refactoring is very helpful! |
PrometheusPi
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
good job - some typos and missing python comments should be fixed
|
|
||
| .. moduleauthor:: Marco Garten | ||
|
|
||
| Implemented LTE Model: Thomas-Fermi Ionization according to [More1985]_ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OPTIONAL:
Please remove capitalization model, ionization
|
|
||
| Get started here https://github.com/ComputationalRadiationPhysics/picongpu/wiki/Ionization-in-PIConGPU | ||
|
|
||
| NLTE Models |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OPTIONAL:
either write model or capitalize line 6
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this header is fine, line 6 needs capitalization
|
|
||
| .. note:: | ||
|
|
||
| Most of the calculations and formulae in this section of the docs are done in the system of **Atomic Units (AU)**. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OPTIONAL:
**Atomiv Units (AU)** system?
| ================ ===== | ||
| length :math:`5.292 \cdot 10^{-11}\,\mathrm{m}` | ||
| time :math:`2.419 \cdot 10^{-17}\,\mathrm{s}` | ||
| energy :math:`4.360 \cdot 10^{-19}\,\mathrm{J}\quad` (= 27.21 eV = 1 Rydberg) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
REQUIRED:
The Hartree energy is 4.3 10^-18 J
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
but time is correct
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
thanks for catching that typo!
| \Gamma_\mathrm{K} = \frac{\left(6 \pi\right)^{1/2}}{2^{5/4}} E_\mathrm{ip} \left( \frac{F}{(2 E_\mathrm{ip})^{3/2}} \right)^{1/2} \exp\left(-\frac{2 \left(2 E_\mathrm{ip}\right)^{3/2}}{3 F}\right) | ||
| According to the equation (9) in [BauerMulser1999]_ the Keldysh ionization rate has been implemented. See also [Keldysh]_ for the original work. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OPTIONAL:
Better turn parts around:
The Keldysh ionization rate has been implemented according to the equation (9) in [BauerMulser1999]_.
| # Atomic units | ||
| E_AU = 27.2 # eV | ||
| F_AU = 5.1422e11 # V/m | ||
| I_AU = 3.5095e16 # W/cm^2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
QUESTION:
If this is in A.U. why do you give a SI unit?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that is the unit ^^
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay - I was confused by the relation but know it makes sense
| plt.ylabel("ionization rate $\Gamma$ [Hz]") | ||
| plt.xlabel("field strength $F$ [AU = 5.1422$\cdot 10^{11}$ V/m]") | ||
| plt.legend(loc="best") | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OPTIONAL:
you could add plt.tight_layout()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
offline: @ax3l says no
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay
| def V_eff(x, Z_eff, F): | ||
| """ | ||
| Effective radially symmetric nuclear potential under the influence of a | ||
| homogenous external electric field. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
REQUIRED:
typo homogeneous
| Effective radially symmetric nuclear potential under the influence of a | ||
| homogenous external electric field. | ||
| Unit: 1 AU = 27.2 eV |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
REQUIRED:
Please add brief comment on parameters
| plt.ylim([-3., 1.]) | ||
| plt.ylabel("$V_\mathrm{eff}$ [AU = Rydberg]") | ||
| plt.xlabel("$x$ [AU = Bohr radii]") | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OPTIONAL:
add plt.tight_layout()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
as discussed offline: will not implement as it should rather be set manually
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Okay
| Collisional Ionization | ||
| ====================== | ||
|
|
||
| LTE models |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Model needs capitalization
|
@n01r pls ammend the changes (are all docs-only) to your last commit when finished (careful: check the branch out fresh first since I force-pushed) |
Yep, did that immediately. Thanks for the feedback! I hope it can be merged now 👍 |
- Split up `ionization.rst` into `field_ionization.rst` and `collisionalIonization.rst` - Added equations for the implemented tunneling models - Added images showing a comparison of ionization rates as well as effective potentials - Added Python scripts that produce these images - Updated the references
|
@PrometheusPi pls update your review :) |
PrometheusPi
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks good - thank you for the fixes
Adds the following changes to the `release-0.3.0` branch: - Multiple ionizers per species: `ionizer< ... >` became a sequence of `ionizers< ... >` ComputationalRadiationPhysics#1999 - Thomas-Fermi: - fixes in domain decomposition ComputationalRadiationPhysics#2007 - fixes compile issue (missing include) ComputationalRadiationPhysics#2003 - BSI models restructured ComputationalRadiationPhysics#2013 - ADK: fix effective principal quantum number `nEff` ComputationalRadiationPhysics#2011 - multiple ionization algorithms can be applied per species, e.g. cut-off barrier suppression ionization (BSI), probabilistic field ionization (ADK) and collisional ionization ComputationalRadiationPhysics#1999 - FieldTmp: Gather support to fill GUARD ComputationalRadiationPhysics#2009 - Fix undefined device variable in tilted laser pulse ComputationalRadiationPhysics#2017 - CompileTime Accessor: Type (::type) ComputationalRadiationPhysics#1998 - TBG Macros: Outdated Comment ComputationalRadiationPhysics#2004 Increases the state of the `0.3.0` release candidate to `rc3`.
Adds the following changes to the `release-0.3.0` branch: - Multiple ionizers per species: `ionizer< ... >` became a sequence of `ionizers< ... >` ComputationalRadiationPhysics#1999 - Thomas-Fermi: - fixes in domain decomposition ComputationalRadiationPhysics#2007 - fixes compile issue (missing include) ComputationalRadiationPhysics#2003 - BSI models restructured ComputationalRadiationPhysics#2013 - ADK: fix effective principal quantum number `nEff` ComputationalRadiationPhysics#2011 - multiple ionization algorithms can be applied per species, e.g. cut-off barrier suppression ionization (BSI), probabilistic field ionization (ADK) and collisional ionization ComputationalRadiationPhysics#1999 - FieldTmp: Gather support to fill GUARD ComputationalRadiationPhysics#2009 - Fix undefined device variable in tilted laser pulse ComputationalRadiationPhysics#2017 - CompileTime Accessor: Type (::type) ComputationalRadiationPhysics#1998 - TBG Macros: Outdated Comment ComputationalRadiationPhysics#2004 Increases the state of the `0.3.0` release candidate to `rc3`.
Note: This also affects 0.2.4, we might only fix it in 0.3.0
Fixes the calculation of the effective principal quantum number
nEffforthe implemented ADK ionization model. The quantity
nEffarises from scalingan ionic potential of an arbitrary configuration and charge state Z to the
hydrogenic Bohr model. In the Bohr model:
where E_n denotes the energy of the n-th level/shell.
In order to extrapolate that to arbitrary ions one has to do the following
replacements:
Here atomic residual charge means charge AFTER ionization since this is the
charge that the electron-to-be-ionized 'feels'.
Previously it was wrongly implemented since the bare nuclear charge was used to calculate the effective principal quantum number
In the following comparison one can see the ionization rates for the transition from C II to C III (meaning 1+ to 2+).

While previously (orange curve ADK C H-like) with the old
nEffvalues this carbon state was ionized earlier than hydrogen that is not the case anymore (green curve ADK C (fixed)).While in the hydrogen case the effective charge is just 1 for C II it should be either 2 (proton number minus number of bound electrons in ionized state) or 3.136 when accounting for shielding of the orbitals via SCF methods
(see: Clementi, E.; Raimondi, D. L. (1963). "Atomic Screening Constants from SCF Functions". J. Chem. Phys. 38 (11): 2686–2689.)
This affects all previous simulations done with the ADK ionization model.
Especially low charge states are affected, as can be seen in the example of values of
nEfffor carbon ions.nEff(fixed)nEff(old)That previously led to an overestimation of ionization for low charge states.