![]() |
|
High-precision calculations for one- and two-valence atomic systems
|
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:
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 | |
| 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().
| vHF | Hartree-Fock (core, potential, grid). Pointer is stored: must outlive this object |
| i0 | Sub-grid: index of first point on the full grid |
| stride | Sub-grid stride: every stride-th point of full grid |
| size | Number of sub-grid points |
| options | Screening, hole-particle, internal lines, frequency grid, Green's function method (see FeynmanOptions) |
| n_min_core | Minimum n of core states in the polarisation loop |
| include_G | Include small (g) components throughout. Always on if vHF includes Breit |
| verbose | Print summary of options |
| ident | File prefix for the Q*Pi*Q disk cache ("" or "false": no cache) |
| form_qpq | Form Q*Pi*Q on construction |
|
inline |
True if Coulomb screening is included.
|
inline |
True if hole-particle interaction is included.
|
inline |
Returns stride used for sub-grid.
|
inline |
Minimum n of core states in the polarisation loop.
|
inline |
Maximum multipolarity, k.
|
inline |
Real part of frequency used for integration.
|
inline |
First non-zero point of the frequency grid along Im(w)
|
inline |
Ratio of the logarithmic frequency grid along Im(w)
|
inline |
Maximum l for internal lines.
| 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.
| kappa | Dirac quantum number |
| en | Complex energy |
| states | Which states to include:
|
| 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.
| 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.
| 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.
| 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.
| omega | Complex frequency |
| hole_particle | Include the hole-particle interaction (independent of the option set on construction) |
| 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.
| 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).
| 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} \).
pi_wk must be on the same sub-grid and frequency grid (checked only by assert).
|
inline |
True once Q*Pi*Q has been formed.
| bool MBPT::Feynman::read_qpiq | ( | const std::string & | ident | ) |
Reads Q*Pi*Q from the disk cache for ident (file prefix).
ident is "" or "false"). | bool MBPT::Feynman::write_qpiq | ( | const std::string & | ident | ) |
Writes Q*Pi*Q to the disk cache for ident; false if not written.
| 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.
| kappa_v | Valence Dirac quantum number |
| en_v | Energy at which Sigma is formed |
| k | If given, only this multipole (zero matrix if out of range) |
| 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.
|
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.
|
inline |
Returns (ref to) radial exchange matrix Vx_kappa. Nb: includes dri*drj.
|
inline |
Returns (ref to) summed core projection operator, for given kappa.
\( P = \sum_a \ket{a}\bra{a} \). No integration measure.