2#include "Angular/SixJTable.hpp"
3#include "Wavefunction/DiracSpinor.hpp"
10#ifdef COULOMB_USE_STD_MAP
11#include <unordered_map>
13#include "ankerl/unordered_dense.h"
54#ifdef COULOMB_USE_STD_MAP
55using QkMap = std::unordered_map<nk4Index, Real>;
57using QkMap = ankerl::unordered_dense::map<nk4Index, Real>;
122 std::vector<QkMap> m_data{};
149 void fill(
const std::vector<DiracSpinor> &basis,
const YkTable &yk,
150 int k_cut = -1,
bool print =
true);
170 void fill_if(
const std::vector<DiracSpinor> &basis,
const YkTable &yk,
223 double damp,
bool print =
true,
235 std::size_t
count()
const;
245 int max_k()
const {
return int(m_data.size()) - 1; }
273 return (m_data.size() == 0);
285 std::array<std::size_t, 4>
287 std::size_t
max_k = 99,
double eF = 0.0)
const;
373 const DiracSpinor &d,
int tma,
int tmb,
int tmc,
int tmd)
const;
394 void write(
const std::string &fname,
bool verbose =
true)
const;
398 bool read(
const std::string &fname,
bool verbose =
true,
399 bool parse_basis_string =
false);
432 bool already_filled(
const std::vector<std::size_t> &
count,
433 const std::vector<DiracSpinor> basis)
const {
435 for (
const auto &a : basis) {
439 for (
auto k = 0ul; k <
count.size(); ++k) {
442 if (k >= m_data.size() || m_data[k].size() <
count[k])
512 const std::string &core_string,
int k_cut = 999);
516 double efficiency = 0.65);
520#include "QkTable.ipp"
Lookup table for Wigner 6j symbols.
Definition SixJTable.hpp:82
Base class template to store Coulomb integrals, and similar. 3 specific cases (by template instantiat...
Definition QkTable.hpp:118
Real P2(int k, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d, const Angular::SixJTable &sj, const std::vector< double > &fk) const
Exchange integral P^k_abcd with effective Coulomb screening.
Definition QkTable.ipp:247
double * get(int k, nk4Index index)
Directly gets one of the stored elements, given normal-ordered nk4Index.
Definition QkTable.ipp:123
void fill_if(const std::vector< DiracSpinor > &basis, const YkTable &yk, const SelectionRules &SelectionFunction, int k_cut=-1, bool print=true)
Fill table with Coulomb Q integrals satisfying a selection rule.
Definition QkTable.ipp:699
Real P(int k, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d, const Angular::SixJTable *const sj=nullptr) const
Exchange integral P^k_abcd = (2k+1) sum_l {6j} Q^l_abdc.
Definition QkTable.ipp:238
bool is_NormalOrdered(nkIndex a, nkIndex b, nkIndex c, nkIndex d) const
Checks if set {a,b,c,d} are already in NormalOrder.
Definition QkTable.hpp:384
bool is_NormalOrdered(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d) const
Checks if set {a,b,c,d} are already in NormalOrder.
Definition QkTable.hpp:388
std::array< std::size_t, 4 > count_non_zero_integrals(const std::vector< DiracSpinor > &basis, std::size_t max_k=99, double eF=0.0) const
Definition QkTable.ipp:490
void update(const std::vector< DiracSpinor > &basis, const CoulombFunction &Fk, double damp, bool print=true, const std::function< bool(const DiracSpinor &, const DiracSpinor &, const DiracSpinor &, const DiracSpinor &)> &filter={})
Re-calculate all existing table entries using a CoulombFunction.
Definition QkTable.ipp:940
void write(const std::string &fname, bool verbose=true) const
Writes coulomb integrals to disk.
Definition QkTable.ipp:1014
auto operator->()
Gives arrow access to all underlying vector<unordered_map> functions.
Definition QkTable.hpp:229
bool contains(int k, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d) const
Checks if given {k,a,b,c,d} is in the table.
Definition QkTable.ipp:105
nk4Index NormalOrder(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d) const
Creates single 'nk4Index' corresponding to 'NormalOrder' symmetry of {a,b,c,d}.
Definition QkTable.ipp:429
nk4Index CurrentOrder(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d) const
Creates single 'nk4Index', WITHOUT accounting for 'NormalOrder'. Can be used to check if {a,...
Definition QkTable.ipp:442
static nk4Index FormIndex(nkIndex a, nkIndex b, nkIndex c, nkIndex d)
Converts given set of nkIndex's (in any order) to nk4Index.
Definition QkTable.ipp:451
Real R(int k, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d) const
Returns 'R', defined via: R := Q / (angular_coef)
Definition QkTable.ipp:186
std::array< nkIndex, 4 > UnFormIndex(const nk4Index &index) const
Breaks nk4Index back into {ia,ib,ic,id}. Not often used.
Definition QkTable.ipp:474
void fill(const std::vector< DiracSpinor > &basis, const YkTable &yk, int k_cut=-1, bool print=true)
Fill table with all non-zero Coulomb Q integrals from a YkTable.
Definition QkTable.ipp:566
int max_k() const
Definition QkTable.hpp:245
bool read(const std::string &fname, bool verbose=true, bool parse_basis_string=false)
Reads coulomb integrals to disk. Returns false if none read in. If parse_basis_string is true,...
Definition QkTable.ipp:1046
void summary() const
For testing: prints details of coulomb integrals stored.
Definition QkTable.ipp:21
Real g(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d, int tma, int tmb, int tmc, int tmd) const
Full matrix element g_abcd with explicit magnetic quantum numbers.
Definition QkTable.ipp:299
void add(int k, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d, Real value)
adds a new value. Note: does nothing if {k,a,b,c,d} already exists
Definition QkTable.ipp:53
Real Q(int k, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d) const
Retrieve a stored Q. If not present, returns 0. (Returns exactly as stored in table....
Definition QkTable.ipp:149
Real W(int k, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d, const Angular::SixJTable *const sj=nullptr) const
Antisymmetrised integral W^k_abcd = Q^k_abcd + P^k_abcd.
Definition QkTable.ipp:285
std::size_t count() const
Returns number of stored integrals.
Definition QkTable.ipp:37
bool emptyQ() const
Returns true if table is empty.
Definition QkTable.hpp:272
Calculates + stores Hartree Y functions + Angular (w/ look-up), taking advantage of symmetry.
Definition YkTable.hpp:46
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:55
uint16_t Index
Integer type for the compressed (n,kappa) index.
Definition DiracSpinor.hpp:73
Functions (+classes) for computing Coulomb integrals.
Definition CoulombBreit.cpp:13
void estimate_memory_usage(const std::string &basis_string, const std::string &core_string, int k_cut)
Estimate memory required for a QkTable for a given basis.
Definition QkTable.cpp:8
double Real
Data type used to store integrals.
Definition QkTable.hpp:37
std::function< bool(int, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)> SelectionRules
Function type for determining Coulomb(-like) integral selection rules. Takes k and 4 DiracSpinors,...
Definition QkTable.hpp:70
std::string_view to_string(Symmetry s)
Convert Symmetry to string.
Definition QkTable.hpp:22
uint64_t nk4Index
index type for set of 4 orbitals {nk,nk,nk,nk} -> nk4Index [max n: 256]
Definition QkTable.hpp:41
ankerl::unordered_dense::map< nk4Index, Real > QkMap
Hashmap type used to store integrals (one per k).
Definition QkTable.hpp:57
uint16_t nkIndex
index type for each {nk} (orbital) [max n: 256]
Definition QkTable.hpp:45
double estimate_memory_GB(std::size_t number_of_integrals, double load_factor)
Estimate memory required for a Qk table.
Definition QkTable.cpp:76
Symmetry
Symmetry (state index order) for tables.
Definition QkTable.hpp:19
std::function< double(int, const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)> CoulombFunction
Function type for calculating Coulomb(-like) integrals. Takes k and 4 DiracSpinors,...
Definition QkTable.hpp:64