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 : 9 : #include <cmath> 10 : 11 : namespace pairinteraction { 12 8 : KetAtomCreator::KetAtomCreator(std::string species, int n, double l, double j, double m) 13 8 : : species(std::move(species)) { 14 8 : set_quantum_number("n", n); 15 8 : set_quantum_number("l", l); 16 8 : set_quantum_number("j", j); 17 8 : set_quantum_number("m", m); 18 8 : } 19 : 20 418 : KetAtomCreator &KetAtomCreator::set_species(const std::string &value) { 21 418 : species.emplace(value); 22 418 : return *this; 23 : } 24 : 25 0 : KetAtomCreator &KetAtomCreator::set_energy(double value) { 26 0 : energy.emplace(value); 27 0 : return *this; 28 : } 29 : 30 1684 : KetAtomCreator &KetAtomCreator::set_quantum_number(const std::string &name, double value) { 31 1684 : if ((name == "f" || name == "m") && 2 * value != std::rint(2 * value)) { 32 0 : throw std::invalid_argument("Quantum number " + name + 33 0 : " must be an integer or half-integer."); 34 : } 35 1684 : if (name == "parity" && value != 1 && value != -1) { 36 0 : throw std::invalid_argument("The parity must be +1 or -1."); 37 : } 38 1684 : quantum_numbers[name] = value; 39 1684 : return *this; 40 : } 41 : 42 426 : std::shared_ptr<const KetAtom> KetAtomCreator::create(Database &database) const { 43 : 44 426 : if (!species.has_value()) { 45 0 : throw std::runtime_error("Species not set."); 46 : } 47 : 48 426 : AtomDescriptionByParameters description{energy, quantum_numbers}; 49 : 50 846 : return database.get_ket(species.value(), description); 51 426 : } 52 : } // namespace pairinteraction