Line data Source code
1 : # SPDX-FileCopyrightText: 2024 PairInteraction Developers 2 : # SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : """Test the Stark map 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_starkmap(generate_reference: bool) -> None: 14 : """Test calculating a Stark map.""" 15 : # Create a basis 16 1 : ket = pi.KetAtom("Rb", n=60, l=0, m=0.5) 17 1 : basis = pi.BasisAtom("Rb", n=(58, 62), l=(0, 2)) 18 1 : print(f"Number of basis states: {basis.number_of_states}") 19 : 20 1 : electric_fields = np.linspace(0, 10, 11) 21 : # Create systems for different values of the electric field 22 1 : systems = [pi.SystemAtom(basis).set_electric_field([0, 0, e], unit="V/cm") for e in electric_fields] 23 : 24 : # Diagonalize the systems in parallel 25 1 : pi.diagonalize(systems, diagonalizer="eigen", sort_by_energy=True) 26 : 27 : # Get the overlap with |ket> 28 1 : overlaps = np.array([system.basis.get_overlaps(ket) for system in systems]) 29 : 30 : # Compare to reference data 31 1 : kets = [repr(ket) for ket in systems[0].basis.kets] 32 1 : eigenenergies = np.array([system.get_eigenenergies(unit="GHz") for system in systems]) 33 1 : eigenvectors = np.array([system.get_eigenbasis().get_coefficients().todense().A1 for system in systems]) 34 : 35 1 : reference_path = REFERENCE_PATHS["stark_map"] 36 1 : if generate_reference: 37 1 : reference_path.mkdir(parents=True, exist_ok=True) 38 1 : np.savetxt(reference_path / "kets.txt", kets, fmt="%s", delimiter="\t") 39 1 : np.savetxt(reference_path / "eigenenergies.txt", eigenenergies) 40 1 : np.savetxt(reference_path / "overlaps.txt", overlaps) 41 1 : pytest.skip("Reference data generated, skipping comparison test") 42 : 43 1 : compare_eigensystem_to_reference(reference_path, eigenenergies, overlaps, eigenvectors, kets)