pairinteraction
A Rydberg Interaction Calculator
BasisAtomCreator.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
10
11namespace pairinteraction {
12template <typename Scalar>
14 species.emplace(value);
15 return *this;
16}
17
18template <typename Scalar>
20 range_energy = {min, max};
21 return *this;
22}
23
24template <typename Scalar>
26 real_t max) {
27 if (2 * min != std::rint(2 * min) || 2 * max != std::rint(2 * max)) {
28 throw std::invalid_argument("Quantum number f must be an integer or half-integer.");
29 }
30 range_quantum_number_f = {min, max};
31 return *this;
32}
33
34template <typename Scalar>
36 real_t max) {
37 if (2 * min != std::rint(2 * min) || 2 * max != std::rint(2 * max)) {
38 throw std::invalid_argument("Quantum number m must be an integer or half-integer.");
39 }
40 range_quantum_number_m = {min, max};
41 return *this;
42}
43
44template <typename Scalar>
46 parity = value;
47 return *this;
48}
49
50template <typename Scalar>
52 range_quantum_number_n = {min, max};
53 return *this;
54}
55
56template <typename Scalar>
58 real_t max) {
59 range_quantum_number_nu = {min, max};
60 return *this;
61}
62
63template <typename Scalar>
65 real_t max) {
66 range_quantum_number_nui = {min, max};
67 return *this;
68}
69
70template <typename Scalar>
72 real_t max) {
73 range_quantum_number_l = {min, max};
74 return *this;
75}
76
77template <typename Scalar>
79 real_t max) {
80 range_quantum_number_s = {min, max};
81 return *this;
82}
83
84template <typename Scalar>
86 real_t max) {
87 range_quantum_number_j = {min, max};
88 return *this;
89}
90
91template <typename Scalar>
93 real_t max) {
94 range_quantum_number_l_ryd = {min, max};
95 return *this;
96}
97
98template <typename Scalar>
100 real_t max) {
101 range_quantum_number_j_ryd = {min, max};
102 return *this;
103}
104
105template <typename Scalar>
107BasisAtomCreator<Scalar>::append_ket(const std::shared_ptr<const ket_t> &ket) {
108 if (additional_ket_species.has_value() &&
109 additional_ket_species.value() != ket->get_species()) {
110 throw std::invalid_argument("Species mismatch.");
111 }
112 additional_ket_species.emplace(ket->get_species());
113 additional_ket_ids.push_back(ket->get_id_in_database());
114 return *this;
115}
116
117template <typename Scalar>
118std::shared_ptr<const BasisAtom<Scalar>>
120
121 if (species.has_value() && additional_ket_species.has_value() &&
122 species.value() != additional_ket_species.value()) {
123 throw std::invalid_argument("Species mismatch.");
124 }
125
126 std::string extracted_species;
127 if (species.has_value()) {
128 extracted_species = species.value();
129 } else if (additional_ket_species.has_value()) {
130 extracted_species = additional_ket_species.value();
131 } else {
132 throw std::runtime_error("Species not set.");
133 }
134
135 AtomDescriptionByRanges description{parity,
136 range_energy,
137 range_quantum_number_f,
138 range_quantum_number_m,
139 range_quantum_number_n,
140 range_quantum_number_nu,
141 range_quantum_number_nui,
142 range_quantum_number_l,
143 range_quantum_number_s,
144 range_quantum_number_j,
145 range_quantum_number_l_ryd,
146 range_quantum_number_j_ryd};
147
148 return database.get_basis<Scalar>(extracted_species, description, additional_ket_ids);
149}
150
151// Explicit instantiations
152template class BasisAtomCreator<double>;
154} // namespace pairinteraction
Builder class for creating BasisAtom objects.
BasisAtomCreator< Scalar > & restrict_quantum_number_nui(real_t min, real_t max)
BasisAtomCreator< Scalar > & restrict_quantum_number_m(real_t min, real_t max)
BasisAtomCreator< Scalar > & append_ket(const std::shared_ptr< const ket_t > &ket)
std::shared_ptr< const BasisAtom< Scalar > > create(Database &database) const
BasisAtomCreator< Scalar > & restrict_quantum_number_l_ryd(real_t min, real_t max)
BasisAtomCreator< Scalar > & set_species(const std::string &value)
BasisAtomCreator< Scalar > & restrict_quantum_number_j_ryd(real_t min, real_t max)
BasisAtomCreator< Scalar > & restrict_quantum_number_j(real_t min, real_t max)
BasisAtomCreator< Scalar > & restrict_quantum_number_s(real_t min, real_t max)
BasisAtomCreator< Scalar > & restrict_quantum_number_n(int min, int max)
BasisAtomCreator< Scalar > & restrict_parity(Parity value)
BasisAtomCreator< Scalar > & restrict_energy(real_t min, real_t max)
BasisAtomCreator< Scalar > & restrict_quantum_number_f(real_t min, real_t max)
BasisAtomCreator< Scalar > & restrict_quantum_number_l(real_t min, real_t max)
BasisAtomCreator< Scalar > & restrict_quantum_number_nu(real_t min, real_t max)
typename traits::NumTraits< Scalar >::real_t real_t
std::shared_ptr< const BasisAtom< Scalar > > get_basis(const std::string &species, const AtomDescriptionByRanges &description, std::vector< size_t > additional_ket_ids)
Definition: Database.cpp:467