Line data Source code
1 : // SPDX-FileCopyrightText: 2024 PairInteraction Developers 2 : // SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : #pragma once 5 : 6 : #include "pairinteraction/enums/Parity.hpp" 7 : #include "pairinteraction/utils/Range.hpp" 8 : #include "pairinteraction/utils/traits.hpp" 9 : 10 : #include <complex> 11 : #include <memory> 12 : #include <optional> 13 : #include <string> 14 : #include <vector> 15 : 16 : namespace pairinteraction { 17 : template <typename Scalar> 18 : class BasisAtom; 19 : 20 : class KetAtom; 21 : 22 : class Database; 23 : 24 : /** 25 : * @class BasisAtomCreator 26 : * 27 : * @brief Builder class for creating BasisAtom objects. 28 : * 29 : * @tparam Scalar Complex number type. 30 : */ 31 : template <typename Scalar> 32 : class BasisAtomCreator { 33 : static_assert(traits::NumTraits<Scalar>::from_floating_point_v); 34 : 35 : public: 36 : using real_t = typename traits::NumTraits<Scalar>::real_t; 37 : using ket_t = KetAtom; 38 231 : BasisAtomCreator() = default; 39 : BasisAtomCreator<Scalar> &set_species(const std::string &value); 40 : BasisAtomCreator<Scalar> &restrict_energy(real_t min, real_t max); 41 : BasisAtomCreator<Scalar> &restrict_quantum_number_f(real_t min, real_t max); 42 : BasisAtomCreator<Scalar> &restrict_quantum_number_m(real_t min, real_t max); 43 : BasisAtomCreator<Scalar> &restrict_parity(Parity value); 44 : BasisAtomCreator<Scalar> &restrict_quantum_number_n(int min, int max); 45 : BasisAtomCreator<Scalar> &restrict_quantum_number_nu(real_t min, real_t max); 46 : BasisAtomCreator<Scalar> &restrict_quantum_number_nui(real_t min, real_t max); 47 : BasisAtomCreator<Scalar> &restrict_quantum_number_l(real_t min, real_t max); 48 : BasisAtomCreator<Scalar> &restrict_quantum_number_s(real_t min, real_t max); 49 : BasisAtomCreator<Scalar> &restrict_quantum_number_j(real_t min, real_t max); 50 : BasisAtomCreator<Scalar> &restrict_quantum_number_l_ryd(real_t min, real_t max); 51 : BasisAtomCreator<Scalar> &restrict_quantum_number_j_ryd(real_t min, real_t max); 52 : BasisAtomCreator<Scalar> &append_ket(const std::shared_ptr<const ket_t> &ket); 53 : std::shared_ptr<const BasisAtom<Scalar>> create(Database &database) const; 54 : 55 : private: 56 : std::optional<std::string> species; 57 : Parity parity{Parity::UNKNOWN}; 58 : Range<real_t> range_energy; 59 : Range<real_t> range_quantum_number_f; 60 : Range<real_t> range_quantum_number_m; 61 : Range<int> range_quantum_number_n; 62 : Range<real_t> range_quantum_number_nu; 63 : Range<real_t> range_quantum_number_nui; 64 : Range<real_t> range_quantum_number_l; 65 : Range<real_t> range_quantum_number_s; 66 : Range<real_t> range_quantum_number_j; 67 : Range<real_t> range_quantum_number_l_ryd; 68 : Range<real_t> range_quantum_number_j_ryd; 69 : std::vector<size_t> additional_ket_ids; 70 : std::optional<std::string> additional_ket_species; 71 : }; 72 : 73 : extern template class BasisAtomCreator<double>; 74 : extern template class BasisAtomCreator<std::complex<double>>; 75 : } // namespace pairinteraction