Line data Source code
1 : # SPDX-FileCopyrightText: 2024 PairInteraction Developers 2 : # SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : """Test the pair potential calculation.""" 5 : 6 1 : import numpy as np 7 1 : import pairinteraction.real as pi 8 1 : import pytest 9 : 10 1 : from .compare_utils import REFERENCE_PATHS, compare_eigensystem_to_reference 11 : 12 : 13 1 : def test_pair_potential(generate_reference: bool) -> None: 14 : """Test calculating a pair potential.""" 15 : # Create a single-atom system 16 1 : basis = pi.BasisAtom("Rb", n=(58, 62), l=(0, 2)) 17 1 : print(f"Number of single-atom basis states: {basis.number_of_states}") 18 : 19 1 : system = pi.SystemAtom(basis) 20 : 21 : # Create two-atom systems for different interatomic distances 22 1 : ket = pi.KetAtom("Rb", n=60, l=0, m=0.5) 23 1 : delta_energy = 3 # GHz 24 1 : min_energy = 2 * ket.get_energy(unit="GHz") - delta_energy 25 1 : max_energy = 2 * ket.get_energy(unit="GHz") + delta_energy 26 : 27 1 : basis_pair = pi.BasisPair([system, system], energy=(min_energy, max_energy), energy_unit="GHz", m=(1, 1)) 28 1 : print(f"Number of two-atom basis states: {basis_pair.number_of_states}") 29 : 30 1 : distances = np.linspace(1, 5, 5) 31 1 : system_pairs = [pi.SystemPair(basis_pair).set_distance(d, unit="micrometer") for d in distances] 32 : 33 : # Diagonalize the systems in parallel 34 1 : pi.diagonalize(system_pairs, diagonalizer="eigen", sort_by_energy=True) 35 : 36 : # Get the overlap with |ket, ket> 37 1 : overlaps = np.array([system.get_eigenbasis().get_overlaps([ket, ket]) for system in system_pairs]) 38 : 39 : # Ensure that the overlaps sum up to one 40 1 : np.testing.assert_allclose(np.sum(overlaps, axis=1), np.ones(5)) 41 : 42 : # Compare to reference data 43 1 : kets = [repr(ket) for ket in basis_pair.kets] 44 1 : eigenenergies = np.array([system.get_eigenenergies(unit="GHz") for system in system_pairs]) 45 1 : eigenvectors = np.array([system.get_eigenbasis().get_coefficients().todense().A1 for system in system_pairs]) 46 : 47 1 : reference_path = REFERENCE_PATHS["pair_potential"] 48 1 : if generate_reference: 49 1 : reference_path.mkdir(parents=True, exist_ok=True) 50 1 : np.savetxt(reference_path / "kets.txt", kets, fmt="%s", delimiter="\t") 51 1 : np.savetxt(reference_path / "eigenenergies.txt", eigenenergies) 52 1 : np.savetxt(reference_path / "overlaps.txt", overlaps) 53 1 : pytest.skip("Reference data generated, skipping comparison test") 54 : 55 1 : compare_eigensystem_to_reference(reference_path, eigenenergies, overlaps, eigenvectors, kets)