Line data Source code
1 : // SPDX-FileCopyrightText: 2024 PairInteraction Developers
2 : // SPDX-License-Identifier: LGPL-3.0-or-later
3 :
4 : #include "pairinteraction/database/Database.hpp"
5 :
6 : #include "pairinteraction/basis/BasisAtom.hpp"
7 : #include "pairinteraction/database/AtomDescriptionByParameters.hpp"
8 : #include "pairinteraction/database/AtomDescriptionByRanges.hpp"
9 : #include "pairinteraction/enums/OperatorType.hpp"
10 : #include "pairinteraction/ket/KetAtom.hpp"
11 :
12 : #include <doctest/doctest.h>
13 :
14 : namespace pairinteraction {
15 1 : DOCTEST_TEST_CASE("get a KetAtom") {
16 1 : Database &database = Database::get_global_instance();
17 :
18 1 : AtomDescriptionByParameters description;
19 4 : description.quantum_numbers = {{"n", 60}, {"l", 0}, {"m", 0.5}};
20 :
21 1 : auto ket = database.get_ket("Rb", description);
22 1 : DOCTEST_REQUIRE(ket != nullptr);
23 2 : }
24 :
25 1 : DOCTEST_TEST_CASE("too large quantum number m") {
26 1 : Database &database = Database::get_global_instance();
27 :
28 1 : AtomDescriptionByParameters description;
29 4 : description.quantum_numbers = {{"n", 60}, {"l", 0}, {"m", 1.5}};
30 :
31 3 : DOCTEST_CHECK_THROWS(database.get_ket("Rb", description));
32 2 : }
33 :
34 1 : DOCTEST_TEST_CASE("not uniquely specified ket") {
35 1 : Database &database = Database::get_global_instance();
36 :
37 1 : AtomDescriptionByParameters description;
38 4 : description.quantum_numbers = {{"n", 60}, {"l", 0.9}, {"m", 0.5}};
39 :
40 3 : DOCTEST_CHECK_THROWS(database.get_ket("Rb", description));
41 2 : }
42 :
43 1 : DOCTEST_TEST_CASE("quantum number not stored in the database table for get_ket") {
44 1 : Database &database = Database::get_global_instance();
45 :
46 1 : AtomDescriptionByParameters description;
47 4 : description.quantum_numbers = {{"n", 60}, {"m", 0.5}, {"not_a_quantum_number", 1}};
48 :
49 3 : DOCTEST_CHECK_THROWS_WITH_AS(
50 : database.get_ket("Rb", description),
51 : "The quantum number 'not_a_quantum_number' is not stored in the database table for species "
52 : "'Rb'.",
53 : std::invalid_argument);
54 2 : }
55 :
56 1 : DOCTEST_TEST_CASE("quantum number not stored in the database table for get_basis") {
57 1 : Database &database = Database::get_global_instance();
58 :
59 1 : AtomDescriptionByRanges description;
60 4 : description.quantum_number_ranges = {{"not_a_quantum_number", {1, 2}}};
61 :
62 4 : DOCTEST_CHECK_THROWS_WITH_AS(
63 : database.get_basis<double>("Yb171_mqdt", description, {}),
64 : "The quantum number 'not_a_quantum_number' is not stored in the database table for species "
65 : "'Yb171_mqdt'.",
66 : std::invalid_argument);
67 5 : }
68 :
69 1 : DOCTEST_TEST_CASE("uniquely specified ket") {
70 1 : Database &database = Database::get_global_instance();
71 :
72 1 : AtomDescriptionByParameters description;
73 5 : description.quantum_numbers = {{"n", 60}, {"l", 0.9}, {"j", 0.5}, {"m", 0.5}};
74 :
75 1 : DOCTEST_CHECK_NOTHROW(database.get_ket("Rb", description));
76 2 : }
77 :
78 1 : DOCTEST_TEST_CASE("get a BasisAtom") {
79 1 : Database &database = Database::get_global_instance();
80 :
81 1 : AtomDescriptionByRanges description;
82 7 : description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
83 :
84 1 : auto basis = database.get_basis<double>("Rb", description, {});
85 :
86 1 : DOCTEST_CHECK(basis->get_number_of_states() > 0);
87 7 : }
88 :
89 1 : DOCTEST_TEST_CASE("get atomic matrix elements") {
90 1 : Database &database = Database::get_global_instance();
91 :
92 1 : AtomDescriptionByRanges description;
93 7 : description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
94 :
95 1 : auto basis = database.get_basis<double>("Rb", description, {});
96 :
97 : auto dipole = database.get_matrix_elements_in_canonical_basis<double>(
98 1 : basis, basis, OperatorType::ELECTRIC_DIPOLE, 0);
99 :
100 1 : DOCTEST_MESSAGE("Number of basis states: ", basis->get_number_of_states());
101 1 : DOCTEST_MESSAGE("Number of non-zero entries: ", dipole.nonZeros());
102 7 : }
103 :
104 1 : DOCTEST_TEST_CASE("atomic matrix elements reject bases from a different database") {
105 1 : Database &database = Database::get_global_instance();
106 :
107 1 : AtomDescriptionByRanges description;
108 7 : description.quantum_number_ranges = {{"n", {60, 60}}, {"l", {0, 1}}};
109 :
110 1 : auto basis = database.get_basis<double>("Rb", description, {});
111 :
112 1 : Database other_database(database.get_download_missing(), database.get_use_cache(),
113 2 : database.get_database_dir());
114 :
115 3 : DOCTEST_CHECK_THROWS_WITH_AS(
116 : other_database.get_matrix_elements_in_canonical_basis<double>(
117 : basis, basis, OperatorType::ELECTRIC_DIPOLE, 0),
118 : "The initial and final bases must belong to the Database instance used for the matrix "
119 : "element calculation.",
120 : std::invalid_argument);
121 7 : }
122 : } // namespace pairinteraction
|