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