ampsci
High-precision calculations for one- and two-valence atomic systems
HF::Breit

ok

Breit potentials for one- (Hartree-Fock Breit) and two-body Breit integrals.

#include <Breit.hpp>

Classes

struct  Params
 Parameters for constructing Breit interaction operator (s,m,n,o,p,f) More...
 

Public Member Functions

 Breit ()
 Constructs Breit with default parameters.
 
 Breit (const Params &params)
 Constructs Breit interaction operator from parameters.
 
void update_scale (double t_scale=1.0, double t_M=1.0, double t_N=1.0, double t_O=1.0, double t_P=1.0)
 Update all scaling factors.
 
void update_lambda_f (double lambda_f)
 Update frequency scaling factor.
 
void fill_gb (const std::vector< DiracSpinor > &basis, int t_max_k=99)
 Precompute Breit integral lookup tables for rapid evaluation.
 
double scale_factor () const
 Returns the overall scaling factor.
 
DiracSpinor VbrFa (const DiracSpinor &Fa, const std::vector< DiracSpinor > &core) const
 Calculates Breit contribution with automatic frequency dependence.
 
DiracSpinor dV_Br (int kappa, int K, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Xbeta, const DiracSpinor &Ybeta) const
 Breit-TDHF: Breit correction to the TDHF correction to Hartree-Fock.
 
