2#include "Angular/include.hpp"
3#include "Coulomb/include.hpp"
4#include "MBPT/SpinorMatrix.hpp"
5#include "Wavefunction/DiracSpinor.hpp"
23 if ((a.
l() + b.
l() + c.l() + d.
l()) % 2 != 0) {
28 return {std::max(l1, l2), std::min(u1, u2)};
33inline std::pair<int, int>
k_minmax_L(
int kap_a,
int kap_b,
int kap_c,
45 return {std::max(l1, l2), std::min(u1, u2)};
78 const std::vector<DiracSpinor> &excited,
bool include_L4,
81 std::optional<double> e_i = {}, std::optional<double> e_m = {});
112 std::optional<double> e_i = {});
141 std::optional<double> e_j = {}, std::optional<double> e_m = {});
152 const std::vector<DiracSpinor> &core,
154 const Coulomb::LkTable *
const Lk =
nullptr, std::optional<double> e_i = {}) {
155 return L2(k, n, m, j, i, qk, core, excited, SJ, Lk, e_i);
180 std::optional<double> e_m = {});
201 const std::vector<DiracSpinor> &excited,
202 const std::vector<DiracSpinor> &core,
203 const std::vector<DiracSpinor> &i_orbs,
bool include_L4,
233 const std::vector<DiracSpinor> &excited,
234 const std::vector<DiracSpinor> &core,
235 const std::vector<DiracSpinor> &update_i,
bool include_L4,
259template <
typename Q
integrals,
typename QorL
integrals>
261 const QorLintegrals &lk,
const std::vector<DiracSpinor> &core,
262 const std::vector<DiracSpinor> &excited);
287template <
typename Q
integrals,
typename L
integrals>
289 const Lintegrals &lk,
const std::vector<DiracSpinor> &core,
290 const std::vector<DiracSpinor> &excited,
306template <
typename Q
integrals,
typename QorL
integrals>
307double de_core(
const Qintegrals &qk,
const QorLintegrals &lk,
308 const std::vector<DiracSpinor> &core,
309 const std::vector<DiracSpinor> &excited);
400 const std::vector<DiracSpinor> &excited,
401 const std::vector<DiracSpinor> &projection,
404 double r0 = 1.0e-4,
double rmax = 30.0,
405 std::size_t stride = 4,
bool include_G =
false);
431 const std::vector<DiracSpinor> &core,
432 const std::vector<DiracSpinor> &excited,
bool include_L4,
453 const std::vector<DiracSpinor> &core,
454 const std::vector<DiracSpinor> &excited,
bool include_L4,
497 const DiracSpinor &v,
const std::vector<DiracSpinor> &core,
501 double rmax = 30.0, std::size_t stride = 4,
bool include_G =
false);
521bool write_SigmaL(
const std::string &fname,
const std::vector<SigmaLData> &SLs,
532std::vector<SigmaLData>
read_SigmaL(
const std::string &fname,
533 const std::shared_ptr<const Grid> &grid);
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
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:44
int twoj() const
2j (twice the total angular momentum)
Definition DiracSpinor.hpp:97
int l() const
Orbital angular momentum Q number.
Definition DiracSpinor.hpp:93
Non-uniform radial grid with Jacobian, suitable for atomic structure calculations.
Definition Grid.hpp:85
constexpr int l_k(int ka)
returns l given kappa
Definition Wigner369j.hpp:44
constexpr int twoj_k(int ka)
returns 2j given kappa
Definition Wigner369j.hpp:46
std::pair< int, int > k_minmax_tj(int tja, int tjb)
Returns min and max k (multipolarity) allowed for Triangle(k,a,b), NOT accounting for parity (2j only...
Definition CoulombIntegrals.hpp:104
Many-body perturbation theory.
Definition MatrixElements.hpp:12
double de_valence_w(const DiracSpinor &v, const Qintegrals &qk, const Lintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const Angular::SixJTable *sj=nullptr)
Ladder (or MBPT2) valence energy, antisymmetrising the FIRST integral.
double L2(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk, std::optional< double > e_j, std::optional< double > e_m)
Particle–hole ladder diagram L2.
Definition Ladder.cpp:400
DiracSpinor Lkv_inab(int k, const DiracSpinor &v, const DiracSpinor &n, const DiracSpinor &a, const DiracSpinor &b, const Coulomb::QkTable &qk, const Coulomb::YkTable &yk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, bool include_L4, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk)
Vertex (ket) form of the ladder integral L^k_inab over the external index i (the m-slot).
Definition Ladder.cpp:1060
SigmaLMethod parseSigmaLMethod(const std::string &method)
Converts string (name) to SigmaLMethod enum (case-insensitive); warns and defaults to ladder if unkno...
Definition Ladder.cpp:24
void update_Lk_mnib(Coulomb::LkTable *lk, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &excited, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &update_i, bool include_L4, const Angular::SixJTable &sjt, const Coulomb::LkTable *const lk_prev, double a_damp, bool print)
Updates the ladder integral table with L(Q,Q) -> L(Q,Q+L)
Definition Ladder.cpp:1429
GMatrix Sigma_ladder_direct(const DiracSpinor &v, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const Coulomb::QkTable &qk, const Coulomb::YkTable &yk, const Coulomb::LkTable *lk, const Angular::SixJTable &sjt, bool include_L4, double r0, double rmax, std::size_t stride, bool include_G)
Ladder correlation potential Sigma_L via the direct (open external line) method.
Definition Ladder.cpp:1341
std::pair< int, int > k_minmax_L(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)
Returns min and max k (multipolarity) allowed for ladder integral L^k_abcd. Triangle rules {a,...
Definition Ladder.hpp:17
double L1(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &excited, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk, std::optional< double > e_i)
Particle–particle ladder diagram L1.
Definition Ladder.cpp:126
GMatrix Sigma_ladder(const DiracSpinor &v, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const std::vector< DiracSpinor > &projection, const Coulomb::QkTable &qk, const Coulomb::LkTable *lk, const Angular::SixJTable &sjt, bool include_L4, double r0, double rmax, std::size_t stride, bool include_G)
Ladder-diagram correction to the correlation potential, Sigma_L(e_v), by projection (or,...
Definition Ladder.cpp:574
std::vector< SigmaLData > read_SigmaL(const std::string &fname, const std::shared_ptr< const Grid > &grid)
Reads Sigma_L (ladder) matrices from binary file.
Definition Ladder.cpp:1528
DiracSpinor Lkv_mnia(int k, const DiracSpinor &v, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &a, const Coulomb::QkTable &qk, const Coulomb::YkTable &yk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, bool include_L4, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk)
Vertex (ket) form of the ladder integral L^k_mnia over the external index i.
Definition Ladder.cpp:777
double Lkmnij(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, bool include_L4, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk, std::optional< double > e_i, std::optional< double > e_m)
Full ladder integral summed over all diagrams.
Definition Ladder.cpp:107
double de_core(const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited)
Second-order (or ladder) correction to the core energy.
void fill_Lk_mnib(Coulomb::LkTable *lk, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &excited, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &i_orbs, bool include_L4, const Angular::SixJTable &sjt, int max_k, bool print)
Fills the ladder integral table for all new index combinations.
Definition Ladder.cpp:499
SigmaLMethod
Method used to construct the ladder correlation potential, Sigma_L.
Definition Ladder.hpp:321
bool write_SigmaL(const std::string &fname, const std::vector< SigmaLData > &SLs, const Grid &grid)
Writes Sigma_L (ladder) matrices to binary file.
Definition Ladder.cpp:1479
double L3(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk=nullptr, std::optional< double > e_i={})
Exchange partner of L2; equals L2 with m,n and i,j swapped.
Definition Ladder.hpp:150
double de_valence(const DiracSpinor &v, const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited)
Second-order (or ladder) correction to the valence energy.
double L4(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &core, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk, std::optional< double > e_m)
Core–core (hole–hole) ladder diagram L4.
Definition Ladder.cpp:272
Ladder correlation potential matrix, Sigma_L, for a single (kappa, n) state, evaluated at energy en.
Definition Ladder.hpp:507