LCOV - code coverage report
Current view: top level - tests - test_units.py (source / functions) Hit Total Coverage
Test: coverage.info Lines: 44 44 100.0 %
Date: 2025-12-08 07:47:12 Functions: 2 4 50.0 %

          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)

Generated by: LCOV version 1.16