-
Notifications
You must be signed in to change notification settings - Fork 88
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
Improved energy calculation for high l states (l>5) and quantum defect updates for Cs and K. #173
Improved energy calculation for high l states (l>5) and quantum defect updates for Cs and K. #173
Conversation
Added more accurate energy for states with non-penetrating states (l>5). A (worse) approximation was used before which itself is based on the polarisation energy.
Updated qds for K and Cs and Core polarisabilities to include two new publications. Also added a property to each class a_eff_d and a_eff_q which are the effective dipole and quadrupole polarisabilities of the species Ion (e.g. Cs+). This is used when calculating the polarisation energy which is used for high l states (l >5)
Improved accuracy of high l states to include effective polarisability calculation of energies. Uses constants from literature for the effective polarisabilities. Also included hydrogenice fine stucture for these states (also g states) to remove degeneracy
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.
@johnny-sa Many thanks for this fantastic contribution, very nicely documented!
Could you please just review the comments above? I will try to release update version as soon as I hear back from you. Many thanks!
arc/alkali_atom_functions.py
Outdated
else: | ||
FS = (2*self.scaledRydbergConstant)*pow(scipy.constants.alpha,2)/(2*l*(l+1)*pow(n,3)) | ||
LI = -FS/(l+0.5) | ||
return -self.scaledRydbergConstant / ((n) ** 2) -0.5*LI*(j*(j+1)-l*(l+1)-s*(s+1)) - 2*self.scaledRydbergConstant*defect |
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.
What is difference between l==4
and l>=4
cases here? It seems to me that second one is just expansion for small defect
value right? If so, I would rather keep one case (without expansion). Please 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.
What is meaning of FS
and LS
? Note that we try in general to stick to convention of camelCase
naming of variables.
Additionally, where can you please add in code comment that references this equations in the literature? I am maybe looking at wrong place, but I cannot find them.
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.
What is difference between
l==4
andl>=4
cases here? It seems to me that second one is just expansion for smalldefect
value right? If so, I would rather keep one case (without expansion). Please comment.
I think that the expansion is needed in the case of l>=5 (not l>=4) as we are assuming that the energy difference is due to a perturbation and that there are no other effects (penetration, exchange interaction). i.e. We are not really calculating a quantum defect but an energy correction. I have simply used getQuantumDefect'
as a way of obtaining a change in energy using the stored n,l,j values.
If you would like, it may be more appropriate to define one (or two) new functions to remove this confusion. i.e. getPolarisationEnergy
(and getHydrogenFS
splitting for the other) so that it is clear l>5 is treated differently.
That is, a correction to the hydrogenic energy level from some polarisation energy calculated from perturbation theory.
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.
What is meaning of
FS
andLS
? Note that we try in general to stick to convention ofcamelCase
naming of variables.Additionally, where can you please add in code comment that references this equations in the literature? I am maybe looking at wrong place, but I cannot find them.
Apologies, FS and LS are constants that I defined that are used in the convention of The Theory Of Atomic Spectra by [Shortley, G.h] (pg. 193 onwards).
and from https://staff.fnwi.uva.nl/j.t.m.walraven/walraven/Publications_files/2023-AtomicPhysics.pdf section 4.5.2 onwards. FS and LS were mainly defined to improve the readability of the code (but are completely arbitrary). They could be renamed to fineStructSplit (for FS).
This is a bit hard to follow so I propose the following changes (following Foot. Atomic Physics pg. 37-38. So the code now reads.
if l <= 3:
return -self.scaledRydbergConstant / ((n - defect) ** 2)
elif l == 4:
fineStructSplit = -(2*self.scaledRydbergConstant)*pow(scipy.constants.alpha,2)/(2*l*(l+0.5)*(l+1)*pow(n,3))
if j == l + 0.5:
fineStructSplit *= 0.5*l
elif j == l - 0.5:
fineStructSplit *= -1*0.5*(l+1)
return -self.scaledRydbergConstant / ((n - defect) ** 2) - fineStructSplit
else:
fineStructSplit = -(2*self.scaledRydbergConstant)*pow(scipy.constants.alpha,2)/(2*l*(l+0.5)*(l+1)*pow(n,3))
if j == l + 0.5:
fineStructSplit *= 0.5*l
elif j == l - 0.5:
fineStructSplit *= -1*0.5*(l+1)
return -self.scaledRydbergConstant / ((n) ** 2) - fineStructSplit - 2*self.scaledRydbergConstant*defect`
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.
What is difference between
l==4
andl>=4
cases here? It seems to me that second one is just expansion for smalldefect
value right? If so, I would rather keep one case (without expansion). Please comment.I think that the expansion is needed in the case of l>=5 (not l>=4) as we are assuming that the energy difference is due to a perturbation and that there are no other effects (penetration, exchange interaction). i.e. We are not really calculating a quantum defect but an energy correction. I have simply used
getQuantumDefect'
as a way of obtaining a change in energy using the stored n,l,j values.If you would like, it may be more appropriate to define one (or two) new functions to remove this confusion. i.e.
getPolarisationEnergy' (and
getHydrogenFS' splitting for the other) so that it is clear l>5 is treated differently.That is, a correction to the hydrogenic energy level from some polarisation energy calculated from perturbation theory.
To add to this, it is also how a recent treatment of alkali metal energies has been done. See https://journals.aps.org/pra/abstract/10.1103/PhysRevA.100.012501 Section VII.
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.
If you would like, it may be more appropriate to define one (or two) new functions to remove this confusion. i.e.
getPolarisationEnergy
(andgetHydrogenFS
splitting for the other) so that it is clear l>5 is treated differently.
@johnny-sa Sorry for coming late back to this. Introducing these two methods would be good, and then changes should be to getEnergy
method, not getQuantumDefect
because quantum defects are, as you said, unchanged, and people might be using them for other purposes then calculating energy levels. Do you have time to do it? If not, I can try refactoring your code, and then you can review it.
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.
@johnny-sa let me know what works best for you. I have finally some extra time to work on this if needed.
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.
If you would like, it may be more appropriate to define one (or two) new functions to remove this confusion. i.e.
getPolarisationEnergy
(andgetHydrogenFS
splitting for the other) so that it is clear l>5 is treated differently.@johnny-sa Sorry for coming late back to this. Introducing these two methods would be good, and then changes should be to
getEnergy
method, notgetQuantumDefect
because quantum defects are, as you said, unchanged, and people might be using them for other purposes then calculating energy levels. Do you have time to do it? If not, I can try refactoring your code, and then you can review it.
Hi apologies for the late reply, I can look at doing this presently unless you have already. It's been a while since I've thought about this and have had some time to think it over. My previous comments were a bit all over the place.
I think the best option would be to keep calculating the polarisation 'correction' in the quantum defect. You can still represent the polarisation energy as a quantum defect [1]. This way, if someone wanted to use getQuantumDefect
of high L states, it would still return a number.
Then I think it would best to add the hydrogenic (fine-structure) splitting and relativistic correction for states with l>5 to the getEnergy
, as there is no core penetration with these states. I can define a new function with 'getHydrogenicCorrection` to incorporate these. (these are MHz level shifts and would not change the value of
[1] - Freeman, Richard R., and Daniel Kleppner. Physical Review A 14.5 (1976): 1614.
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.
Hi @johnny-sa , I haven't started work, wanted to hear your view, since you spent most time thinking about all of this. What you write sounds like a good plan. Could you please refactor as you suggest, namely:
- keep in
getQuantumDefect
polarisation correction; and - add new
getHydrogenicCorrection
and use it ingetEnergy
, as you suggested.
Once we have this ready, we can merge and release. :) Thank you once again for amazing contribution!
PS. Is there a paper/preprint that uses this? If so, I can add it in getCitationForARC
method.
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.
Hi @nikolasibalic, I added these changes and put two citations for both.
https://journals.aps.org/pra/abstract/10.1103/PhysRevA.14.1614 for the general method of using polarisability for high l states. And
https://journals.aps.org/pra/abstract/10.1103/PhysRevA.100.012501 for using relativistic and FS corrections for these high l states.
Changed format of hydrogenic fine structure splitting (L.S coupling) for high l states. Added references for calculating polarisation energy.
Added rel and FS corrections to high L levels Tidies up code by adding external helper function for hydrogenic corrections Added citations for both
minor typo
@johnny-sa thank you for your contribution, this is merged and released as ARC v3.7.0 |
Overview
These changes are aimed at improving the way arc calculates the quantum defect (and hence energy) of states with high angular momentum (l>5). This will improve accuracy of Stark maps etc. arc has an edge case where quantum defects for states with l >= 5 are approximated by scaling the measured (tabled) value of the g (l=4) quantum defect.
I also include some updates to the Caesium and potassium quantum defects which will improve the calculation of energies. These are from Deiglmayr, Johannes, et al. Physical Review A 93.1 (2016): 013424. and Peper, Michael, et al. Physical Review A 100.1 (2019): 012501.
Methods
The code replaces the current method by direct calculation of the polarisation energy (effective adiabatic polarisation energy) which is more accurate than the current method. This requires two constants$\alpha_{d}$ and $\alpha_{q}$ , the effective dipole and quadrupole polarizability of the Ion species (Cs+, Rb+... etc.) and the expectation values of the hydrogenic wavefunction (where closed forms exist). The former are taken from the available literature which are referenced in the code. The latter is calculated, (r4 and r6). I have also added hydrogenic fine structure splitting to high l states to lift degeneracy.
Examples
Most improvements are to the calculation of h (l=5) levels which are over ~100MHz different from measured. The others improve from ~15 MHz to <5 MHz accuracy.
Details
The current approximation in the code is
This approximation is from [1] and is based on the formula for the polarisation energy (for an introduction see [2]) that is
By approximating$$\langle r^{-4} \rangle \approx \frac{3}{2n^{3}l^{5}}$$ and taking the $\langle r^{-6}\rangle$ expression to be zero, we find
which is the current approximation. Instead, the code calculates the full expression for the polarisation and adds this onto the hydrogenic energy. We also add hydrogenic energy splitting's to states with l>5 (which is set to be zero presently). This is expected and seen in [4] as there is little core penetration in high angular momentum states.
References:
[1] - Gallagher, Thomas F. "Rydberg atoms."
[2] - Freeman and Kleppner Physical Review A 14.5 (1976): 1614.
[3] - Safinya, K. A., T. F. Gallagher, and W. Sandner. Physical Review A 22.6 (1980): 2672.
[4] - Berl, S. J., et al. Physical Review A 102.6 (2020): 062818.
[5] - Unpublished own work (in prep.)