High-precision calculations for one- and two-valence atomic systems
MBPT::Feynman

ok

Direct correlation potential diagrams via the Feynman technique.

Constructs Hartree-Fock Green's functions, the polarisation operator, and the direct Sigma diagrams, as matrices on a radial sub-grid. The direct Sigma is formed by integrating, along Im(w) at fixed Re(w) = omre, the product of the Green's function \( G(\varepsilon_v + \omega) \) and the Coulomb-polarisation-Coulomb operator, \( Q\Pi Q(\omega) \).

Allows all-order inclusion of:

  • screening of the Coulomb interaction: \( Q\Pi Q \to Q\Pi X Q \), with \( X = [1 + iQ\Pi]^{-1} \)
  • the hole-particle interaction, in the polarisation operator

Exchange diagrams are not formed here (see Goldstone).

#include <Feynman.hpp>

Public Member Functions

 Feynman (const HF::HartreeFock *vHF, std::size_t i0, std::size_t stride, std::size_t size, const FeynmanOptions &options, int n_min_core, bool include_G, bool verbose=true, const std::string &ident="", bool form_qpq=true)
 Sets up the Feynman method on given sub-grid, and forms Q*Pi*Q.
 
bool screening () const
 True if Coulomb screening is included.
 
bool hole_particle () const
 True if hole-particle interaction is included.
 
std::size_t stride () const
 Returns stride used for sub-grid.
 
int n_min () const
 Minimum n of core states in the polarisation loop.
 
int max_k () const
 Maximum multipolarity, k.
 
double omre () const
 Real part of frequency used for integration.
 
double w0 () const
 First non-zero point of the frequency grid along Im(w)
 
double wratio () const
 Ratio of the logarithmic frequency grid along Im(w)
 
int lmax () const
 Maximum l for internal lines.
 
ComplexGMatrix green (int kappa, std::complex< double > en, GreenStates states=GreenStates::both) const
 Green's function for given kappa, at complex energy en.
 
ComplexGMatrix green_complex_dirac (int kappa, std::complex< double > en) const
 Green's function, solving the Dirac equation directly at complex en.
 
ComplexGMatrix green_dyson (int kappa, std::complex< double > en) const
 Green's function by the Dyson (resolvent) method.
 
ComplexGMatrix green_basis (int kappa, std::complex< double > en, const std::vector< DiracSpinor > &basis) const
 Green's function for given kappa, as a sum over an explicit basis.
 
std::vector< ComplexRMatrix > polarisation_each_k (std::complex< double > omega, bool hole_particle) const
 Polarisation operator pi^k(w), for each k = 0..max_k separately.
 
std::vector< std::vector< ComplexRMatrix > > polarisation_wk () const
 Polarisation operator pi^k(w) on the frequency grid, for each k.
 
void form_qpiq (const std::string &ident="")
 Forms Q*Pi*Q along the frequency grid (required by Sigma_direct).
 
void form_qpiq (const std::vector< std::vector< ComplexRMatrix > > &pi_wk)
 Forms Q*Pi*Q (with screening, if set) from given polarisation op.
 
bool has_qpiq () const
 True once Q*Pi*Q has been formed.
 
bool read_qpiq (const std::string &ident)
 Reads Q*Pi*Q from the disk cache for ident (file prefix).
 
bool write_qpiq (const std::string &ident)
 Writes Q*Pi*Q to the disk cache for ident; false if not written.
 
GMatrix Sigma_direct (int kappa_v, double en_v, std::optional< int > k={}) const
 Direct part of the correlation potential, for kappa_v at en_v.
 
std::vector< GMatrix > Sigma_direct_each_k (int kappa_v, double en_v) const
 Direct part of correlation potential, for each multipole k.
 
const ComplexRMatrix & get_qk (int k) const
 Returns (reference to) radial Coulomb matrix, q^k.
 
const GMatrix & get_Vx_kappa (int kappa) const
 Returns (ref to) radial exchange matrix Vx_kappa. Nb: includes dri*drj.
 
const ComplexGMatrix & get_Pcore (int kappa) const
 Returns (ref to) summed core projection operator, for given kappa.
 
Feynman & operator= (const Feynman &)=default
 
 Feynman (const Feynman &)=default
 

Constructor & Destructor Documentation

