pairinteraction
A Rydberg Interaction Calculator
KetPair.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
11#include <limits>
12#include <string>
13
14namespace pairinteraction {
15template <typename Scalar>
17 Private /*unused*/, std::initializer_list<size_t> atomic_indices,
18 std::initializer_list<std::shared_ptr<const BasisAtom<Scalar>>> atomic_bases, real_t energy)
19 : Ket(energy, calculate_quantum_number_f(atomic_indices, atomic_bases),
20 calculate_quantum_number_m(atomic_indices, atomic_bases),
21 calculate_parity(atomic_indices, atomic_bases)),
22 atomic_indices(atomic_indices), atomic_bases(atomic_bases) {
23 if (atomic_indices.size() != atomic_bases.size()) {
24 throw std::invalid_argument(
25 "The number of atomic indices, and atomic bases must be the same.");
26 }
27}
28
29template <typename Scalar>
30std::string KetPair<Scalar>::get_label() const {
31 std::string label;
32 std::string separator;
33 for (size_t atom_index = 0; atom_index < atomic_indices.size(); ++atom_index) {
34 label += separator +
35 atomic_bases[atom_index]
36 ->get_corresponding_ket(atomic_indices[atom_index])
37 ->get_label();
38 separator = "; ";
39 }
40 return label;
41}
42
43template <typename Scalar>
44std::shared_ptr<KetPair<Scalar>>
45KetPair<Scalar>::get_ket_for_different_quantum_number_m(real_t /*new_quantum_number_m*/) const {
46 // If we use symmetrized states so that the quantum_number_f is the total
47 // angular quantum number, the quantum_number_m is the magnetic quantum number
48 // corresponding to the total angular quantum number and we can implement this
49 // method.
50 throw std::runtime_error("Not implemented.");
51}
52
53template <typename Scalar>
54std::vector<std::shared_ptr<const BasisAtom<Scalar>>> KetPair<Scalar>::get_atomic_states() const {
55 std::vector<std::shared_ptr<const BasisAtom<Scalar>>> atomic_states;
56 atomic_states.reserve(atomic_indices.size());
57 for (size_t atom_index = 0; atom_index < atomic_indices.size(); ++atom_index) {
58 atomic_states.push_back(atomic_bases[atom_index]->get_state(atomic_indices[atom_index]));
59 }
60 return atomic_states;
61}
62
63template <typename Scalar>
65 return Ket::operator==(other) && atomic_indices == other.atomic_indices &&
66 atomic_bases == other.atomic_bases;
67}
68
69template <typename Scalar>
71 return !(*this == other);
72}
73
74template <typename Scalar>
76 size_t seed = typename Ket::hash()(k);
77 for (const auto &index : k.atomic_indices) {
78 utils::hash_combine(seed, index);
79 }
80 for (const auto &basis : k.atomic_bases) {
81 utils::hash_combine(seed, reinterpret_cast<std::uintptr_t>(basis.get()));
82 }
83 return seed;
84}
85
86template <typename Scalar>
87typename KetPair<Scalar>::real_t KetPair<Scalar>::calculate_quantum_number_f(
88 const std::vector<size_t> & /*indices*/,
89 const std::vector<std::shared_ptr<const BasisAtom<Scalar>>> & /*bases*/) {
90 // Because this ket state is not symmetrized, the quantum_number_f is not well-defined.
91 return std::numeric_limits<real_t>::max();
92}
93
94template <typename Scalar>
95typename KetPair<Scalar>::real_t KetPair<Scalar>::calculate_quantum_number_m(
96 const std::vector<size_t> &indices,
97 const std::vector<std::shared_ptr<const BasisAtom<Scalar>>> &bases) {
98 for (const auto &basis : bases) {
99 if (!basis->has_quantum_number_m()) {
100 return std::numeric_limits<real_t>::max();
101 }
102 }
103 real_t total_quantum_number_m = 0;
104 for (size_t i = 0; i < indices.size(); ++i) {
105 total_quantum_number_m += bases[i]->get_quantum_number_m(indices[i]);
106 }
107 return total_quantum_number_m;
108}
109
110template <typename Scalar>
111Parity KetPair<Scalar>::calculate_parity(
112 const std::vector<size_t> & /*indices*/,
113 const std::vector<std::shared_ptr<const BasisAtom<Scalar>>> & /*bases*/) {
114 // Because this ket state is not symmetrized, the parity is not well-defined.
115 return Parity::UNKNOWN;
116}
117
118// Explicit instantiations
119template class KetPair<double>;
120template class KetPair<std::complex<double>>;
121} // namespace pairinteraction
Class for creating a basis of atomic kets.
Definition: BasisAtom.hpp:40
bool operator==(const KetPair< Scalar > &other) const
Definition: KetPair.cpp:64
std::string get_label() const override
Definition: KetPair.cpp:30
std::vector< std::shared_ptr< const BasisAtom< Scalar > > > get_atomic_states() const
Definition: KetPair.cpp:54
bool operator!=(const KetPair< Scalar > &other) const
Definition: KetPair.cpp:70
std::shared_ptr< KetPair< Scalar > > get_ket_for_different_quantum_number_m(real_t new_quantum_number_m) const
Definition: KetPair.cpp:45
KetPair(Private, std::initializer_list< size_t > atomic_indices, std::initializer_list< std::shared_ptr< const BasisAtom< Scalar > > > atomic_bases, real_t energy)
Definition: KetPair.cpp:16
Base class for a ket.
Definition: Ket.hpp:25
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
std::size_t operator()(const KetPair< Scalar > &k) const
Definition: KetPair.cpp:75