2#include "Angular/include.hpp"
3#include "Coulomb/include.hpp"
4#include "MBPT/SpinorMatrix.hpp"
5#include "Wavefunction/DiracSpinor.hpp"
29 if ((a.
l() + b.
l() + c.l() + d.
l()) % 2 != 0) {
34 return {std::max(l1, l2), std::min(u1, u2)};
43inline std::pair<int, int>
k_minmax_L(
int kap_a,
int kap_b,
int kap_c,
55 return {std::max(l1, l2), std::min(u1, u2)};
89 const std::vector<DiracSpinor> &excited,
bool include_L4,
92 std::optional<double> e_i = {}, std::optional<double> e_m = {});
124 std::optional<double> e_i = {});
155 std::optional<double> e_j = {}, std::optional<double> e_m = {});
167 const std::vector<DiracSpinor> &core,
169 const Coulomb::LkTable *
const Lk =
nullptr, std::optional<double> e_i = {}) {
170 return L2(k, n, m, j, i, qk, core, excited, SJ, Lk, e_i);
201 std::optional<double> e_m = {});
223 const std::vector<DiracSpinor> &excited,
224 const std::vector<DiracSpinor> &core,
225 const std::vector<DiracSpinor> &i_orbs,
bool include_L4,
258 const std::vector<DiracSpinor> &excited,
259 const std::vector<DiracSpinor> &core,
260 const std::vector<DiracSpinor> &update_i,
bool include_L4,
292template <
typename Q
integrals,
typename QorL
integrals>
294 const QorLintegrals &lk,
const std::vector<DiracSpinor> &core,
295 const std::vector<DiracSpinor> &excited);
322template <
typename Q
integrals,
typename L
integrals>
324 const Lintegrals &lk,
const std::vector<DiracSpinor> &core,
325 const std::vector<DiracSpinor> &excited,
342template <
typename Q
integrals,
typename QorL
integrals>
343double de_core(
const Qintegrals &qk,
const QorLintegrals &lk,
344 const std::vector<DiracSpinor> &core,
345 const std::vector<DiracSpinor> &excited);
453 const std::vector<DiracSpinor> &excited,
454 const std::vector<DiracSpinor> &projection,
457 double r0 = 1.0e-4,
double rmax = 30.0,
458 std::size_t stride = 4,
bool include_G =
false);
499 const std::vector<DiracSpinor> &core,
500 const std::vector<DiracSpinor> &excited,
bool include_L4,
537 const std::vector<DiracSpinor> &core,
538 const std::vector<DiracSpinor> &excited,
bool include_L4,
583 const DiracSpinor &v,
const std::vector<DiracSpinor> &core,
587 double rmax = 30.0, std::size_t stride = 4,
bool include_G =
false);
618bool write_SigmaL(
const std::string &fname,
const std::vector<SigmaLData> &SLs,
632std::vector<SigmaLData>
read_SigmaL(
const std::string &fname,
633 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:55
int twoj() const
2j (twice the total angular momentum)
Definition DiracSpinor.hpp:121
int l() const
Orbital angular momentum Q number.
Definition DiracSpinor.hpp:117
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 en
Energy Sigma_L was evaluated at.
Definition Ladder.hpp:603
GMatrix SL
Sigma_L matrix, on its own sub-grid.
Definition Ladder.hpp:605
int kappa
Dirac quantum number of the state Sigma_L was formed for.
Definition Ladder.hpp:599
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 ladder integral L^k_inab over external index i.
Definition Ladder.cpp:1060
SigmaLMethod parseSigmaLMethod(const std::string &method)
Converts string (name) to SigmaLMethod enum (case-insensitive).
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 method.
Definition Ladder.cpp:1341
std::pair< int, int > k_minmax_L(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)
Min and max k (multipolarity) allowed for ladder integral L^k_abcd.
Definition Ladder.hpp:23
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).
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 ladder integral L^k_mnia over 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
int n
Principal quantum number of the state Sigma_L was formed for.
Definition Ladder.hpp:601
SigmaLMethod
Method used to construct the ladder correlation potential, Sigma_L.
Definition Ladder.hpp:358
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:165
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 state.
Definition Ladder.hpp:597