High-precision calculations for one- and two-valence atomic systems
Feynman.hpp
1#pragma once
2#include "HF/HartreeFock.hpp"
3#include "MBPT/RadialMatrix.hpp"
4#include "MBPT/SpinorMatrix.hpp"
5#include "Maths/Grid.hpp"
6#include "Wavefunction/DiracSpinor.hpp"
7#include <memory>
8#include <vector>
9
10namespace MBPT {
11
12// FeynmanOptions class
13
14/*!
15 @brief Options for including the hole-particle interaction.
16
17 @details
18 - exclude : not included
19 - include : included, all k
20 - include_k0 : included, k=0 term only
21*/
22enum class HoleParticle { exclude, include, include_k0 };
23
24//! Options for including Screening
25enum class Screening { exclude, include };
26
27//! Options for the Feynman method (see Feynman)
29 //! Include all-order screening of the Coulomb interaction
30 Screening screening{Screening::exclude};
31 //! Include hole-particle interaction in the polarisation operator
32 HoleParticle hole_particle{HoleParticle::exclude};
33 //! Maximum l for internal lines (at least the maximum l in the core)
35 //! Real part of the frequency, for integration along Im(w) (see best_omre)
36 double omre{-0.3};
37 /*!
38 @brief First non-zero point of the frequency grid along Im(w).
39
40 @details
41 u=0 is always included. The [0, w0] panel is a trapezoid: w0 must be
42 small compared to the pole distances (~|omre|) so the integrand is flat
43 across the panel.
44 */
45 double w0{0.01};
46 //! Ratio for the logarithmic frequency grid along Im(w)
47 double w_ratio{1.5};
48 /*!
49 @brief Method for the Green's function at complex energy.
50
51 @details
52 - false : solve at Re(en), extend to complex energy via Dyson (resolvent)
53 - true : solve the Dirac equation directly at complex energy (Dyson still
54 used at large Im(en); see Feynman::green)
55 */
56 bool complex_green{true};
57};
58
59/*!
60 @brief Which states to include in the Green's function.
61
62 @details
63 - both : core and excited (full Hartree-Fock Green's function)
64 - core : core states only
65 - excited : excited states only (orthogonalised to the core)
66*/
67enum class GreenStates { both, core, excited };
68
69//------------------------------------------------------------------------------
70/*!
71 @brief Direct correlation potential diagrams via the Feynman technique.
72
73 @details
74 Constructs Hartree-Fock Green's functions, the polarisation operator, and
75 the direct Sigma diagrams, as matrices on a radial sub-grid. The direct
76 Sigma is formed by integrating, along Im(w) at fixed Re(w) = omre, the
77 product of the Green's function \f$ G(\varepsilon_v + \omega) \f$ and the
78 Coulomb-polarisation-Coulomb operator, \f$ Q\Pi Q(\omega) \f$.
79
80 Allows all-order inclusion of:
81 - screening of the Coulomb interaction:
82 \f$ Q\Pi Q \to Q\Pi X Q \f$, with \f$ X = [1 + iQ\Pi]^{-1} \f$
83 - the hole-particle interaction, in the polarisation operator
84
85 Exchange diagrams are not formed here (see Goldstone).
86*/
87class Feynman {
88
89 // Pointer to HF potential, and HF core
90 const HF::HartreeFock *m_HF;
91 // Pointer to shared radial grid (full grid)
92 std::shared_ptr<const Grid> m_grid;
93 // Parameters of the sub-grid: initial/final points, stride
94 std::size_t m_i0, m_stride, m_subgrid_points;
95
96 // maximum kappa_index appearing in the core
97 std::size_t m_max_ki_core;
98 // maximum kappa index to include for internal lines
99 std::size_t m_max_ki;
100 // maximum multipolarity, k
101 int m_max_k;
102 // Lowest n to polarise in polarisation operator
103 int m_min_core_n;
104 // Include the small (g) spinor components: in the internal lines (Green's
105 // functions, exchange and projection matrices, polarisation loop) and in
106 // Sigma itself. Changes Sigma by ~0.05%, but costs ~8x in the linear
107 // algebra. Always on with Breit (Vx then mixes f and g)
108 bool m_include_G;
109 // real part of frequency for integration
110 double m_omre;
111 // Parameters of the log grid along Im(w): first point, ratio
112 double m_w0;
113 double m_wratio;
114 // Frequency quadrature along Im(w): points u_i (u_0 = 0 explicitly) and
115 // weights W_i in linear measure: int_0^inf F(u) du =~ sum_i W_i F(u_i).
116 // Weights include the [0, w0] end panel and the u^-3 large-u tail.
117 std::vector<double> m_wgrid_points{};
118 std::vector<double> m_wgrid_weights{};
119
120 // Option: include hole-particle interaction into polarisation operator
121 bool m_hole_particle;
122 // Option to include higher-k in hp interaction
123 bool m_include_higher_order_hp;
124 // Include screening correction to Coulomb line in Q*Pi*Q => Q*Pi*X*Q
125 bool m_screen_Coulomb;
126
127 // Coulomb operator; include right integration measure
128 // q_ij := (r>^k/r<^{k+1}) * dr_j
129 std::vector<ComplexRMatrix> m_qk{};
130
131 // Core projection operators (one for each core state)
132 std::vector<ComplexGMatrix> m_pa{};
133 // Summed core projection operator, P = sum_a |a><a| (one for each kappa)
134 std::vector<ComplexGMatrix> m_Pcore{};
135 // Hartree-Fock Exchange matrix (one for each kappa)
136 std::vector<GMatrix> m_Vx_kappa{};
137
138 // Effective spinless Q*Pi*Q operator: for each imaginary omega, and each k
140
141 // Method for complex-energy Green's function (see FeynmanOptions)
142 // false: Dyson method (solve at real energy, correct to complex);
143 // true: solve Dirac equation directly at complex energy
144 bool m_Complex_green_method;
145
146public:
147 /*!
148 @brief Sets up the Feynman method on given sub-grid, and forms Q*Pi*Q.
149
150 @details
151 Forms the radial Coulomb (q^k), core projection, and Hartree-Fock
152 exchange matrices, and the frequency quadrature along Im(w). Q*Pi*Q is
153 the expensive step: only needed for Sigma_direct (the Green's functions
154 etc. do not need it), and can be skipped (@p form_qpq = false) and formed
155 later with form_qpiq().
156
157 @param vHF Hartree-Fock (core, potential, grid). Pointer is
158 stored: must outlive this object
159 @param i0 Sub-grid: index of first point on the full grid
160 @param stride Sub-grid stride: every stride-th point of full grid
161 @param size Number of sub-grid points
162 @param options Screening, hole-particle, internal lines, frequency
163 grid, Green's function method (see FeynmanOptions)
164 @param n_min_core Minimum n of core states in the polarisation loop
165 @param include_G Include small (g) components throughout. Always on if
166 @p vHF includes Breit
167 @param verbose Print summary of options
168 @param ident File prefix for the Q*Pi*Q disk cache ("" or "false":
169 no cache)
170 @param form_qpq Form Q*Pi*Q on construction
171 */
172 Feynman(const HF::HartreeFock *vHF, std::size_t i0, std::size_t stride,
173 std::size_t size, const FeynmanOptions &options, int n_min_core,
174 bool include_G, bool verbose = true, const std::string &ident = "",
175 bool form_qpq = true);
176
177 //! True if Coulomb screening is included
178 bool screening() const { return m_screen_Coulomb; }
179 //! True if hole-particle interaction is included
180 bool hole_particle() const { return m_hole_particle; }
181
182 //! Returns stride used for sub-grid
183 std::size_t stride() const { return m_stride; }
184
185 //! Minimum n of core states in the polarisation loop
186 int n_min() const { return m_min_core_n; }
187 //! Maximum multipolarity, k
188 int max_k() const { return m_max_k; }
189 //! Real part of frequency used for integration
190 double omre() const { return m_omre; }
191 //! First non-zero point of the frequency grid along Im(w)
192 double w0() const { return m_w0; }
193 //! Ratio of the logarithmic frequency grid along Im(w)
194 double wratio() const { return m_wratio; }
195 //! Maximum l for internal lines
196 int lmax() const { return Angular::kindex_to_l(m_max_ki); }
197
198 /*!
199 @brief Green's function for given kappa, at complex energy @p en.
200
201 @details
202 For @p states = both, the full Hartree-Fock Green's function. With
203 complex_green set (see FeynmanOptions): solved directly at complex energy
204 for small Im(en), and by the Dyson method at large Im(en) (where it is
205 consistent with the discrete radial sums). Otherwise, Dyson method
206 throughout.
207
208 @param kappa Dirac quantum number
209 @param en Complex energy
210 @param states Which states to include:
211 - both : core and excited
212 - core : core only, sum over core states a of
213 |a><a|/(en - e_a)
214 - excited : excited only (orthogonalised to the core)
215 */
216 ComplexGMatrix green(int kappa, std::complex<double> en,
217 GreenStates states = GreenStates::both) const;
218
219 /*!
220 @brief Green's function, solving the Dirac equation directly at complex en.
221
222 @details
223 cf. green(), which mixes this with the Dyson method.
224 */
225 ComplexGMatrix green_complex_dirac(int kappa, std::complex<double> en) const;
226
227 /*!
228 @brief Green's function by the Dyson (resolvent) method.
229
230 @details
231 Solves at Re(en), then shifts to complex energy. cf. green(), which mixes
232 the two methods.
233 */
234 ComplexGMatrix green_dyson(int kappa, std::complex<double> en) const;
235
236 /*!
237 @brief Green's function for given kappa, as a sum over an explicit basis.
238
239 @details
240 \f$ G = \sum_n \ket{n}\bra{n}/(\varepsilon - \varepsilon_n) \f$, over
241 states in @p basis with given kappa.
242 */
243 ComplexGMatrix green_basis(int kappa, std::complex<double> en,
244 const std::vector<DiracSpinor> &basis) const;
245
246 /*!
247 @brief Polarisation operator pi^k(w), for each k = 0..max_k separately.
248
249 @details
250 Not summed over k:
251 \f[
252 \Pi^k(\omega) = i \sum_{a,n} \frac{(C^k_{an})^2}{2k+1} \,
253 F_a^\dagger \left[ G^{\rm ex}_n(\varepsilon_a - \omega)
254 + G^{\rm ex}_n(\varepsilon_a + \omega) \right] F_a,
255 \f]
256 with core states a (n >= n_min) and excited-state Green's functions for
257 each internal kappa_n. Green's functions are computed once and re-used
258 across all k.
259
260 @param omega Complex frequency
261 @param hole_particle Include the hole-particle interaction (independent
262 of the option set on construction)
263 */
264 std::vector<ComplexRMatrix> polarisation_each_k(std::complex<double> omega,
265 bool hole_particle) const;
266
267 /*!
268 @brief Polarisation operator pi^k(w) on the frequency grid, for each k.
269
270 @details
271 This is the expensive stage of forming Q*Pi*Q. Nothing is stored: pass
272 the result to form_qpiq(pi_wk) to form Q*Pi*Q (for this object, or for
273 another that differs only in screening). Depends on the hole-particle
274 option, not on screening.
275
276 @return pi^k(w) at every point of the frequency grid, indexed [iw][k].
277 */
278 std::vector<std::vector<ComplexRMatrix>> polarisation_wk() const;
279
280 /*!
281 @brief Forms Q*Pi*Q along the frequency grid (required by Sigma_direct).
282
283 @details
284 With @p ident, reads from the disk cache if a matching file exists, else
285 forms and writes it (see read_qpiq/write_qpiq).
286 */
287 void form_qpiq(const std::string &ident = "");
288
289 /*!
290 @brief Forms Q*Pi*Q (with screening, if set) from given polarisation op.
291
292 @details
293 @p pi_wk is from polarisation_wk(), and may be shared between Feynman
294 objects that differ only in screening. With screening,
295 \f$ Q\Pi Q \to Q\Pi X Q \f$, with \f$ X = [1 + iQ\Pi]^{-1} \f$.
296
297 @warning @p pi_wk must be on the same sub-grid and frequency grid
298 (checked only by assert).
299 */
300 void form_qpiq(const std::vector<std::vector<ComplexRMatrix>> &pi_wk);
301
302 //! True once Q*Pi*Q has been formed
303 bool has_qpiq() const { return m_qpiq_wk.size() != 0; }
304
305 /*!
306 @brief Reads Q*Pi*Q from the disk cache for @p ident (file prefix).
307
308 @return False if no matching file (or @p ident is "" or "false").
309 */
310 bool read_qpiq(const std::string &ident);
311
312 //! Writes Q*Pi*Q to the disk cache for ident; false if not written
313 bool write_qpiq(const std::string &ident);
314
315 /*!
316 @brief Direct part of the correlation potential, for kappa_v at en_v.
317
318 @details
319 Summed over multipoles k (unless @p k given) and internal kappa. See
320 class description.
321
322 @param kappa_v Valence Dirac quantum number
323 @param en_v Energy at which Sigma is formed
324 @param k If given, only this multipole (zero matrix if out of
325 range)
326
327 @warning Q*Pi*Q must be formed first (see form_qpiq); checked only by
328 assert.
329 */
330 GMatrix Sigma_direct(int kappa_v, double en_v,
331 std::optional<int> k = {}) const;
332
333 /*!
334 @brief Direct part of correlation potential, for each multipole k.
335
336 @details
337 Not summed: Sigma_d = sum of these. Same cost as a single Sigma_direct
338 call, since the Green's functions are shared by all k.
339
340 @warning Q*Pi*Q must be formed first (see form_qpiq).
341 */
342 std::vector<GMatrix> Sigma_direct_each_k(int kappa_v, double en_v) const;
343
344 /*!
345 @brief Returns (reference to) radial Coulomb matrix, q^k.
346
347 @details
348 \f$ q^k_{ij} = (r_<^k / r_>^{k+1}) \, dr_j \f$: includes the right-hand
349 integration measure (drj) only.
350 */
351 const ComplexRMatrix &get_qk(int k) const { return m_qk.at(std::size_t(k)); }
352
353 //! Returns (ref to) radial exchange matrix Vx_kappa. Nb: includes dri*drj
354 const GMatrix &get_Vx_kappa(int kappa) const {
355 return m_Vx_kappa.at(Angular::kappa_to_kindex(kappa));
356 }
357
358 /*!
359 @brief Returns (ref to) summed core projection operator, for given kappa.
360
361 @details
362 \f$ P = \sum_a \ket{a}\bra{a} \f$. No integration measure.
363 */
364 const ComplexGMatrix &get_Pcore(int kappa) const {
365 return m_Pcore.at(Angular::kappa_to_kindex(kappa));
366 }
367
368private:
369 // forms Qk matrices, as well as dri, drj
370 void form_qk();
371 // Forms core projection operators
372 void form_pa();
373 // Forms HF exchange potential matrix
374 void form_vx();
375 // Sets up the frequency quadrature (points + weights) along Im(w):
376 // u = 0 explicitly (the integrand is finite, generically maximal, there),
377 // composite Simpson's rule in ln(u) on the log grid [w0, wmax], trapezoid
378 // panel for [0, w0], and u^-3 tail correction beyond wmax
379 void form_w_quadrature(double w0, double wratio);
380 // Disk-cache filename for Q*Pi*Q (encodes the options it depends on);
381 // "" if caching is disabled for this ident
382 std::string qpiq_filename(const std::string &ident) const;
383
384 bool readwrite_qpiq(IO::FRW::RoW rw, const std::string &fname);
385
386 // Screening factor X = [1 + i qk*pik]^-1
387 ComplexRMatrix X_screen(const ComplexRMatrix &pik,
388 const ComplexRMatrix &qdri) const;
389
390 // Forms single "Green's function" contribution f*|ket><bra|
391 // (f is usually 1/(e-en))
392 ComplexGMatrix green_single(const DiracSpinor &ket, const DiracSpinor &bra,
393 const std::complex<double> f) const;
394
395 // Forms full Hartree-Fock green's function. If Fc_hp is given,
396 // includes hole-particle contribution (Fc is polarised core state).
397 // Uses Dyson method to extend to complex energies.
398 ComplexGMatrix green_hf(int kappa, std::complex<double> en,
399 const DiracSpinor *Fc_hp = nullptr) const;
400
401 // Forms full Hartree-Fock green's function. If Fc_hp is given,
402 // includes hole-particle contribution (Fc is polarised core state).
403 // Uses "Complex Dirac" method for complex energies.
405 green_hf_complex_dirac(int kappa, std::complex<double> en,
406 const DiracSpinor *Fc_hp = nullptr) const;
407
408 // Given Gr(wr), and wi (wr is real), returns Gr(wr + i*wi)
409 ComplexGMatrix green_to_complex(const ComplexGMatrix &Gr,
410 double om_imag) const;
411
412 // Green's function, only due to core states
413 ComplexGMatrix green_core(int kappa, std::complex<double> en) const;
414
415 // Greens function, only due to excited states (by orthog to core)
416 ComplexGMatrix green_excited(int kappa, std::complex<double> en,
417 const DiracSpinor *Fc_hp = nullptr) const;
418
419 // Projects core states out of Green's fn from both sides:
420 // G -> (1-P) G (1-P), with P = sum_a |a><a| dr (discrete brakets)
421 ComplexGMatrix orthogonalise_wrt_core(const ComplexGMatrix &g_in,
422 int kappa) const;
423
424 // Replaces each sampled cell of a complex-energy Green matrix by its
425 // average over the dr*dr cell (near-diagonal cells are otherwise
426 // unresolved on the sub-grid); factors from the solutions' local decay
427 void cell_average(ComplexGMatrix *G, const DiracSpinor &x0,
428 const DiracSpinor &Ix0, const DiracSpinor &xI,
429 const DiracSpinor &IxI) const;
430
431 // Given Dirac solutions regular at 0 (x0) and infinity (xI), forms "local"
432 // Green's function, with all four spinor components
433 GMatrix construct_green_g0(const DiracSpinor &x0, const DiracSpinor &xI,
434 const double w) const;
435
436 // Given Dirac solutions regular at 0 (x0 + i*Ix0) and infinity (xI + i*IxI),
437 // forms "local" Green's function (complex).
438 ComplexGMatrix construct_green_g0(const DiracSpinor &x0,
439 const DiracSpinor &Ix0,
440 const DiracSpinor &xI,
441 const DiracSpinor &IxI,
442 const std::complex<double> w) const;
443
444 // Calculates hole-particle potential (1-P)Vhp(1-P)
445 GMatrix calculate_Vhp(int kappa, const DiracSpinor &Fc) const;
446
447 // [[nodiscard]] const ComplexGMatrix &get_dri() const { return m_dri; }
448 // [[nodiscard]] const ComplexGMatrix &get_drj() const { return m_drj; }
449
450public:
451 Feynman &operator=(const Feynman &) = default;
452 Feynman(const Feynman &) = default;
453 ~Feynman() = default;
454};
455
456/*!
457 @brief Best real part of the frequency, omre, for the direct diagram.
458
459 @details
460 The value furthest from any pole of the u=0 integrand. With
461 \f$ \Delta = \varepsilon_{\rm exc} - \varepsilon_{\rm core} \f$
462 (lowest excited minus highest core energy), the window
463 \f$ (-\Delta, 0) \f$ is free of true poles; inside it lie only the weak
464 fictitious poles at core-core energy differences (imperfect core
465 subtraction in the polarisation-loop Gex) and, for non-lowest valence
466 states, the small valence-valence differences (valence-line G). Only the
467 lowest few physical excited states enter, so the valence list suffices: no
468 basis/spectrum needed (a typical valence energy is assumed if the list is
469 empty). One omre serves all valence states.
470
471 @param core Core states
472 @param valence Valence states (lowest sets the window)
473 @param print Print Delta, the in-window poles, and the chosen omre
474
475 @return Midpoint of the largest pole-free gap.
476*/
477double best_omre(const std::vector<DiracSpinor> &core,
478 const std::vector<DiracSpinor> &valence, bool print = false);
479
480} // namespace MBPT
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:55
Solves relativistic Hartree-Fock equations for core and valence. Optionally includes Breit and QED ef...
Definition HartreeFock.hpp:114
Row-major dense matrix with arithmetic and linear algebra support.
Definition Matrix.hpp:208
Direct correlation potential diagrams via the Feynman technique.
Definition Feynman.hpp:87
std::vector< GMatrix > Sigma_direct_each_k(int kappa_v, double en_v) const
Direct part of correlation potential, for each multipole k.
Definition Feynman.cpp:1170
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.
Definition Feynman.cpp:691
std::vector< std::vector< ComplexRMatrix > > polarisation_wk() const
Polarisation operator pi^k(w) on the frequency grid, for each k.
Definition Feynman.cpp:1081
std::size_t stride() const
Returns stride used for sub-grid.
Definition Feynman.hpp:183
bool screening() const
True if Coulomb screening is included.
Definition Feynman.hpp:178
bool hole_particle() const
True if hole-particle interaction is included.
Definition Feynman.hpp:180
ComplexGMatrix green(int kappa, std::complex< double > en, GreenStates states=GreenStates::both) const
Green's function for given kappa, at complex energy en.
Definition Feynman.cpp:252
bool read_qpiq(const std::string &ident)
Reads Q*Pi*Q from the disk cache for ident (file prefix).
Definition Feynman.cpp:953
const ComplexRMatrix & get_qk(int k) const
Returns (reference to) radial Coulomb matrix, q^k.
Definition Feynman.hpp:351
int lmax() const
Maximum l for internal lines.
Definition Feynman.hpp:196
double w0() const
First non-zero point of the frequency grid along Im(w)
Definition Feynman.hpp:192
const ComplexGMatrix & get_Pcore(int kappa) const
Returns (ref to) summed core projection operator, for given kappa.
Definition Feynman.hpp:364
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.
Definition Feynman.cpp:1147
int n_min() const
Minimum n of core states in the polarisation loop.
Definition Feynman.hpp:186
double omre() const
Real part of frequency used for integration.
Definition Feynman.hpp:190
bool has_qpiq() const
True once Q*Pi*Q has been formed.
Definition Feynman.hpp:303
ComplexGMatrix green_dyson(int kappa, std::complex< double > en) const
Green's function by the Dyson (resolvent) method.
Definition Feynman.cpp:281
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.
Definition Feynman.cpp:484
const GMatrix & get_Vx_kappa(int kappa) const
Returns (ref to) radial exchange matrix Vx_kappa. Nb: includes dri*drj.
Definition Feynman.hpp:354
ComplexGMatrix green_complex_dirac(int kappa, std::complex< double > en) const
Green's function, solving the Dirac equation directly at complex en.
Definition Feynman.cpp:275
void form_qpiq(const std::string &ident="")
Forms Q*Pi*Q along the frequency grid (required by Sigma_direct).
Definition Feynman.cpp:1073
bool write_qpiq(const std::string &ident)
Writes Q*Pi*Q to the disk cache for ident; false if not written.
Definition Feynman.cpp:959
double wratio() const
Ratio of the logarithmic frequency grid along Im(w)
Definition Feynman.hpp:194
int max_k() const
Maximum multipolarity, k.
Definition Feynman.hpp:188
Radial matrix: stored on a sub-grid (defined by i0, stride, size).
Definition RadialMatrix.hpp:26
Radial Dirac spinor matrix.
Definition SpinorMatrix.hpp:57
constexpr std::uint64_t kappa_to_kindex(int ka)
returns kappa_index, given kappa
Definition Wigner369j.hpp:98
constexpr int kindex_to_l(std::uint64_t i)
returns l, given kappa_index
Definition Wigner369j.hpp:116
Many-body perturbation theory.
Definition MatrixElements.hpp:12
double w_ratio
Ratio for the logarithmic frequency grid along Im(w)
Definition Feynman.hpp:47
double best_omre(const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &valence, bool print)
Best real part of the frequency, omre, for the direct diagram.
Definition Feynman.cpp:826
GreenStates
Which states to include in the Green's function.
Definition Feynman.hpp:67
double omre
Real part of the frequency, for integration along Im(w) (see best_omre)
Definition Feynman.hpp:36
HoleParticle hole_particle
Include hole-particle interaction in the polarisation operator.
Definition Feynman.hpp:32
Screening
Options for including Screening.
Definition Feynman.hpp:25
bool complex_green
Method for the Green's function at complex energy.
Definition Feynman.hpp:56
Screening screening
Include all-order screening of the Coulomb interaction.
Definition Feynman.hpp:30
int max_l_internal
Maximum l for internal lines (at least the maximum l in the core)
Definition Feynman.hpp:34
double w0
First non-zero point of the frequency grid along Im(w).
Definition Feynman.hpp:45
HoleParticle
Options for including the hole-particle interaction.
Definition Feynman.hpp:22
Options for the Feynman method (see Feynman)
Definition Feynman.hpp:28