LCOV - code coverage report
Current view: top level - tests - test_diamagnetism.py (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 29 29
Test Date: 2026-11-02 09:44:19 Functions: 100.0 % 2 2

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

Generated by: LCOV version 2.0-1