ampsci
c++ program for high-precision atomic structure calculations of single-valence systems
|
Many-body perturbation theory. More...
Classes | |
class | Feynman |
Class to construct Feynman diagrams, Green's functions and polarisation op. More... | |
class | Goldstone |
Class to construct Feynman diagrams, Green's functions and polarisation op. More... | |
class | RDMatrix |
class | StructureRad |
Calculates Structure Radiation + Normalisation of states, using diagram method. More... | |
Typedefs | |
using | GMatrix = RDMatrix< double > |
using | ComplexGMatrix = RDMatrix< std::complex< double > > |
using | ComplexDouble = std::complex< double > |
Enumerations | |
enum class | SigmaMethod { Goldstone , Feynman } |
enum class | HoleParticle { exclude , include , include_k0 } |
Options for including hole-particle interaction. include mean all k; include_k0 means k=0 term only. | |
enum class | Screening { exclude , include , only } |
Options for including Screening. | |
enum class | GreenStates { both , core , excited } |
Which states to include in Green's function: | |
enum class | Denominators { RS , BW } |
Type of energy demoninators: Rayleigh-Schrodinger (RS), Brillouin-Wigner (BW). (not exact) | |
Functions | |
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=nullptr, const std::vector< double > &fk={}) |
Calculates ladder integral, L^k_mnab. More... | |
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=nullptr, const std::vector< double > &fk={}) |
Ladder integral, L^k_mnij := L1_mnij + L2_mnij + L2_nmji. More... | |
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, const std::vector< double > &fk) |
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=nullptr, const std::vector< double > &fk={}) |
Ladder integral, L^k_mnab := L1_mnij + L2_mnij + L3_nmji, L3_mnij = L2_nmji. More... | |
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, const Coulomb::LkTable *const lk_prev=nullptr, bool print_progbar=true, const std::vector< double > &fk={}) |
Fills Lk matrix. | |
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, const std::vector< double > &fk={}) |
template<typename Qintegrals , typename QorLintegrals > | |
double | de_valence (const DiracSpinor &v, const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const std::vector< double > &fk={}, const std::vector< double > &etak={}) |
Calculate energy shift (either ladder, or sigma2) for valence. More... | |
template<typename Qintegrals , typename QorLintegrals > | |
double | de_core (const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited) |
Calculate energy shift (either ladder, or sigma2) for CORE. More... | |
template<typename T > | |
bool | equal (const RDMatrix< T > &lhs, const RDMatrix< T > &rhs) |
Checks if two matrix's are equal (to within parts in 10^12) | |
template<typename T > | |
double | max_element (const RDMatrix< T > &a) |
returns maximum element (by abs) | |
template<typename T > | |
double | max_delta (const RDMatrix< T > &a, const RDMatrix< T > &b) |
returns maximum difference (abs) between two matrixs | |
template<typename T > | |
double | max_epsilon (const RDMatrix< T > &a, const RDMatrix< T > &b) |
returns maximum relative diference [aij-bij/(aij+bij)] (abs) between two matrices | |
std::pair< std::vector< DiracSpinor >, std::vector< DiracSpinor > > | split_basis (const std::vector< DiracSpinor > &basis, double E_Fermi, int min_n_core=1, int max_n_excited=999) |
Splits the basis into the core (holes) and excited states. More... | |
double | e_bar (int kappa_v, const std::vector< DiracSpinor > &excited) |
Returns energy of first state in excited that matches given kappa. | |
bool | Sk_vwxy_SR (int k, const DiracSpinor &v, const DiracSpinor &w, const DiracSpinor &x, const DiracSpinor &y) |
Selection rule for Sk_vwxy (differs from Qk_vwxy due to parity) | |
int | number_below_Fermi (const DiracSpinor &i, const DiracSpinor &j, const DiracSpinor &k, const DiracSpinor &l, double eFermi) |
Returns number of orbitals that are below Fermi level. Used for Qk selection. | |
std::pair< int, int > | k_minmax_S (const DiracSpinor &v, const DiracSpinor &w, const DiracSpinor &x, const DiracSpinor &y) |
Minimum/maximum k allowed by selectrion rules for Sk_vwxy. Cannot +=2. | |
std::pair< int, int > | k_minmax_S (int twojv, int twojw, int twojx, int twojy) |
double | Sk_vwxy (int k, const DiracSpinor &v, const DiracSpinor &w, const DiracSpinor &x, const DiracSpinor &y, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const Angular::SixJTable &SixJ, Denominators denominators=Denominators::BW) |
Reduced two-body Sigma (2nd order correlation) operator. Sum of 6 diagrams. More... | |
template<class CoulombIntegral > | |
double | Sigma_vw (const DiracSpinor &v, const DiracSpinor &w, const CoulombIntegral &qk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, int max_l_internal=99, std::optional< double > ev=std::nullopt) |
Matrix element of 1-body Sigma (2nd-order correlation) operator; de_v = <v|Sigma|v>. More... | |
Variables | |
const auto | vroot = [](auto x) { return std::sqrt(x); } |
Many-body perturbation theory.
double MBPT::de_core | ( | const Qintegrals & | qk, |
const QorLintegrals & | lk, | ||
const std::vector< DiracSpinor > & | core, | ||
const std::vector< DiracSpinor > & | excited | ||
) |
Calculate energy shift (either ladder, or sigma2) for CORE.
lk may be regular Coulomb integrals [in which case this returns MBPT(2) correction], or Ladder diagrams [in which case this returns the ladder diagram correction]
double MBPT::de_valence | ( | const DiracSpinor & | v, |
const Qintegrals & | qk, | ||
const QorLintegrals & | lk, | ||
const std::vector< DiracSpinor > & | core, | ||
const std::vector< DiracSpinor > & | excited, | ||
const std::vector< double > & | fk = {} , |
||
const std::vector< double > & | etak = {} |
||
) |
Calculate energy shift (either ladder, or sigma2) for valence.
lk may be regular Coulomb integrals [in which case this returns MBPT(2) correction], or Ladder diagrams [in which case this returns the ladder diagram correction]
double MBPT::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 = nullptr , |
||
const std::vector< double > & | fk = {} |
||
) |
Ladder integral, L^k_mnij := L1_mnij + L2_mnij + L2_nmji.
L1^k_mnij = sum_{rs,ul} A^{kul}_mnrsij * Q^u_mnrs * (Q+L)^l_rsij / (e_ij - e_rs)
A^{kul}_mnrsij = (-1)^{m+n+r+s+i+j+1} * [k] * {m,i,k;l,u,r} * {n,j,k;l,u,s}
double MBPT::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 = nullptr , |
||
const std::vector< double > & | fk = {} |
||
) |
Ladder integral, L^k_mnab := L1_mnij + L2_mnij + L3_nmji, L3_mnij = L2_nmji.
L2^k_mnij = sum_{rc,ul} (-1)^{k+u+l+1} A^{klu}_mjcrin Q^u_cnir * (Q+L)^l_mrcj / (e_cj - e_mr)
double MBPT::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 = nullptr , |
||
const std::vector< double > & | fk = {} |
||
) |
Calculates ladder integral, L^k_mnab.
Lk pointer is pointer to previous iteration of Lk. fk is optional vector of screening factors
double MBPT::Sigma_vw | ( | const DiracSpinor & | v, |
const DiracSpinor & | w, | ||
const CoulombIntegral & | qk, | ||
const std::vector< DiracSpinor > & | core, | ||
const std::vector< DiracSpinor > & | excited, | ||
int | max_l_internal = 99 , |
||
std::optional< double > | ev = std::nullopt |
||
) |
Matrix element of 1-body Sigma (2nd-order correlation) operator; de_v = <v|Sigma|v>.
Matrix element of 1-body Sigma (2nd-order correlation) operator; de_v = <v|Sigma|v>. qk (CoulombIntegral) may be YkTable or QkTable.
double MBPT::Sk_vwxy | ( | int | k, |
const DiracSpinor & | v, | ||
const DiracSpinor & | w, | ||
const DiracSpinor & | x, | ||
const DiracSpinor & | y, | ||
const Coulomb::QkTable & | qk, | ||
const std::vector< DiracSpinor > & | core, | ||
const std::vector< DiracSpinor > & | excited, | ||
const Angular::SixJTable & | SixJ, | ||
Denominators | denominators = Denominators::BW |
||
) |
Reduced two-body Sigma (2nd order correlation) operator. Sum of 6 diagrams.
Note: these have fewer symmetries to Q^k; S_vwxy = S_xyvw
std::pair< std::vector< DiracSpinor >, std::vector< DiracSpinor > > MBPT::split_basis | ( | const std::vector< DiracSpinor > & | basis, |
double | E_Fermi, | ||
int | min_n_core = 1 , |
||
int | max_n_excited = 999 |
||
) |
Splits the basis into the core (holes) and excited states.
States with energy below E_Fermi are considered core/holes; only core states with n>=min_n_core, and excited states with n<=max_n_excited are kept.