◆ Feynman()

MBPT::Feynman::Feynman ( const HF::HartreeFock *  vHF,
std::size_t  i0,
std::size_t  stride,
std::size_t  size,
const FeynmanOptions &  options,
int  n_min_core,
bool  include_G,
bool  verbose = true,
const std::string &  ident = "",
bool  form_qpq = true 
)

Sets up the Feynman method on given sub-grid, and forms Q*Pi*Q.

Forms the radial Coulomb (q^k), core projection, and Hartree-Fock exchange matrices, and the frequency quadrature along Im(w). Q*Pi*Q is the expensive step: only needed for Sigma_direct (the Green's functions etc. do not need it), and can be skipped (form_qpq = false) and formed later with form_qpiq().

Parameters
vHFHartree-Fock (core, potential, grid). Pointer is stored: must outlive this object
i0Sub-grid: index of first point on the full grid
strideSub-grid stride: every stride-th point of full grid
sizeNumber of sub-grid points
optionsScreening, hole-particle, internal lines, frequency grid, Green's function method (see FeynmanOptions)
n_min_coreMinimum n of core states in the polarisation loop
include_GInclude small (g) components throughout. Always on if vHF includes Breit
verbosePrint summary of options
identFile prefix for the Q*Pi*Q disk cache ("" or "false": no cache)
form_qpqForm Q*Pi*Q on construction

Member Function Documentation

◆ screening()

bool MBPT::Feynman::screening ( ) const
inline

True if Coulomb screening is included.

◆ hole_particle()

bool MBPT::Feynman::hole_particle ( ) const
inline

True if hole-particle interaction is included.

◆ stride()

std::size_t MBPT::Feynman::stride ( ) const
inline

Returns stride used for sub-grid.

◆ n_min()

int MBPT::Feynman::n_min ( ) const
inline

Minimum n of core states in the polarisation loop.

◆ max_k()

int MBPT::Feynman::max_k ( ) const
inline

Maximum multipolarity, k.

◆ omre()

double MBPT::Feynman::omre ( ) const
inline

Real part of frequency used for integration.

◆ w0()

double MBPT::Feynman::w0 ( ) const
inline

First non-zero point of the frequency grid along Im(w)

◆ wratio()

double MBPT::Feynman::wratio ( ) const
inline

Ratio of the logarithmic frequency grid along Im(w)

◆ lmax()

int MBPT::Feynman::lmax ( ) const
inline

Maximum l for internal lines.

◆ green()

ComplexGMatrix MBPT::Feynman::green ( int  kappa,
std::complex< double >  en,
GreenStates  states = GreenStates::both 
) const

Green's function for given kappa, at complex energy en.

For states = both, the full Hartree-Fock Green's function. With complex_green set (see FeynmanOptions): solved directly at complex energy for small Im(en), and by the Dyson method at large Im(en) (where it is consistent with the discrete radial sums). Otherwise, Dyson method throughout.

Parameters
kappaDirac quantum number
enComplex energy
statesWhich states to include:
  • both : core and excited
  • core : core only, sum over core states a of |a>

◆ green_complex_dirac()

ComplexGMatrix MBPT::Feynman::green_complex_dirac ( int  kappa,
std::complex< double >  en 
) const

Green's function, solving the Dirac equation directly at complex en.

cf. green(), which mixes this with the Dyson method.

◆ green_dyson()

ComplexGMatrix MBPT::Feynman::green_dyson ( int  kappa,
std::complex< double >  en 
) const

Green's function by the Dyson (resolvent) method.

Solves at Re(en), then shifts to complex energy. cf. green(), which mixes the two methods.

◆ green_basis()

ComplexGMatrix MBPT::Feynman::green_basis ( int  kappa,
std::complex< double >  en,
const std::vector< DiracSpinor > &  basis 
) const

Green's function for given kappa, as a sum over an explicit basis.

\( G = \sum_n \ket{n}\bra{n}/(\varepsilon - \varepsilon_n) \), over states in basis with given kappa.

◆ polarisation_each_k()

std::vector< ComplexRMatrix > MBPT::Feynman::polarisation_each_k ( std::complex< double >  omega,
bool  hole_particle 
) const

Polarisation operator pi^k(w), for each k = 0..max_k separately.

Not summed over k:

\[ \Pi^k(\omega) = i \sum_{a,n} \frac{(C^k_{an})^2}{2k+1} \, F_a^\dagger \left[ G^{\rm ex}_n(\varepsilon_a - \omega) + G^{\rm ex}_n(\varepsilon_a + \omega) \right] F_a, \]

with core states a (n >= n_min) and excited-state Green's functions for each internal kappa_n. Green's functions are computed once and re-used across all k.

Parameters
omegaComplex frequency
hole_particleInclude the hole-particle interaction (independent of the option set on construction)

◆ polarisation_wk()

std::vector< std::vector< ComplexRMatrix > > MBPT::Feynman::polarisation_wk ( ) const

Polarisation operator pi^k(w) on the frequency grid, for each k.

This is the expensive stage of forming Q*Pi*Q. Nothing is stored: pass the result to form_qpiq(pi_wk) to form Q*Pi*Q (for this object, or for another that differs only in screening). Depends on the hole-particle option, not on screening.

Returns
pi^k(w) at every point of the frequency grid, indexed [iw][k].

◆ form_qpiq() [1/2]

void MBPT::Feynman::form_qpiq ( const std::string &  ident = "")

Forms Q*Pi*Q along the frequency grid (required by Sigma_direct).

With ident, reads from the disk cache if a matching file exists, else forms and writes it (see read_qpiq/write_qpiq).

◆ form_qpiq() [2/2]

void MBPT::Feynman::form_qpiq ( const std::vector< std::vector< ComplexRMatrix > > &  pi_wk)

Forms Q*Pi*Q (with screening, if set) from given polarisation op.

pi_wk is from polarisation_wk(), and may be shared between Feynman objects that differ only in screening. With screening, \( Q\Pi Q \to Q\Pi X Q \), with \( X = [1 + iQ\Pi]^{-1} \).

Warning
pi_wk must be on the same sub-grid and frequency grid (checked only by assert).

◆ has_qpiq()

bool MBPT::Feynman::has_qpiq ( ) const
inline

True once Q*Pi*Q has been formed.

◆ read_qpiq()

bool MBPT::Feynman::read_qpiq ( const std::string &  ident)

Reads Q*Pi*Q from the disk cache for ident (file prefix).

Returns
False if no matching file (or ident is "" or "false").

◆ write_qpiq()

bool MBPT::Feynman::write_qpiq ( const std::string &  ident)

Writes Q*Pi*Q to the disk cache for ident; false if not written.

◆ Sigma_direct()

GMatrix MBPT::Feynman::Sigma_direct ( int  kappa_v,
double  en_v,
std::optional< int >  k = {} 
) const

Direct part of the correlation potential, for kappa_v at en_v.

Summed over multipoles k (unless k given) and internal kappa. See class description.

Parameters
kappa_vValence Dirac quantum number
en_vEnergy at which Sigma is formed
kIf given, only this multipole (zero matrix if out of range)
Warning
Q*Pi*Q must be formed first (see form_qpiq); checked only by assert.

◆ Sigma_direct_each_k()

std::vector< GMatrix > MBPT::Feynman::Sigma_direct_each_k ( int  kappa_v,
double  en_v 
) const

Direct part of correlation potential, for each multipole k.

Not summed: Sigma_d = sum of these. Same cost as a single Sigma_direct call, since the Green's functions are shared by all k.

Warning
Q*Pi*Q must be formed first (see form_qpiq).

◆ get_qk()

const ComplexRMatrix & MBPT::Feynman::get_qk ( int  k) const
inline

Returns (reference to) radial Coulomb matrix, q^k.

\( q^k_{ij} = (r_<^k / r_>^{k+1}) \, dr_j \): includes the right-hand integration measure (drj) only.

◆ get_Vx_kappa()

const GMatrix & MBPT::Feynman::get_Vx_kappa ( int  kappa) const
inline

Returns (ref to) radial exchange matrix Vx_kappa. Nb: includes dri*drj.

◆ get_Pcore()

const ComplexGMatrix & MBPT::Feynman::get_Pcore ( int  kappa) const
inline

Returns (ref to) summed core projection operator, for given kappa.

\( P = \sum_a \ket{a}\bra{a} \). No integration measure.


The documentation for this class was generated from the following files: