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

Generated by: LCOV version 1.16