Skip to content
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

Merged
merged 6 commits into from
Dec 26, 2024

Conversation

johnny-sa
Copy link
Contributor

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

Transition Old Method (GHz) New Method (GHz) Literature (GHz)
Cs 17g -> 17h [3][5] 6.119 6.013 6.018(3), 6.0072(7)
Cs 17h -> 17i [3][5] 1.850 1.855 1.850(1), 1.8513(7)
Cs 15g -> 15h [5] 8.814 8.708 8.7008(4)
Cs 15h -> 15i [5] 2.693 2.681 2.6751(5)
Cs 16i -> 16k [5] 0.801 0.8396 0.840(1)
Cs 17k -> 17l [5] 0.280 0.3058 0.306(1)
Rb 18g -> 18h [4] 2.964 2.8868 2.8704
Rb 18h -> 18i [4] 0.884 0.8985 0.8976
Rb 19g -> 19h [4] 2.526 2.456 2.4447
Rb 19h -> 19i [4] 0.752 0.7657 0.7659

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

$$\delta_{\ell} = \delta_{g}(4/l)^{5}$$

This approximation is from [1] and is based on the formula for the polarisation energy (for an introduction see [2]) that is

$$\delta E = \frac{\delta_{l}}{n^{3}} = -\frac{1}{2}\alpha_{d}\langle r^{-4}\rangle -\frac{1}{2}\alpha_{q}\langle r^{-6}\rangle$$ where $\alpha_{d}$ are constants associated with the Ion (e.g. Cs+).

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

$$\delta_{\ell} \simeq \frac{3\alpha_{\rm d}}{4\ell^{5}} \Rightarrow \ell^{5}\delta_{\ell} = \textrm{const.}$$

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.)

johnny-sa added 3 commits July 3, 2024 15:54
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
@nikolasibalic nikolasibalic self-requested a review July 8, 2024 05:55
@nikolasibalic nikolasibalic added this to the v3.6.0 milestone Jul 8, 2024
@nikolasibalic nikolasibalic changed the base branch from master to draft_v3.6.0 August 3, 2024 12:51
Copy link
Owner

@nikolasibalic nikolasibalic left a 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!

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
Copy link
Owner

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.

Copy link
Owner

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.

Copy link
Contributor Author

@johnny-sa johnny-sa Aug 5, 2024

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.

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.

Copy link
Contributor Author

@johnny-sa johnny-sa Aug 5, 2024

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.

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`

Copy link
Contributor Author

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.

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.

Copy link
Owner

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 (and getHydrogenFS 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.

Copy link
Owner

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.

Copy link
Contributor Author

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 (and getHydrogenFS 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.

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 $\delta_{\ell}$ that much).

[1] - Freeman, Richard R., and Daniel Kleppner. Physical Review A 14.5 (1976): 1614.

Copy link
Owner

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 in getEnergy, 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.

Copy link
Contributor Author

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.

arc/alkali_atom_functions.py Show resolved Hide resolved
@nikolasibalic nikolasibalic mentioned this pull request Aug 3, 2024
Changed format of hydrogenic fine structure splitting (L.S coupling) for high l states.

Added references for calculating polarisation energy.
@nikolasibalic nikolasibalic modified the milestones: v3.6.0, v3.7.0 Oct 4, 2024
Added rel and FS corrections to high L levels
Tidies up code by adding external helper function for hydrogenic corrections
Added citations for both
@nikolasibalic nikolasibalic merged commit 0897399 into nikolasibalic:draft_v3.6.0 Dec 26, 2024
2 checks passed
@nikolasibalic
Copy link
Owner

@johnny-sa thank you for your contribution, this is merged and released as ARC v3.7.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants