@@ -61,7 +61,7 @@ def calc_reduced_matrix_element(
6161 @overload
6262 def calc_reduced_matrix_element (self , other : RydbergKet , operator : MatrixElementOperator , unit : str ) -> float : ...
6363
64- def calc_reduced_matrix_element ( # noqa: C901, PLR0912
64+ def calc_reduced_matrix_element (
6565 self , other : RydbergKet , operator : MatrixElementOperator , unit : str | None = None
6666 ) -> PintFloat | float :
6767 r"""Calculate the reduced matrix element.
@@ -88,10 +88,30 @@ def calc_reduced_matrix_element( # noqa: C901, PLR0912
8888 The reduced matrix element for the given operator.
8989
9090 """
91+ matrix_element_au = self ._calc_reduced_matrix_element_au (other , operator )
92+
93+ if unit == "a.u." :
94+ return matrix_element_au
95+
96+ k_radial , _k_angular = MatrixElementOperatorRanks [operator ]
97+ radial_unit : PintFloat = ureg .Quantity (1 , "bohr_radius" ) ** k_radial
98+ matrix_element_unit : PintFloat
99+ if operator == "magnetic_dipole" :
100+ matrix_element_unit = radial_unit * ureg .Quantity (2 , "bohr_magneton" )
101+ elif operator .startswith ("electric_" ):
102+ matrix_element_unit = radial_unit * ureg .Quantity (1 , "e" )
103+ else :
104+ raise NotImplementedError (f"Operator { operator } not implemented." )
105+
106+ if unit is None :
107+ return matrix_element_au * matrix_element_unit .to_base_units () # type: ignore [no-any-return]
108+ return matrix_element_au * matrix_element_unit .to (unit ).magnitude
109+
110+ def _calc_reduced_matrix_element_au (self , other : RydbergKet , operator : MatrixElementOperator ) -> float :
91111 if operator == "electric_dipole" :
92- matrix_element = self .calc_reduced_matrix_element (other , "electric_dipole_rydberg" , unit )
112+ matrix_element = self ._calc_reduced_matrix_element_au (other , "electric_dipole_rydberg" )
93113 if self .element_properties .number_valence_electrons == 2 :
94- matrix_element += self .calc_reduced_matrix_element (other , "electric_dipole_core" , unit )
114+ matrix_element += self ._calc_reduced_matrix_element_au (other , "electric_dipole_core" )
95115 return matrix_element
96116
97117 try :
@@ -127,33 +147,19 @@ def calc_reduced_matrix_element( # noqa: C901, PLR0912
127147 raise NotImplementedError (f"Operator { operator } not implemented." )
128148
129149 if angular_matrix_element == 0 :
130- return 0
150+ return 0.0
131151
132152 if "core" not in operator :
133153 radial_matrix_element = self .radial .calc_matrix_element (other .radial , k_radial , unit = "a.u." )
134154 matrix_element = prefactor * angular_matrix_element * radial_matrix_element
135155 else :
136156 core_radial_matrix_element = self ._calc_core_radial_matrix_element_au (other , k_radial )
137157 if core_radial_matrix_element == 0 :
138- return 0
158+ return 0.0
139159 rydberg_radial_overlap = self .radial .calc_overlap (other .radial )
140160 matrix_element = prefactor * angular_matrix_element * core_radial_matrix_element * rydberg_radial_overlap
141161
142- if unit == "a.u." :
143- return matrix_element
144-
145- radial_unit : PintFloat = ureg .Quantity (1 , "bohr_radius" ) ** k_radial
146- matrix_element_unit : PintFloat
147- if operator == "magnetic_dipole" :
148- matrix_element_unit = radial_unit * ureg .Quantity (2 , "bohr_magneton" )
149- elif operator .startswith ("electric_" ):
150- matrix_element_unit = radial_unit * ureg .Quantity (1 , "e" )
151- else :
152- raise NotImplementedError (f"Operator { operator } not implemented." )
153-
154- if unit is None :
155- return matrix_element * matrix_element_unit .to_base_units () # type: ignore [no-any-return]
156- return matrix_element * matrix_element_unit .to (unit ).magnitude
162+ return matrix_element
157163
158164 def _calc_core_radial_matrix_element_au (self , other : RydbergKet , k_radial : int ) -> float :
159165 r"""Calculate the radial matrix element :math:`\langle self_c | r^{k_{radial}} | other_c \rangle` in a.u.
0 commit comments