LCOV - code coverage report
Current view: top level - tests - test_diamagnetism.py (source / functions) Hit Total Coverage
Test: coverage.info Lines: 27 27 100.0 %
Date: 2025-04-29 15:59:54 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             : """Test diamagnetic interactions."""
       5             : 
       6           1 : import numpy as np
       7             : 
       8           1 : import pairinteraction.complex as pi
       9             : 
      10             : 
      11           1 : def test_diamagnetism() -> None:
      12             :     """Test calculating diamagnetic interactions."""
      13             :     # Create a basis
      14           1 :     ket = pi.KetAtom("Rb", n=60, l=0, j=0.5, m=0.5)
      15           1 :     basis = pi.BasisAtom("Rb", n=(ket.n - 2, ket.n + 2), l=(0, ket.l + 2))
      16           1 :     print(f"Number of basis states: {basis.number_of_states}")
      17             : 
      18             :     # Create system for a magnetic field of 1000 G
      19           1 :     bfield = 1000
      20           1 :     system = pi.SystemAtom(basis).set_magnetic_field([0, 0, bfield], unit="G").set_diamagnetism_enabled(True)
      21             : 
      22             :     # Diagonalize the system
      23           1 :     system = system.diagonalize(diagonalizer="eigen", sort_by_energy=True)
      24             : 
      25             :     # Get eigenenergies and the overlap with |ket>
      26           1 :     overlaps = system.basis.get_overlaps(ket)
      27           1 :     eigenenergies = system.get_eigenenergies(unit="GHz") - ket.get_energy(unit="GHz")
      28             : 
      29             :     # Get the overlap and eigenenergy corresponding to |ket>
      30           1 :     idx = np.argmax(overlaps)
      31           1 :     overlap = overlaps[idx]
      32           1 :     eigenenergy = eigenenergies[idx]
      33           1 :     print(
      34             :         f"The state |{ket}> in a field of {bfield} G has an energy of {eigenenergy:.3f} GHz "
      35             :         f"and overlap of {overlap:.2%} with the unperturbed state."
      36             :     )
      37             : 
      38             :     # Compare to reference data
      39           1 :     assert np.isclose(overlap, system.basis.get_corresponding_state(ket).get_overlap(ket))
      40           1 :     assert np.isclose(overlap, 0.9823116102876408, atol=1e-10)
      41           1 :     assert np.isclose(eigenenergy, 4.113262772909366)
      42             : 
      43             : 
      44           1 : def test_diamagnetism_angle_dependence() -> None:
      45             :     """Test calculating diamagnetic interactions for differently aligned magnetic fields."""
      46             :     # Create a basis
      47           1 :     basis = pi.BasisAtom("Rb", n=(58, 62), l=(0, 2))
      48             : 
      49             :     # Create systems for fields in different directions
      50           1 :     bfield = 1000
      51           1 :     system_x = pi.SystemAtom(basis).set_magnetic_field([bfield, 0, 0], unit="G").set_diamagnetism_enabled(True)
      52           1 :     system_y = pi.SystemAtom(basis).set_magnetic_field([0, bfield, 0], unit="G").set_diamagnetism_enabled(True)
      53           1 :     system_z = pi.SystemAtom(basis).set_magnetic_field([0, 0, bfield], unit="G").set_diamagnetism_enabled(True)
      54             : 
      55             :     # Diagonalize the systems in parallel
      56           1 :     pi.diagonalize([system_x, system_y, system_z], diagonalizer="eigen", sort_by_energy=True)
      57             : 
      58             :     # Ensure that all eigenenergies are the same
      59           1 :     np.testing.assert_allclose(system_x.get_eigenenergies(unit="GHz"), system_y.get_eigenenergies(unit="GHz"))
      60           1 :     np.testing.assert_allclose(system_x.get_eigenenergies(unit="GHz"), system_z.get_eigenenergies(unit="GHz"))

Generated by: LCOV version 1.16