Line data Source code
1 : # SPDX-FileCopyrightText: 2026 PairInteraction Developers
2 : # SPDX-License-Identifier: LGPL-3.0-or-later
3 :
4 1 : from __future__ import annotations
5 :
6 1 : import logging
7 :
8 1 : import numpy as np
9 1 : import pytest
10 :
11 :
12 1 : def test_real_system_pair_distance_vector_with_y_component_raises() -> None:
13 1 : import pairinteraction.real as pi_real
14 :
15 1 : ket = pi_real.KetAtom("Rb", n=60, l=0, j=0.5, m=0.5)
16 1 : basis = pi_real.BasisAtom("Rb", n=(0, 0), additional_kets=[ket])
17 1 : system = pi_real.SystemAtom(basis)
18 1 : basis_pair = pi_real.BasisPair((system, system))
19 :
20 1 : with pytest.raises(ValueError, match="y-component"):
21 1 : pi_real.SystemPair(basis_pair).set_distance_vector([0, 1, 0], unit="micrometer")
22 :
23 :
24 1 : def test_get_corresponding_energy_symmetrized(caplog: pytest.LogCaptureFixture) -> None:
25 1 : import pairinteraction as pi
26 :
27 1 : ket_a = pi.KetAtom("Rb", n=60, l=0, j=0.5, m=0.5)
28 1 : ket_b = pi.KetAtom("Rb", n=61, l=0, j=0.5, m=0.5)
29 1 : basis_atom = pi.BasisAtom("Rb", n=(58, 63), l=(0, 2), m=(-1.5, 1.5))
30 1 : system_atom = pi.SystemAtom(basis_atom).diagonalize(diagonalizer="eigen")
31 1 : pair_energy = sum(system_atom.get_corresponding_energy(ket, "GHz") for ket in (ket_a, ket_b))
32 1 : basis_pair = pi.BasisPair(
33 : [system_atom, system_atom], m=(1, 1), energy=(pair_energy - 3, pair_energy + 3), energy_unit="GHz"
34 : )
35 1 : assert np.allclose(np.sort(basis_pair.get_overlaps((ket_a, ket_b)))[-2:], 0.5)
36 :
37 : # Without interaction, the ket is distributed over two degenerate states, so the energy is still unique
38 1 : system_pair = pi.SystemPair(basis_pair).diagonalize(diagonalizer="eigen")
39 1 : with caplog.at_level(logging.WARNING):
40 1 : energy = system_pair.get_corresponding_energy((ket_a, ket_b), "GHz")
41 1 : assert "Cannot find the uniquely corresponding" not in caplog.text
42 1 : assert np.isclose(energy, pair_energy, rtol=1e-14)
43 :
44 : # With interaction, the symmetric and antisymmetric states have different energies
45 1 : caplog.clear()
46 1 : system_pair = pi.SystemPair(basis_pair).set_distance(5, unit="micrometer").diagonalize(diagonalizer="eigen")
47 1 : with caplog.at_level(logging.WARNING):
48 1 : system_pair.get_corresponding_energy((ket_a, ket_b), "GHz")
49 1 : assert "Cannot find the uniquely corresponding energy" in caplog.text
|