2#include "Physics/AtomData.hpp"
4#include "Wavefunction/DiracSpinor.hpp"
6#include <unordered_map>
16template <
typename T =
double>
20 std::unordered_map<nk2Index, T> m_data{};
23 auto operator->() {
return &m_data; }
32 void add(DiracSpinor::Index a, DiracSpinor::Index b, T value) {
33 m_data.insert({FormIndex(a, b), std::move(value)});
38 m_data.insert(other.cbegin(), other.cend());
47 void update(DiracSpinor::Index a, DiracSpinor::Index b, T value) {
48 m_data.insert_or_assign(FormIndex(a, b), std::move(value));
57 [[nodiscard]]
bool contains(DiracSpinor::Index a,
58 DiracSpinor::Index b)
const {
59 return m_data.find(FormIndex(a, b)) != m_data.cend();
63 [[nodiscard]]
bool empty()
const {
return m_data.empty(); }
69 return (map_it == m_data.cend()) ? nullptr : &(map_it->second);
73 [[nodiscard]]
const T *
get(DiracSpinor::Index a, DiracSpinor::Index b)
const {
74 const auto map_it = m_data.find(FormIndex(a, b));
75 return (map_it == m_data.cend()) ? nullptr : &(map_it->second);
82 return (map_it == m_data.cend()) ? nullptr : &(map_it->second);
86 [[nodiscard]] T *
get(DiracSpinor::Index a, DiracSpinor::Index b) {
87 const auto map_it = m_data.find(FormIndex(a, b));
88 return (map_it == m_data.cend()) ? nullptr : &(map_it->second);
94 const auto ptr =
get(a, b);
95 return ptr ? *ptr : T{};
99 [[nodiscard]] T
getv(DiracSpinor::Index a, DiracSpinor::Index b)
const {
100 const auto ptr =
get(a, b);
101 return ptr ? *ptr : T{};
106 [[nodiscard]]
const T *
get(
const std::string &a,
const std::string &b)
const {
113 const auto map_it = m_data.find(FormIndex(a_index, b_index));
114 return (map_it == m_data.cend()) ?
nullptr : &(map_it->second);
118 auto begin() {
return m_data.begin(); }
119 auto end() {
return m_data.end(); }
120 auto cbegin()
const {
return m_data.cbegin(); }
121 auto cend()
const {
return m_data.cend(); }
123 static std::pair<std::string, std::string> index_to_symbols(
nk2Index index) {
124 const auto [a, b] = unFormIndex(index);
134 static_assert(
sizeof(
nkIndex) * 8 == 16);
138 [[nodiscard]]
static std::pair<nkIndex, nkIndex> unFormIndex(
nk2Index index) {
139 std::pair<nkIndex, nkIndex> out;
141 b =
static_cast<nkIndex>(index);
144 assert(FormIndex(a, b) == index);
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
Index nk_index() const
(n,kappa) index (see AtomData)
Definition DiracSpinor.hpp:101
constexpr std::uint64_t nk_to_index(int n, int k)
Returns nk_index, given {n, kappa}.
Definition Wigner369j.hpp:172
std::pair< int, int > index_to_nk(std::uint64_t nk_index)
Returns {n, kappa} given nk_index.
Definition Wigner369j.hpp:178
std::pair< int, int > parse_symbol(std::string_view symbol)
Parses electron 'symbol' or 'shortSymbol' to {n,kappa}, e.g., "6s+" -> {6,-1}; "6p-" -> {6,...
Definition AtomData.cpp:148
std::string shortSymbol(int n, int kappa)
Returns shortSymbol, given n and kappa: (6,-1)->"6s+".
Definition AtomData.cpp:128
Functions (+classes) for computing Coulomb integrals.
Definition CoulombIntegrals.cpp:13
uint32_t nk2Index
index type for set of 2 orbitals {nk,nk} -> nk4Index
Definition meTable.hpp:11
uint16_t nkIndex
index type for each {nk} (orbital) [max n: 256]
Definition QkTable.hpp:23