DiracSpinor Bkv_bcd (int k, int kappa_v, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Direct Breit two-body integral "right-hand-side".
 
DiracSpinor BPkv_bcd (int k, int kappa_v, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Exchange Breit two-body integral "right-hand-side".
 
DiracSpinor BWkv_bcd (int k, int kappa_v, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Anti-symmetrised Breit two-body integral "right-hand-side".
 
double Bk_abcd (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Reduced static Breit two-body matrix element.
 
double BPk_abcd (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Reduced static exchange Breit two-body matrix element.
 
double BWk_abcd (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Reduced static anti-symmetrised Breit two-body matrix element.
 
double Bk_abcd_2 (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Reduced static Breit matrix element (tabulated, fast lookup)
 
double BPk_abcd_2 (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Reduced exchange Breit matrix element (tabulated, fast lookup)
 
double BWk_abcd_2 (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Reduced anti-symmetrised Breit matrix element (tabulated, fast lookup)
 
double de2_HF (const DiracSpinor &Fv, const std::vector< DiracSpinor > &holes, const std::vector< DiracSpinor > &excited) const
 The one-body Breit (Breit-Hartree-Fock) correction to second-order energy.
 
double de2 (const DiracSpinor &Fv, const std::vector< DiracSpinor > &holes, const std::vector< DiracSpinor > &excited) const
 The two-body Breit correction to second-order energy.
 
double Bk_abcd_freqw (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Frequency-dependent reduced Breit two-body matrix element.
 
double BPk_abcd_freqw (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Frequency-dependent reduced exchange Breit two-body matrix element.
 
double BWk_abcd_freqw (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd) const
 Frequency-dependent reduced anti-symmetrised Breit two-body matrix element.
 
double Bk_abcd_freqw (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd, const double w) const
 Frequency-dependent reduced Breit two-body matrix element (explicit frequency)
 
double BPk_abcd_freqw (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd, const double w) const
 Frequency-dependent reduced exchange Breit two-body matrix element (explicit frequency)
 
double BWk_abcd_freqw (int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd, const double w) const
 Frequency-dependent reduced anti-symmetrised Breit two-body matrix element (explicit frequency)
 
DiracSpinor Bkv_bcd_freqw (int k, int kappa_v, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd, const double w) const
 Frequency-dependent Breit two-body integral "right-hand-side".
 
DiracSpinor BPkv_bcd_freqw (int k, int kappa_v, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd, const double w) const
 Frequency-dependent exchange Breit two-body integral "right-hand-side".
 
DiracSpinor BWkv_bcd_freqw (int k, int kappa_v, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd, const double w) const
 Frequency-dependent anti-symmetrised Breit two-body integral "right-hand-side".
 

Static Public Member Functions

static bool Bk_SR (int k, const DiracSpinor &v, const DiracSpinor &w, const DiracSpinor &x, const DiracSpinor &y)
 Selection rule check for Breit integrals.
 
static std::pair< int, int > k_minmax (const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)
 Determine valid multipolarity range for Breit integrals.
 
static std::pair< int, int > k_minmax_tj (int tja, int tjb, int tjc, int tjd)
 Determine valid multipolarity range for Breit integrals from quantum numbers.
 

Class Documentation

◆ HF::Breit::Params

struct HF::Breit::Params
Class Members
double scale {1.0} Overall scaling factor for Breit contributions (default 1.0)
double m {1.0} Scaling for M term (Gaunt part, default 1.0)
double n {1.0} Scaling for N term (Gaunt part, default 1.0)
double o {1.0} Scaling for O term (retarded part, default 1.0)
double p {1.0} Scaling for P term (retarded part, default 1.0)
double lambda_f {0.0} Scaling factor for frequency in frequency-dependent Breit (default 0.0 = static)

Constructor & Destructor Documentation

◆ Breit() [1/2]

HF::Breit::Breit ( )
inline

Constructs Breit with default parameters.

Equivalent to Breit(Params{}). See Breit::Params for default values.

◆ Breit() [2/2]

HF::Breit::Breit ( const Params params)
inlineexplicit

Constructs Breit interaction operator from parameters.

Creates a Breit operator with scaling factors specified in Params. See Params for documentation of each scaling factor.

Parameters
paramsParams struct containing all scaling factors

Member Function Documentation

◆ update_scale()

void HF::Breit::update_scale ( double  t_scale = 1.0,
double  t_M = 1.0,
double  t_N = 1.0,
double  t_O = 1.0,
double  t_P = 1.0 
)
inline

Update all scaling factors.

Updates the overall scaling factor, individual term scaling factors (M, N, O, P), and the frequency scaling factor for frequency-dependent Breit calculations.

Parameters
t_scaleOverall scaling factor (default 1.0)
t_MScaling for M term (Gaunt part, default 1.0)
t_NScaling for N term (Gaunt part, default 1.0)
t_OScaling for O term (retarded part, default 1.0)
t_PScaling for P term (retarded part, default 1.0)
Note
Does not update lambda_f (f-dependent scaling). Use update_lambda_f() for that.

◆ update_lambda_f()

void HF::Breit::update_lambda_f ( double  lambda_f)
inline

Update frequency scaling factor.

Sets the scaling factor for the frequency in frequency-dependent Breit calculations. The frequency used in the integrals is multiplied by this factor.

Parameters
lambda_fFrequency scaling factor (should be > 0; default 1.0)
Note
Setting lambda_f to very small values approaches the static Breit limit.

◆ Bk_SR()

static bool HF::Breit::Bk_SR ( int  k,
const DiracSpinor v,
const DiracSpinor w,
const DiracSpinor x,
const DiracSpinor y 
)
inlinestatic

Selection rule check for Breit integrals.

Tests whether the four-body Breit integral B^k_{vwxy} is nonzero based on angular momentum selection rules.

Parameters
kMultipolarity (angular momentum rank of the interaction)
v(w,x,y): electron states
Returns
True if the integral is potentially nonzero (angular momentum selection rules are satisfied); false if the integral vanishes.

◆ k_minmax()

static std::pair< int, int > HF::Breit::k_minmax ( const DiracSpinor a,
const DiracSpinor b,
const DiracSpinor c,
const DiracSpinor d 
)
inlinestatic

Determine valid multipolarity range for Breit integrals.

Minimum and maximum allowed multipolarity k for a four-body Breit integral.

Parameters
a(b,c,d) electron states
Returns
A pair {k_min, k_max} giving the valid multipolarity range. Returns with k_max < k_min (invalid range) if no valid k exists.
Note
This is the static method analogue of Coulomb::k_minmax_tj, adapted for the four-body Breit structure.

◆ k_minmax_tj()

static std::pair< int, int > HF::Breit::k_minmax_tj ( int  tja,
int  tjb,
int  tjc,
int  tjd 
)
inlinestatic

Determine valid multipolarity range for Breit integrals from quantum numbers.

As k_minmax but for 2*j (doesn't require DiracSpinors)

◆ fill_gb()

void HF::Breit::fill_gb ( const std::vector< DiracSpinor > &  basis,
int  t_max_k = 99 
)

Precompute Breit integral lookup tables for rapid evaluation.

Pre-calculates and stores reduced Breit integrals for all unique pairs of basis orbitals and all multipolarity values k, enabling much faster integral lookups via the Bk_abcd_2() family of functions. This trades memory for speed, allowing rapid evaluation in HF iterations.

Parameters
basisThe set of basis orbitals to use
t_max_kMaximum multipolarity k to compute (default 99). Actual maximum used is the minimum of this value and the physical constraint k_minmax() for the given basis.
Warning
This function uses substantial memory – use with caution for large calculations. Have mostly found the speedup is not worth the memory cost, so this is generally not used anymore. Used in CI.
Note
Must be called once before using the faster variants Bk_abcd_2(), BPk_abcd_2(), or BWk_abcd_2(). Calling it multiple times will recompute and overwrite previous results.
Warning
ONLY for static Breit

◆ scale_factor()

double HF::Breit::scale_factor ( ) const
inline

Returns the overall scaling factor.

◆ VbrFa()

DiracSpinor HF::Breit::VbrFa ( const DiracSpinor Fa,
const std::vector< DiracSpinor > &  core 
) const

Calculates Breit contribution with automatic frequency dependence.

Computes the Hartree-Fock Breit interaction V_br*Fa for a valence electron interacting with the core. This is the direct Breit contribution from all core electrons.

Will be static version is lambda = 0, otherwise, frequency-dependent.

Parameters
FaValence electron state
coreCore electron states
Returns
The Breit-Hartree-Fock potential applied to Fa, computed at the appropriate frequency regime based on m_lambda_f.
Note
For frequency-dependent calculations, this may be substantially slower due to spherical Bessel function evaluation in the radial integrals.

◆ dV_Br()

DiracSpinor HF::Breit::dV_Br ( int  kappa,
int  K,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Xbeta,
const DiracSpinor Ybeta 
) const

Breit-TDHF: Breit correction to the TDHF correction to Hartree-Fock.

Calculates the Breit correction to the TDHF potential, dV. This represents the response of the Breit field to the core electron perturbations.

Parameters
kappaDirac quantum number of the resulting state/projection
KMultipolarity (rank) of the RPA operator
FaElectron state (acting on this)
FbCore state undergoing perturbation
XbetaX perturbation to core state: from ExternalField::TDHF
YbetaY perturbation to core state: from ExternalField::TDHF
Returns
The reduced RPA correction dV_Br*Fa
Note
Only frequency-independent for now

◆ Bkv_bcd()

DiracSpinor HF::Breit::Bkv_bcd ( int  k,
int  kappa_v,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Direct Breit two-body integral "right-hand-side".

Computes the radial function of the direct part of the reduced Breit operator acting on an orbital with quantum number kappa_v. This is defined such that the two-body matrix element factorises as:

\[ B^k_{abcd} = \langle a | B^k_v(b,c,d) \rangle \]

Note
Frequency independent version

See Bk_abcd()

◆ BPkv_bcd()

DiracSpinor HF::Breit::BPkv_bcd ( int  k,
int  kappa_v,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Exchange Breit two-body integral "right-hand-side".

See Bkv_bcd() and BPk_abcd()

Note
Frequency independent version

◆ BWkv_bcd()

DiracSpinor HF::Breit::BWkv_bcd ( int  k,
int  kappa_v,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Anti-symmetrised Breit two-body integral "right-hand-side".

See Bkv_bcd() and BWk_abcd()

Note
Frequency independent version

◆ Bk_abcd()

double HF::Breit::Bk_abcd ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Reduced static Breit two-body matrix element.

Calculates the static (frequency-independent) reduced two-body Breit matrix element B^k_{abcd}, the Breit analogue of the Coulomb Q^k integral.

Note
Frequency independent version
Parameters
kMultipolarity (angular momentum rank of the interaction)
Fa(Fb,Fc,Fd) electron states
Returns
The static reduced Breit matrix element B^k_{abcd}.
Note
Selection rules depend on angular momentum quantum numbers via Bk_SR(). Use k_minmax() to determine the valid multipolarity range before calling.
This function re-computes all radial integrals each call. For repeated calls with the same basis, call fill_gb() once, then use the faster variant Bk_abcd_2() instead.

◆ BPk_abcd()

double HF::Breit::BPk_abcd ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Reduced static exchange Breit two-body matrix element.

Calculates the static reduced exchange Breit matrix element P(B)^k_{abcd}, the Breit analogue of the Coulomb P^k integral.

Note
Frequency independent version

◆ BWk_abcd()

double HF::Breit::BWk_abcd ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Reduced static anti-symmetrised Breit two-body matrix element.

Calculates the static reduced anti-symmetrised Breit matrix element W(B)^k_{abcd} = B^k_{abcd} + P(B)^k_{abcd}.

Note
Frequency independent version

◆ Bk_abcd_2()

double HF::Breit::Bk_abcd_2 ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Reduced static Breit matrix element (tabulated, fast lookup)

A faster implementation of Bk_abcd() that looks up pre-tabulated integrals computed by fill_gb(). Reduces computational cost, at significant memory cost.

The result is the same as Bk_abcd() for the same inputs, provided fill_gb() has been called at least once on a basis containing Fa, Fb, Fc, Fd.

Parameters
kMultipolarity (angular momentum rank of the interaction)
Fa(Fb,Fc,Fd) electron states
Returns
The reduced Breit matrix element B^k_{abcd}, retrieved from the cached m_gb tables.
Note
REQUIRES: fill_gb() must have been called before this function can be used. If fill_gb() has not been called, this function returns zero or garbage data. This function assumes the spinors Fa, Fb, Fc, Fd were members of the basis passed to fill_gb(); using spinors outside that basis is undefined.
Warning
Do not use this function unless fill_gb() has been successfully called.
Note
Only implemented for frequency independent case

◆ BPk_abcd_2()

double HF::Breit::BPk_abcd_2 ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Reduced exchange Breit matrix element (tabulated, fast lookup)

A much faster implementation of BPk_abcd() that looks up pre-tabulated exchange integrals computed by fill_gb(). Reduces computational cost from O(radial grid size) per call to O(1) lookup.

The result is identical to BPk_abcd() for the same inputs, provided fill_gb() has been called at least once on a basis containing all four electron states.

Parameters
kMultipolarity (angular momentum rank of the interaction)
Fa(Fb,Fc,Fd) electron states
Returns
The reduced exchange Breit matrix element P(B)^k_{abcd}, retrieved from the cached m_gb tables.
Note
REQUIRES: fill_gb() must have been called before this function can be used. The spinors must be members of the basis provided to fill_gb().
Warning
Do not use this function unless fill_gb() has been successfully called.
Note
Only implemented for frequency independent case

◆ BWk_abcd_2()

double HF::Breit::BWk_abcd_2 ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Reduced anti-symmetrised Breit matrix element (tabulated, fast lookup)

A much faster implementation of BWk_abcd() that looks up pre-tabulated integrals computed by fill_gb(). Combines the tabulated direct and exchange terms for O(1) evaluation.

The result is identical to BWk_abcd() for the same inputs, provided fill_gb() has been called at least once on a basis containing all four electron states.

Parameters
kMultipolarity (angular momentum rank of the interaction)
Fa(Fb,Fc,Fd) electron states
Returns
The reduced anti-symmetrised Breit matrix element W(B)^k_{abcd} = Bk_abcd_2(...) + BPk_abcd_2(...), retrieved from cached m_gb tables.
Note
REQUIRES: fill_gb() must have been called before this function can be used. The spinors must be members of the basis provided to fill_gb().
Warning
Do not use this function unless fill_gb() has been successfully called.
Note
Only implemented for frequency independent case

◆ de2_HF()

double HF::Breit::de2_HF ( const DiracSpinor Fv,
const std::vector< DiracSpinor > &  holes,
const std::vector< DiracSpinor > &  excited 
) const

The one-body Breit (Breit-Hartree-Fock) correction to second-order energy.

Calculates the one-body Breit (Breit-Hartree-Fock) correction to second-order energy for a single-valence atom. This is included automatically if Breit is included into Hartree-Fock. (The lowest-order Breit correction <v|V_Br|v> not included.)

Parameters
FvThe valence electron state of interest
holesOccupied core electron states
excitedVirtual excited electron states
Returns
The one-body Breit correction to second-order energy: delta E^(2, 1).
Note
This represents only the one-particle (Hartree-Fock) contribution. The two-particle (Sigma) contribution is computed by de2(). For Breit-Coulomb self-consistent HF, this is already accounted for and should not be added separately.
Warning
May significantly overcount or undercount energy shifts if Breit-Coulomb HF is not self-consistent. Use primarily as a correction term in perturbative Breit-on-Coulomb calculations.
Note
Will automatically include freuqnecy-dependence if lambda non-zero

◆ de2()

double HF::Breit::de2 ( const DiracSpinor Fv,
const std::vector< DiracSpinor > &  holes,
const std::vector< DiracSpinor > &  excited 
) const

The two-body Breit correction to second-order energy.

Calculates the two-body Breit correction to second-order energy for a single-valence atom. This is not included automatically if Breit is included into Hartree-Fock, since it requires modification of two-body Coulomb integals.

Note
This is just the energy shift - Breit can be included fully into MBPT calculations self-consistantly another way (see MBPT)
  • Note
    Only frequency independent

◆ Bk_abcd_freqw() [1/2]

double HF::Breit::Bk_abcd_freqw ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Frequency-dependent reduced Breit two-body matrix element.

  • Automatically determines frequency, based on DiracSpinors
  • Frequency-dependent analogue of Bk_abcd(). See Bkv_bcd_freqw().

◆ BPk_abcd_freqw() [1/2]

double HF::Breit::BPk_abcd_freqw ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Frequency-dependent reduced exchange Breit two-body matrix element.

◆ BWk_abcd_freqw() [1/2]

double HF::Breit::BWk_abcd_freqw ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd 
) const

Frequency-dependent reduced anti-symmetrised Breit two-body matrix element.

◆ Bk_abcd_freqw() [2/2]

double HF::Breit::Bk_abcd_freqw ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd,
const double  w 
) const

Frequency-dependent reduced Breit two-body matrix element (explicit frequency)

Frequency-dependent analogue of Bk_abcd(). See Bkv_bcd_freqw().

◆ BPk_abcd_freqw() [2/2]

double HF::Breit::BPk_abcd_freqw ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd,
const double  w 
) const

Frequency-dependent reduced exchange Breit two-body matrix element (explicit frequency)

Frequency-dependent analogue of BPk_abcd(). See Bkv_bcd_freqw().

◆ BWk_abcd_freqw() [2/2]

double HF::Breit::BWk_abcd_freqw ( int  k,
const DiracSpinor Fa,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd,
const double  w 
) const

Frequency-dependent reduced anti-symmetrised Breit two-body matrix element (explicit frequency)

Frequency-dependent analogue of BWk_abcd(). See Bkv_bcd_freqw().

◆ Bkv_bcd_freqw()

DiracSpinor HF::Breit::Bkv_bcd_freqw ( int  k,
int  kappa_v,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd,
const double  w 
) const

Frequency-dependent Breit two-body integral "right-hand-side".

Frequency-dependent breit analogue of Bkv_bcd()

◆ BPkv_bcd_freqw()

DiracSpinor HF::Breit::BPkv_bcd_freqw ( int  k,
int  kappa_v,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd,
const double  w 
) const

Frequency-dependent exchange Breit two-body integral "right-hand-side".

Frequency-dependent version of BPkv_bcd(). See Bkv_bcd_freqw().

◆ BWkv_bcd_freqw()

DiracSpinor HF::Breit::BWkv_bcd_freqw ( int  k,
int  kappa_v,
const DiracSpinor Fb,
const DiracSpinor Fc,
const DiracSpinor Fd,
const double  w 
) const

Frequency-dependent anti-symmetrised Breit two-body integral "right-hand-side".

Frequency-dependent version of BWkv_bcd(). See Bkv_bcd_freqw().


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