ampsci
High-precision calculations for one- and two-valence atomic systems
YkTable.hpp
1#pragma once
2#include "Angular/CkTable.hpp"
3#include "Angular/SixJTable.hpp"
4#include "Wavefunction/DiracSpinor.hpp"
5#include <unordered_map>
6#include <vector>
7
8namespace Coulomb {
9
10//! @brief Calculates + stores Hartree Y functions + Angular (w/ look-up),
11//! taking advantage of symmetry
12/*! @details
13
14 Also stores a Ck and 6J table
15
16 Definitions:
17
18 \f[
19 y^k_{ij}(r) = \int_0^\infty \frac{r_<^k}{r_>^{k+1}}\rho_{ij}(r')\,{\rm d}r'
20 \f]
21
22 \f[\rho(r) = f_i(r)f_j(r) + g_i(r)g_j(r)\f]
23
24 with \f$r_< = min(r,r')\f$
25
26 @warning if you request an unstored integral, 0 will be returned without warning.
27 This is not considered an error, but a choice as to which integrals contribute.
28 It is up to the user to ensure any integral we require is included.
29
30*/
31class YkTable {
32
33private:
34 std::vector<std::unordered_map<uint32_t, std::vector<double>>> m_Y{};
35 Angular::CkTable m_Ck{};
36 Angular::SixJTable m_6j{};
37
38public:
39 YkTable(const std::vector<DiracSpinor> &a_orbs,
40 const std::vector<DiracSpinor> &b_orbs) {
41 calculate(a_orbs, b_orbs);
42 }
43 YkTable(const std::vector<DiracSpinor> &a_orbs) { calculate(a_orbs); }
44 YkTable() {}
45
46 //----------------------------------------------------------------------------
47 //! Re-calculates all y_ab functions (will over-ride existing ones); NOTE:
48 //! only calculates for a in as, b in bs
49 //!@details Note: will re-calculate all, so don't use this to 'extend' the
50 //! table.
51 void calculate(const std::vector<DiracSpinor> &as,
52 const std::vector<DiracSpinor> &bs);
53 //! Re-calculates all y_ij functions (will over-ride existing ones) [i and j
54 //! in as]
55 void calculate(const std::vector<DiracSpinor> &as) { calculate(as, as); }
56
57 //! Extends the Ck and 6J tables up to new maximum 2*j
58 void extend_angular(int new_max_2j);
59
60 //! Returns a (const ref) to Ck table [see Angular::CkTable]
61 const Angular::CkTable &Ck() const { return m_Ck; }
62 //! Returns a (const ref) to SixJ table [see Angular::SixJTable]
63 const Angular::SixJTable &SixJ() const { return m_6j; }
64
65 //! Returns a pointer to constant vector y^k_ab. If that integral is not
66 //! stored, returns nullptr.
67 const std::vector<double> *get(const int k, const DiracSpinor &Fa,
68 const DiracSpinor &Fb) const;
69
70 //! Calculates Rk using the existing yk integrals. Note: Ck tables
71 //! *must* include all required values, or behaviour not defined.
72 [[nodiscard]] double R(const int k, const DiracSpinor &Fa,
73 const DiracSpinor &Fb, const DiracSpinor &Fc,
74 const DiracSpinor &Fd) const;
75
76 //! Calculates Qk using the existing yk integrals. Note: Ck tables
77 //! *must* include all required values, or behaviour not defined.
78 [[nodiscard]] double Q(const int k, const DiracSpinor &Fa,
79 const DiracSpinor &Fb, const DiracSpinor &Fc,
80 const DiracSpinor &Fd) const;
81
82 //! Calculates Pk using the existing yk integrals. Note: Ck tables
83 //! *must* include all required values, or behaviour not defined.
84 [[nodiscard]] double P(const int k, const DiracSpinor &Fa,
85 const DiracSpinor &Fb, const DiracSpinor &Fc,
86 const DiracSpinor &Fd) const;
87
88 [[nodiscard]] double P2(const int k, const DiracSpinor &Fa,
89 const DiracSpinor &Fb, const DiracSpinor &Fc,
90 const DiracSpinor &Fd,
91 const std::vector<double> &fk = {}) const;
92
93 //! Calculates Wk=Qk+Pk using the existing yk integrals. Note: Ck
94 //! tables *must* include all required values, or behaviour not defined.
95 [[nodiscard]] double W(const int k, const DiracSpinor &Fa,
96 const DiracSpinor &Fb, const DiracSpinor &Fc,
97 const DiracSpinor &Fd) const;
98
99 //! Calculates Q^K(v)_bcd using existing yk integrals. Note: Ck tables
100 //! *must* include all required values, or behaviour not defined.
101 [[nodiscard]] DiracSpinor Qkv_bcd(const int k, int kappa,
102 const DiracSpinor &Fb,
103 const DiracSpinor &Fc,
104 const DiracSpinor &Fd) const;
105
106 //! Calculates P^K(v)_bcd using existing yk integrals, including (optional)
107 //! screening factors. Note: Ck tables
108 //! *must* include all required values, or behaviour not defined.
109 [[nodiscard]] DiracSpinor
110 Pkv_bcd(const int k, int kappa, const DiracSpinor &Fb, const DiracSpinor &Fc,
111 const DiracSpinor &Fd, const std::vector<double> &f2k = {}) const;
112
113 //! Checks if table is empty
114 bool empty() const { return m_Y.empty(); }
115
116private:
117 // Allocates space for the Yk table, but does not calculate Yk. This is
118 // because allocation cannot be done in parallel, but once allocation is done,
119 // calculation can be done in //
120 void allocate_space(const std::vector<DiracSpinor> &a_orbs,
121 const std::vector<DiracSpinor> &b_orbs);
122
123 // Returns key used for look-up table (unordered_map), considers symmetry
124 uint32_t ab_key(const DiracSpinor &Fa, const DiracSpinor &Fb) const;
125
126 // Returns reference to yk vector at 'key'; if no such vector exists, creates
127 // it first.
128 std::vector<double> &get_or_insert(std::size_t k, uint32_t key);
129
130 // Returns reference to yk vector at 'key'. This vector *must* exist already
131 std::vector<double> &get_ref(const int k, const DiracSpinor &Fa,
132 const DiracSpinor &Fb);
133};
134
135} // namespace Coulomb
Lookup table for Ck_ab reduced matrix elements and the special 3j symbol (j_a, j_b,...
Definition CkTable.hpp:62
Lookup table for Wigner 6j symbols.
Definition SixJTable.hpp:68
Calculates + stores Hartree Y functions + Angular (w/ look-up), taking advantage of symmetry.
Definition YkTable.hpp:31
DiracSpinor Pkv_bcd(const int k, int kappa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd, const std::vector< double > &f2k={}) const
Calculates P^K(v)_bcd using existing yk integrals, including (optional) screening factors....
Definition YkTable.cpp:229
DiracSpinor Qkv_bcd(const int k, int kappa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
Calculates Q^K(v)_bcd using existing yk integrals. Note: Ck tables must include all required values,...
Definition YkTable.cpp:207
const Angular::CkTable & Ck() const
Returns a (const ref) to Ck table [see Angular::CkTable].
Definition YkTable.hpp:61
double Q(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
Calculates Qk using the existing yk integrals. Note: Ck tables must include all required values,...
Definition YkTable.cpp:129
const Angular::SixJTable & SixJ() const
Returns a (const ref) to SixJ table [see Angular::SixJTable].
Definition YkTable.hpp:63
void calculate(const std::vector< DiracSpinor > &as, const std::vector< DiracSpinor > &bs)
Re-calculates all y_ab functions (will over-ride existing ones); NOTE: only calculates for a in as,...
Definition YkTable.cpp:14
const std::vector< double > * get(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb) const
Returns a pointer to constant vector y^k_ab. If that integral is not stored, returns nullptr.
Definition YkTable.cpp:70
double W(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
Calculates Wk=Qk+Pk using the existing yk integrals. Note: Ck tables must include all required values...
Definition YkTable.cpp:201
double R(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
Calculates Rk using the existing yk integrals. Note: Ck tables must include all required values,...
Definition YkTable.cpp:118
double P(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
Calculates Pk using the existing yk integrals. Note: Ck tables must include all required values,...
Definition YkTable.cpp:147
void extend_angular(int new_max_2j)
Extends the Ck and 6J tables up to new maximum 2*j.
Definition YkTable.cpp:46
void calculate(const std::vector< DiracSpinor > &as)
Re-calculates all y_ij functions (will over-ride existing ones) [i and j in as].
Definition YkTable.hpp:55
bool empty() const
Checks if table is empty.
Definition YkTable.hpp:114
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
Functions (+classes) for computing Coulomb integrals.
Definition CoulombBreit.cpp:13