21#include <doctest/doctest.h>
34 .restrict_quantum_number_n(58, 62)
35 .restrict_quantum_number_l(0, 2)
57 .restrict_energy(min_energy, max_energy)
58 .restrict_quantum_number_m(1, 1)
63 .restrict_energy(min_energy, max_energy)
64 .restrict_quantum_number_m(1, 1)
67 DOCTEST_SUBCASE(
"check equality of kets") {
69 auto ket1a = basis_pair_a->get_kets()[0];
70 auto ket1b = basis_pair_b->get_kets()[0];
71 auto ket2a = basis_pair_a->get_kets()[1];
72 auto ket2b = basis_pair_b->get_kets()[1];
73 DOCTEST_CHECK(*ket1a == *ket1a);
74 DOCTEST_CHECK(*ket2a == *ket2a);
75 DOCTEST_CHECK(*ket1a != *ket2b);
76 DOCTEST_CHECK(*ket2a != *ket1b);
79 DOCTEST_CHECK(*ket1a != *ket1b);
80 DOCTEST_CHECK(*ket2a != *ket2b);
83 DOCTEST_SUBCASE(
"check overlap") {
84 auto overlaps = basis_pair_a->get_overlaps(ket, ket);
87 DOCTEST_CHECK(overlaps.sum() == doctest::Approx(0.9107819201));
90 DOCTEST_SUBCASE(
"get the atomic states constituting a ket of the basis_pair") {
91 auto atomic_states = basis_pair_a->get_kets()[0]->get_atomic_states();
92 DOCTEST_CHECK(atomic_states.size() == 2);
93 DOCTEST_CHECK(atomic_states[0]->get_number_of_states() == 1);
94 DOCTEST_CHECK(atomic_states[0]->get_number_of_kets() == basis->get_number_of_kets());
105 .restrict_quantum_number_n(58, 62)
106 .restrict_quantum_number_l(0, 2)
126 .restrict_energy(min_energy, max_energy)
127 .restrict_quantum_number_m(1, 1)
135 DOCTEST_SUBCASE(
"check dimensions") {
137 auto matrix_elements_all = basis_pair_unperturbed->get_matrix_elements(
140 DOCTEST_CHECK(matrix_elements_all.rows() == basis_pair_unperturbed->get_number_of_states());
141 DOCTEST_CHECK(matrix_elements_all.cols() == basis_pair_unperturbed->get_number_of_states());
144 auto ket_pair = basis_pair_unperturbed->get_kets()[0];
145 auto matrix_elements_ket_pair = basis_pair_unperturbed->get_matrix_elements(
147 DOCTEST_CHECK(matrix_elements_ket_pair.size() ==
148 basis_pair_unperturbed->get_number_of_states());
152 DOCTEST_CHECK(ref.isApprox(matrix_elements_ket_pair, 1e-11));
156 auto matrix_elements_product = basis_pair->get_matrix_elements(
158 DOCTEST_CHECK(matrix_elements_product.rows() ==
159 basis->get_number_of_states() * basis->get_number_of_states());
160 DOCTEST_CHECK(matrix_elements_product.cols() == basis_pair->get_number_of_states());
163 auto matrix_elements_ket = basis_pair->get_matrix_elements(
165 DOCTEST_CHECK(matrix_elements_ket.size() == basis_pair->get_number_of_states());
168 DOCTEST_SUBCASE(
"check matrix elements") {
177 Eigen::SparseMatrix<double, Eigen::RowMajor> tmp = -basis_pair->get_matrix_elements(
186 Eigen::SparseMatrix<double, Eigen::RowMajor> tmp = -2 *
197 const auto &ref = system_pair.get_matrix();
198 DOCTEST_CHECK(ref.isApprox(hamiltonian, 1e-11));
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()
Builder class for creating KetAtom objects.
KetAtomCreator & set_quantum_number_n(int value)
std::shared_ptr< const KetAtom > create(Database &database) const
KetAtomCreator & set_quantum_number_l(double value)
KetAtomCreator & set_species(const std::string &value)
KetAtomCreator & set_quantum_number_m(double value)
Type & set_electric_field(const std::array< real_t, 3 > &field)
Type & set_distance_vector(const std::array< real_t, 3 > &vector)
System< Derived > & diagonalize(const DiagonalizerInterface< scalar_t > &diagonalizer, std::optional< real_t > min_eigenenergy={}, std::optional< real_t > max_eigenenergy={}, double rtol=1e-6)
std::shared_ptr< const basis_t > get_eigenbasis() const
Matrix< Type, Dynamic, 1 > VectorX
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