Line data Source code
1 : // SPDX-FileCopyrightText: 2024 Pairinteraction Developers 2 : // SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : #include "pairinteraction/ket/KetAtomCreator.hpp" 5 : 6 : #include "pairinteraction/database/AtomDescriptionByParameters.hpp" 7 : #include "pairinteraction/database/Database.hpp" 8 : #include "pairinteraction/enums/Parity.hpp" 9 : 10 : #include <cmath> 11 : 12 : namespace pairinteraction { 13 7 : KetAtomCreator::KetAtomCreator(std::string species, int n, double l, double j, double m) 14 14 : : species(std::move(species)), quantum_number_f(j), quantum_number_m(m), quantum_number_n(n), 15 14 : quantum_number_l(l), quantum_number_s(0.5), quantum_number_j(j) {} 16 : 17 90 : KetAtomCreator &KetAtomCreator::set_species(const std::string &value) { 18 90 : species.emplace(value); 19 90 : return *this; 20 : } 21 : 22 0 : KetAtomCreator &KetAtomCreator::set_energy(double value) { 23 0 : energy.emplace(value); 24 0 : return *this; 25 : } 26 : 27 14 : KetAtomCreator &KetAtomCreator::set_quantum_number_f(double value) { 28 14 : if (2 * value != std::rint(2 * value)) { 29 0 : throw std::invalid_argument("Quantum number f must be an integer or half-integer."); 30 : } 31 14 : quantum_number_f.emplace(value); 32 14 : return *this; 33 : } 34 : 35 90 : KetAtomCreator &KetAtomCreator::set_quantum_number_m(double value) { 36 90 : if (2 * value != std::rint(2 * value)) { 37 0 : throw std::invalid_argument("Quantum number m must be an integer or half-integer."); 38 : } 39 90 : quantum_number_m.emplace(value); 40 90 : return *this; 41 : } 42 : 43 0 : KetAtomCreator &KetAtomCreator::set_parity(Parity value) { 44 0 : parity = value; 45 0 : return *this; 46 : } 47 : 48 87 : KetAtomCreator &KetAtomCreator::set_quantum_number_n(int value) { 49 87 : quantum_number_n.emplace(value); 50 87 : return *this; 51 : } 52 : 53 3 : KetAtomCreator &KetAtomCreator::set_quantum_number_nu(double value) { 54 3 : quantum_number_nu.emplace(value); 55 3 : return *this; 56 : } 57 : 58 0 : KetAtomCreator &KetAtomCreator::set_quantum_number_nui(double value) { 59 0 : quantum_number_nui.emplace(value); 60 0 : return *this; 61 : } 62 : 63 90 : KetAtomCreator &KetAtomCreator::set_quantum_number_l(double value) { 64 90 : quantum_number_l.emplace(value); 65 90 : return *this; 66 : } 67 : 68 13 : KetAtomCreator &KetAtomCreator::set_quantum_number_s(double value) { 69 13 : quantum_number_s.emplace(value); 70 13 : return *this; 71 : } 72 : 73 56 : KetAtomCreator &KetAtomCreator::set_quantum_number_j(double value) { 74 56 : quantum_number_j.emplace(value); 75 56 : return *this; 76 : } 77 : 78 0 : KetAtomCreator &KetAtomCreator::set_quantum_number_l_ryd(double value) { 79 0 : quantum_number_l_ryd.emplace(value); 80 0 : return *this; 81 : } 82 : 83 0 : KetAtomCreator &KetAtomCreator::set_quantum_number_j_ryd(double value) { 84 0 : quantum_number_j_ryd.emplace(value); 85 0 : return *this; 86 : } 87 : 88 97 : std::shared_ptr<const KetAtom> KetAtomCreator::create(Database &database) const { 89 : 90 97 : if (!species.has_value()) { 91 0 : throw std::runtime_error("Species not set."); 92 : } 93 : 94 97 : AtomDescriptionByParameters description{parity, 95 : energy, 96 : quantum_number_f, 97 : quantum_number_m, 98 : quantum_number_n, 99 : quantum_number_nu, 100 : quantum_number_nui, 101 : quantum_number_l, 102 : quantum_number_s, 103 : quantum_number_j, 104 : quantum_number_l_ryd, 105 97 : quantum_number_j_ryd}; 106 : 107 193 : return database.get_ket(species.value(), description); 108 : } 109 : } // namespace pairinteraction