pairinteraction
A Rydberg Interaction Calculator
SystemPair.test.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2024 Pairinteraction Developers
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
5
19
20#include <doctest/doctest.h>
21#include <fmt/ranges.h>
22
23namespace pairinteraction {
24
25constexpr double VOLT_PER_CM_IN_ATOMIC_UNITS = 1 / 5.14220675112e9;
26constexpr double UM_IN_ATOMIC_UNITS = 1 / 5.29177210544e-5;
27constexpr double HARTREE_IN_GHZ = 6579683.920501762;
28
29DOCTEST_TEST_CASE("construct a pair Hamiltonian") {
30 auto &database = Database::get_global_instance();
31 auto diagonalizer = DiagonalizerEigen<double>();
32
33 // Construct and diagonalize the constituent systems
34 auto basis = BasisAtomCreator<double>()
35 .set_species("Rb")
36 .restrict_quantum_number_n(60, 61)
37 .restrict_quantum_number_l(0, 1)
38 .restrict_quantum_number_m(-0.5, 0.5)
39 .create(database);
40
41 SystemAtom<double> system1(basis);
42 SystemAtom<double> system2(basis);
45 diagonalize<SystemAtom<double>>({system1, system2}, diagonalizer);
46
47 // Construct and diagonalize the system_pair
48 auto basis_pair = BasisPairCreator<double>().add(system1).add(system2).create();
49 DOCTEST_MESSAGE("Number of states in pair basis: ", basis_pair->get_number_of_states());
50
51 auto system_pair = SystemPair<double>(basis_pair);
52 system_pair.set_distance_vector({0, 0, 3 * UM_IN_ATOMIC_UNITS});
53 system_pair.diagonalize(diagonalizer);
54
55 // Print the largest and smallest eigenenergies
56 auto eigenenergies = system_pair.get_eigenenergies();
57 DOCTEST_MESSAGE("Lowest energy: ", eigenenergies.minCoeff());
58 DOCTEST_MESSAGE("Highest energy: ", eigenenergies.maxCoeff());
59}
60
61#ifdef WITH_LAPACKE
62DOCTEST_TEST_CASE("diagonalize with lapacke_evr") {
63 auto &database = Database::get_global_instance();
64 auto diagonalizer = DiagonalizerLapackeEvr<double>();
65
66 // Construct the state of interest
67 auto ket = KetAtomCreator()
68 .set_species("Rb")
69 .set_quantum_number_n(60)
70 .set_quantum_number_l(0)
71 .set_quantum_number_j(0.5)
72 .set_quantum_number_m(0.5)
73 .create(database);
74
75 // Construct and diagonalize the constituent systems
76 auto basis = BasisAtomCreator<double>()
77 .set_species("Rb")
78 .restrict_quantum_number_n(ket->get_quantum_number_n() - 3,
79 ket->get_quantum_number_n() + 3)
80 .restrict_quantum_number_l(ket->get_quantum_number_l() - 1,
81 ket->get_quantum_number_l() + 1)
82 .create(database);
83 SystemAtom<double> system(basis);
84
85 // Construct and diagonalize the system_pair
86 auto basis_pair = BasisPairCreator<double>()
87 .add(system)
88 .add(system)
89 .restrict_energy(2 * ket->get_energy() - 2 / HARTREE_IN_GHZ,
90 2 * ket->get_energy() + 2 / HARTREE_IN_GHZ)
91 .create();
92 DOCTEST_MESSAGE("Number of states in pair basis: ", basis_pair->get_number_of_states());
93
94 auto system_pair = SystemPair<double>(basis_pair);
95 system_pair.set_distance_vector({0, 0, 3 * UM_IN_ATOMIC_UNITS});
96 system_pair.diagonalize(diagonalizer, 2 * ket->get_energy() - 0.5 / HARTREE_IN_GHZ,
97 2 * ket->get_energy() + 0.5 / HARTREE_IN_GHZ);
98
99 // Print the largest and smallest eigenenergies
100 auto eigenenergies = system_pair.get_eigenenergies();
101 DOCTEST_MESSAGE("Lowest energy: ", eigenenergies.minCoeff());
102 DOCTEST_MESSAGE("Highest energy: ", eigenenergies.maxCoeff());
103}
104#endif
105} // namespace pairinteraction
Builder class for creating BasisAtom objects.
BasisAtomCreator< Scalar > & set_species(const std::string &value)
BasisPairCreator< Scalar > & add(const SystemAtom< Scalar > &system_atom)
static Database & get_global_instance()
Definition: Database.cpp:1068
Type & set_electric_field(const std::array< real_t, 3 > &field)
Definition: SystemAtom.cpp:26
constexpr double UM_IN_ATOMIC_UNITS
constexpr double HARTREE_IN_GHZ
DOCTEST_TEST_CASE("create a basis for strontium 88")
constexpr double VOLT_PER_CM_IN_ATOMIC_UNITS