Skip to content

Commit 259d39a

Browse files
RydbergKet matrix_element also allow angular operators
1 parent 3a0bab8 commit 259d39a

2 files changed

Lines changed: 24 additions & 10 deletions

File tree

src/rydstate/rydberg_state/rydberg_ket.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import TYPE_CHECKING, Any, Literal, overload
66

77
from rydstate.angular.angular_ket import AngularKetLS
8-
from rydstate.angular.utils import is_unknown
8+
from rydstate.angular.utils import is_angular_momentum_quantum_number, is_angular_operator_type, is_unknown
99
from rydstate.species.element_properties import get_element_properties
1010
from rydstate.species.sqdt import get_sqdt
1111
from rydstate.units import MatrixElementOperatorRanks, ureg
@@ -93,13 +93,15 @@ def calc_reduced_matrix_element(
9393
if unit == "a.u.":
9494
return matrix_element_au
9595

96-
k_radial, _k_angular = MatrixElementOperatorRanks[operator]
96+
k_radial, _k_angular = self._get_ks(operator)
9797
radial_unit: PintFloat = ureg.Quantity(1, "bohr_radius") ** k_radial
9898
matrix_element_unit: PintFloat
9999
if operator == "magnetic_dipole":
100100
matrix_element_unit = radial_unit * ureg.Quantity(2, "bohr_magneton")
101101
elif operator.startswith("electric_"):
102102
matrix_element_unit = radial_unit * ureg.Quantity(1, "e")
103+
elif is_angular_operator_type(operator):
104+
matrix_element_unit = ureg.Quantity(1, "dimensionless")
103105
else:
104106
raise NotImplementedError(f"Operator {operator} not implemented.")
105107

@@ -114,12 +116,7 @@ def _calc_reduced_matrix_element_au(self, other: RydbergKet, operator: MatrixEle
114116
matrix_element += self._calc_reduced_matrix_element_au(other, "electric_dipole_core")
115117
return matrix_element
116118

117-
try:
118-
k_radial, k_angular = MatrixElementOperatorRanks[operator]
119-
except KeyError as err:
120-
raise ValueError(
121-
f"Operator {operator} not supported, must be one of {list(MatrixElementOperatorRanks.keys())}."
122-
) from err
119+
k_radial, k_angular = self._get_ks(operator)
123120

124121
if operator == "magnetic_dipole":
125122
# Magnetic dipole operator: mu = - mu_B (g_l <l_tot> + g_s <s_tot>)
@@ -142,7 +139,9 @@ def _calc_reduced_matrix_element_au(self, other: RydbergKet, operator: MatrixEle
142139
)
143140
# Prefactor sqrt(4 pi / (2 k_angular + 1)) for the electric multipole operators, precomputed for performance
144141
prefactor = ELECTRIC_MULTIPOLE_PREFACTORS[k_angular]
145-
142+
elif is_angular_operator_type(operator):
143+
prefactor = 1
144+
angular_matrix_element = self.angular.calc_reduced_matrix_element(other.angular, operator, k_angular)
146145
else:
147146
raise NotImplementedError(f"Operator {operator} not implemented.")
148147

@@ -241,7 +240,19 @@ def calc_matrix_element(
241240
The matrix element for the given operator.
242241
243242
"""
244-
_k_radial, k_angular = MatrixElementOperatorRanks[operator]
243+
_k_radial, k_angular = self._get_ks(operator)
245244
prefactor = self.angular._calc_wigner_eckart_prefactor(other.angular, k_angular, q) # noqa: SLF001
246245
reduced_matrix_element = self.calc_reduced_matrix_element(other, operator, unit)
247246
return prefactor * reduced_matrix_element
247+
248+
def _get_ks(self, operator: MatrixElementOperator) -> tuple[int, int]:
249+
"""Get the k_radial and k_angular for the given operator."""
250+
if operator in MatrixElementOperatorRanks:
251+
return MatrixElementOperatorRanks[operator]
252+
if is_angular_operator_type(operator):
253+
k_radial = 0
254+
if operator.startswith("identity_"):
255+
return k_radial, 0
256+
if is_angular_momentum_quantum_number(operator):
257+
return k_radial, 1
258+
raise ValueError(f"Operator {operator} not supported.")

src/rydstate/units.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
from pint import UnitRegistry
66

7+
from rydstate.angular.utils import AngularOperatorType
8+
79
if TYPE_CHECKING:
810
from typing import TypeAlias
911

@@ -26,6 +28,7 @@
2628
"electric_quadrupole",
2729
"electric_octupole",
2830
"electric_quadrupole_zero",
31+
AngularOperatorType,
2932
]
3033
MatrixElementOperatorRanks: dict[MatrixElementOperator, tuple[int, int]] = {
3134
# "operator": (k_radial, k_angular)

0 commit comments

Comments
 (0)