pairinteraction
A Rydberg Interaction Calculator
KetAtom.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
8
9#include <array>
10#include <cctype>
11#include <cmath>
12#include <fmt/core.h>
13#include <string>
14#include <string_view>
15#include <vector>
16
17namespace pairinteraction {
18
19constexpr std::array<std::string_view, 6> quantum_number_l_labels = {"S", "P", "D", "F", "G", "H"};
20
21KetAtom::KetAtom(Private /*unused*/, double energy, double f, double m, Parity p,
22 std::string species, int n, double nu, double nui_exp, double nui_std,
23 double l_exp, double l_std, double s_exp, double s_std, double j_exp, double j_std,
24 double l_ryd_exp, double l_ryd_std, double j_ryd_exp, double j_ryd_std,
25 bool is_j_total_momentum, bool is_calculated_with_mqdt,
26 double underspecified_channel_contribution, Database &database,
27 size_t id_in_database)
28 : Ket(energy, f, m, p), species(std::move(species)), quantum_number_n(n), quantum_number_nu(nu),
29 quantum_number_nui_exp(nui_exp), quantum_number_nui_std(nui_std), quantum_number_l_exp(l_exp),
30 quantum_number_l_std(l_std), quantum_number_s_exp(s_exp), quantum_number_s_std(s_std),
31 quantum_number_j_exp(j_exp), quantum_number_j_std(j_std), quantum_number_l_ryd_exp(l_ryd_exp),
32 quantum_number_l_ryd_std(l_ryd_std), quantum_number_j_ryd_exp(j_ryd_exp),
33 quantum_number_j_ryd_std(j_ryd_std), is_j_total_momentum_(is_j_total_momentum),
34 is_calculated_with_mqdt_(is_calculated_with_mqdt),
35 underspecified_channel_contribution(underspecified_channel_contribution), database(database),
36 id_in_database(id_in_database) {}
37
38Database &KetAtom::get_database() const { return database; }
39
40size_t KetAtom::get_id_in_database() const { return id_in_database; }
41
42std::string KetAtom::get_label() const {
43 size_t pos = species.find('_');
44 std::string label = (pos != std::string::npos) ? species.substr(0, pos) : species;
45 label[0] = static_cast<char>(std::toupper(label[0]));
46
47 if (!is_calculated_with_mqdt_) {
48 if (quantum_number_s_exp == 0) {
49 label += "_singlet";
50 } else if (quantum_number_s_exp == 1) {
51 label += "_triplet";
52 } else if (quantum_number_s_exp != 0.5) {
53 throw std::runtime_error(
54 "Invalid value for quantum number s in the single-channel description.");
55 }
56 }
57
58 label += ":";
59
60 if (is_calculated_with_mqdt_) {
61 label += fmt::format("S={:.1f},nu={:.1f},L={:.1f},", quantum_number_s_exp,
62 quantum_number_nu, quantum_number_l_exp);
63 label += this->is_j_total_momentum_ ? "J=" : "F=";
64 } else {
65 label += fmt::format("{:d},", quantum_number_n);
66 if (quantum_number_l_exp == std::rint(quantum_number_l_exp) &&
67 quantum_number_l_exp < quantum_number_l_labels.size()) {
68 label += quantum_number_l_labels.at(static_cast<size_t>(quantum_number_l_exp));
69 } else {
70 label += fmt::format("{:.0f}", quantum_number_l_exp);
71 }
72 label += "_";
73 }
74
75 double total_momentum =
76 this->is_j_total_momentum_ ? this->quantum_number_j_exp : this->quantum_number_f;
77 if (total_momentum == std::rint(total_momentum)) {
78 label += fmt::format("{:.0f}", total_momentum);
79 } else if (2 * total_momentum == std::rint(2 * total_momentum)) {
80 label += fmt::format("{:.0f}/2", 2 * total_momentum);
81 } else {
82 std::abort(); // can't happen because the total momentum is validated to be an integer
83 // or half-integer
84 }
85
86 if (this->quantum_number_m == std::rint(this->quantum_number_m)) {
87 label += fmt::format(",{:.0f}", this->quantum_number_m);
88 } else if (2 * this->quantum_number_m == std::rint(2 * this->quantum_number_m)) {
89 label += fmt::format(",{:.0f}/2", 2 * this->quantum_number_m);
90 } else {
91 std::abort(); // can't happen because the quantum number m is validated to be an integer
92 // or half-integer
93 }
94
95 return label;
96}
97
98std::shared_ptr<KetAtom>
99KetAtom::get_ket_for_different_quantum_number_m(double new_quantum_number_m) const {
100 auto ket = *this;
101 ket.quantum_number_m = new_quantum_number_m;
102 return std::make_shared<KetAtom>(ket);
103}
104
105const std::string &KetAtom::get_species() const { return species; }
106
107int KetAtom::get_quantum_number_n() const { return quantum_number_n; }
108
109double KetAtom::get_quantum_number_nu() const { return quantum_number_nu; }
110
111double KetAtom::get_quantum_number_nui() const { return quantum_number_nui_exp; }
112
113double KetAtom::get_quantum_number_l() const { return quantum_number_l_exp; }
114
115double KetAtom::get_quantum_number_s() const { return quantum_number_s_exp; }
116
117double KetAtom::get_quantum_number_j() const { return quantum_number_j_exp; }
118
119double KetAtom::get_quantum_number_l_ryd() const { return quantum_number_l_ryd_exp; }
120
121double KetAtom::get_quantum_number_j_ryd() const { return quantum_number_j_ryd_exp; }
122
123double KetAtom::get_quantum_number_nui_std() const { return quantum_number_nui_std; }
124
125double KetAtom::get_quantum_number_l_std() const { return quantum_number_l_std; }
126
127double KetAtom::get_quantum_number_s_std() const { return quantum_number_s_std; }
128
129double KetAtom::get_quantum_number_j_std() const { return quantum_number_j_std; }
130
131double KetAtom::get_quantum_number_l_ryd_std() const { return quantum_number_l_ryd_std; }
132
133double KetAtom::get_quantum_number_j_ryd_std() const { return quantum_number_j_ryd_std; }
134
135bool KetAtom::is_j_total_momentum() const { return is_j_total_momentum_; }
136
137bool KetAtom::is_calculated_with_mqdt() const { return is_calculated_with_mqdt_; }
138
140 return underspecified_channel_contribution;
141}
142
143bool KetAtom::operator==(const KetAtom &other) const {
144 return Ket::operator==(other) && species == other.species &&
145 quantum_number_n == other.quantum_number_n &&
146 quantum_number_nu == other.quantum_number_nu &&
147 quantum_number_nui_exp == other.quantum_number_nui_exp &&
148 quantum_number_nui_std == other.quantum_number_nui_std &&
149 quantum_number_l_exp == other.quantum_number_l_exp &&
150 quantum_number_l_std == other.quantum_number_l_std &&
151 quantum_number_s_exp == other.quantum_number_s_exp &&
152 quantum_number_s_std == other.quantum_number_s_std &&
153 quantum_number_j_exp == other.quantum_number_j_exp &&
154 quantum_number_j_std == other.quantum_number_j_std;
155}
156
157bool KetAtom::operator!=(const KetAtom &other) const { return !(*this == other); }
158
159size_t KetAtom::hash::operator()(const KetAtom &k) const {
160 size_t seed = typename Ket::hash()(k);
161 utils::hash_combine(seed, k.species);
162 utils::hash_combine(seed, k.quantum_number_n);
163 utils::hash_combine(seed, k.quantum_number_nu);
164 utils::hash_combine(seed, k.quantum_number_nui_exp);
165 utils::hash_combine(seed, k.quantum_number_nui_std);
166 utils::hash_combine(seed, k.quantum_number_l_exp);
167 utils::hash_combine(seed, k.quantum_number_l_std);
168 utils::hash_combine(seed, k.quantum_number_s_exp);
169 utils::hash_combine(seed, k.quantum_number_s_std);
170 utils::hash_combine(seed, k.quantum_number_j_exp);
171 utils::hash_combine(seed, k.quantum_number_j_std);
172 return seed;
173}
174
175} // namespace pairinteraction
Class for representing atomic kets.
Definition: KetAtom.hpp:21
double get_quantum_number_nui() const
Definition: KetAtom.cpp:111
bool is_j_total_momentum() const
Definition: KetAtom.cpp:135
bool is_calculated_with_mqdt() const
Definition: KetAtom.cpp:137
std::string get_label() const override
Definition: KetAtom.cpp:42
size_t get_id_in_database() const
Definition: KetAtom.cpp:40
double get_quantum_number_j_ryd() const
Definition: KetAtom.cpp:121
double get_quantum_number_l_ryd_std() const
Definition: KetAtom.cpp:131
double get_quantum_number_nui_std() const
Definition: KetAtom.cpp:123
double get_quantum_number_l_std() const
Definition: KetAtom.cpp:125
double get_quantum_number_nu() const
Definition: KetAtom.cpp:109
double get_quantum_number_s_std() const
Definition: KetAtom.cpp:127
double get_quantum_number_j_ryd_std() const
Definition: KetAtom.cpp:133
bool operator!=(const KetAtom &other) const
Definition: KetAtom.cpp:157
const std::string & get_species() const
Definition: KetAtom.cpp:105
Database & get_database() const
Definition: KetAtom.cpp:38
double get_quantum_number_l() const
Definition: KetAtom.cpp:113
double get_quantum_number_s() const
Definition: KetAtom.cpp:115
bool operator==(const KetAtom &other) const
Definition: KetAtom.cpp:143
KetAtom(Private, double energy, double f, double m, Parity p, std::string species, int n, double nu, double nui_exp, double nui_std, double l_exp, double l_std, double s_exp, double s_std, double j_exp, double j_std, double l_ryd_exp, double l_ryd_std, double j_ryd_exp, double j_ryd_std, bool is_j_total_momentum, bool is_calculated_with_mqdt, double underspecified_channel_contribution, Database &database, size_t id_in_database)
Definition: KetAtom.cpp:21
int get_quantum_number_n() const
Definition: KetAtom.cpp:107
double get_quantum_number_j() const
Definition: KetAtom.cpp:117
std::shared_ptr< KetAtom > get_ket_for_different_quantum_number_m(double new_quantum_number_m) const
Definition: KetAtom.cpp:99
double get_underspecified_channel_contribution() const
Definition: KetAtom.cpp:139
double get_quantum_number_j_std() const
Definition: KetAtom.cpp:129
double get_quantum_number_l_ryd() const
Definition: KetAtom.cpp:119
Base class for a ket.
Definition: Ket.hpp:25
double quantum_number_f
Definition: Ket.hpp:55
double quantum_number_m
Definition: Ket.hpp:56
bool operator==(const Ket &other) const
Definition: Ket.cpp:33
void hash_combine(std::size_t &seed, T const &v)
Combine hashes.
Definition: hash.hpp:43
constexpr std::array< std::string_view, 6 > quantum_number_l_labels
Definition: KetAtom.cpp:19
std::size_t operator()(const KetAtom &k) const
Definition: KetAtom.cpp:159