Line data Source code
1 : # SPDX-FileCopyrightText: 2024 PairInteraction Developers 2 : # SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 1 : from __future__ import annotations 5 : 6 1 : from typing import TYPE_CHECKING 7 : 8 1 : import numpy as np 9 1 : from pairinteraction.units import AtomicUnits, QuantityScalar, ureg 10 : 11 : if TYPE_CHECKING: 12 : from .utils import PairinteractionModule 13 : 14 : 15 1 : def test_magnetic(pi_module: PairinteractionModule) -> None: 16 : """Test magnetic units.""" 17 1 : ket = pi_module.KetAtom("Rb", n=60, l=0, m=0.5) 18 : 19 1 : mu = ket.get_matrix_element(ket, "magnetic_dipole", q=0) 20 1 : mu = mu.to("bohr_magneton") 21 1 : lande_factor = 2.002319304363 22 1 : assert np.isclose(mu.magnitude, -1 / 2 * lande_factor) 23 : 24 : # check magnetic field conversion is correct 25 1 : magnetic_field = QuantityScalar.from_unit(1, "gauss", "magnetic_field") 26 1 : magnetic_field_pint = ureg.Quantity(1, "gauss").to("T", "Gaussian") 27 1 : assert np.isclose(magnetic_field.to_au(), magnetic_field_pint.to_base_units().magnitude) 28 : 29 : # such that mu * magnetic_field is of dimension energy 30 1 : zeeman_energy = -mu * magnetic_field_pint 31 1 : assert zeeman_energy.dimensionality == AtomicUnits["energy"].dimensionality 32 : 33 : # check against constructed Hamiltonian 34 1 : basis = pi_module.BasisAtom("Rb", n=(1, 1), additional_kets=[ket]) 35 1 : system = pi_module.SystemAtom(basis) 36 1 : system.set_diamagnetism_enabled(False).set_magnetic_field([0, 0, magnetic_field_pint]) 37 1 : zeeman_energy_from_hamiltonian = system.get_hamiltonian("MHz")[0, 0] - ket.get_energy("MHz") 38 1 : assert np.isclose(zeeman_energy_from_hamiltonian, zeeman_energy.to("MHz", "spectroscopy").magnitude) 39 : 40 : 41 1 : def test_electric_dipole(pi_module: PairinteractionModule) -> None: 42 : """Test electric dipole units.""" 43 1 : ket_a = pi_module.KetAtom("Rb", n=60, l=0, m=0.5) 44 1 : ket_b = pi_module.KetAtom("Rb", n=61, l=0, m=0.5) 45 1 : ket_c = pi_module.KetAtom("Rb", n=60, l=1, j=3 / 2, m=0.5) 46 : 47 1 : dipole_a_c = ket_a.get_matrix_element(ket_c, "electric_dipole", q=0) 48 1 : dipole_b_c = ket_b.get_matrix_element(ket_c, "electric_dipole", q=0) 49 : 50 1 : kappa = ureg.Quantity(1 / (4 * np.pi), "1 / epsilon_0") 51 1 : c3 = kappa * dipole_a_c * dipole_b_c 52 1 : c3 = c3 * ureg.Quantity(1, "GHz") / ureg.Quantity(1, "GHz").to("hartree", "spectroscopy") 53 1 : c3 = c3.to("GHz micrometer^3") 54 : 55 1 : assert c3.magnitude == QuantityScalar.from_pint(kappa * dipole_a_c * dipole_b_c, "c3").to_unit("GHz micrometer^3") 56 : 57 1 : distance = ureg.Quantity(10, "micrometer") 58 1 : basis = pi_module.BasisAtom("Rb", additional_kets=[ket_a, ket_b, ket_c]) 59 1 : system = pi_module.SystemAtom(basis) 60 1 : basis_pair = pi_module.BasisPair([system, system]) 61 1 : system_pair = pi_module.SystemPair(basis_pair) 62 1 : system_pair.set_interaction_order(3) 63 1 : system_pair.set_distance(distance) 64 1 : system.get_hamiltonian() 65 : 66 1 : ket_ab_idx = np.argmax(basis_pair.get_overlaps([ket_a, ket_b])) 67 1 : ket_cc_idx = np.argmax(basis_pair.get_overlaps([ket_c, ket_c])) 68 1 : hamiltonian = system_pair.get_hamiltonian("GHz") * distance.to("micrometer").magnitude ** 3 # GHz * micrometer^3 69 : 70 1 : assert np.isclose(-2 * c3.magnitude, hamiltonian[ket_ab_idx, ket_cc_idx]) 71 1 : assert np.isclose(-2 * c3.magnitude, 5.73507543166919)