55from typing import TYPE_CHECKING , Any , Literal , overload
66
77from 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
99from rydstate .species .element_properties import get_element_properties
1010from rydstate .species .sqdt import get_sqdt
1111from 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." )
0 commit comments