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

Calculates Structure Radiation + Normalisation of states, using diagram method. More...

#include <StructureRad.hpp>

Public Member Functions

 StructureRad (const std::vector< DiracSpinor > &basis, double en_core, std::pair< int, int > nminmax={0, 999}, const std::string &Qk_fname="", int k_cut=99, const std::vector< double > &fk={}, const std::vector< double > &etak={}, bool verbose=true)
 Construct a Structeure Radiation (MBPT) object.
 
const std::vector< DiracSpinor > & core () const
 const reference to employed subset of core orbitals
 
const std::vector< DiracSpinor > & excited () const
 const reference to employed subset of excited orbitals
 
const std::vector< DiracSpinor > & basis () const
 const reference to employed subset of core+excited orbitals
 
const Coulomb::meTable< double > & me_Table () const
 const reference to underlying matrix element table. May be empty
 
const Coulomb::YkTableYk () const
 const reference to Yk table. NOTE: may not be initialised!
 
const std::optional< Coulomb::QkTable > & Qk () const
 const reference to underlying Qk table. Optional; may not be set
 
void solve_core (const DiracOperator::TensorOperator *const h, const ExternalField::CorePolarisation *const dV=nullptr)
 Prepares.
 
double SR (const DiracSpinor &w, const DiracSpinor &v, double omega=0.0) const
 Reduced matrix element of structure radiation <w||h_sr||v>
 
double norm (const DiracSpinor &w, const DiracSpinor &v, const DiracOperator::TensorOperator *const h, const ExternalField::CorePolarisation *const dV=nullptr) const
 Returns Normalisation of states, reduced ME: <w||h||v>_norm.
 
double f_norm (const DiracSpinor &v) const
 Normalisation factor; defined: <w||h||v>_norm = <w||h||v>(f_v + f_w)
 
double srn (const DiracSpinor &w, const DiracSpinor &v, const DiracOperator::TensorOperator *const h, const ExternalField::CorePolarisation *const dV=nullptr, double omega=0.0) const
 Returns sum of SR+Norm diagrams, reduced ME: <w||T+B+C+N||v>.
 
double f_root_scr (int k) const
 Effective screening factor for Coulomb lines.
 
double eta_hp (int k) const
 Effective hole-particle factor for polarisation loops.
 
double BO (const DiracSpinor &w, const DiracSpinor &v, double fw=1.0, double fv=1.0) const
 Returns Brueckner orbital contribution to the, reduced ME: <w||h||v>_norm. Returns a pair: {N, N+dV}: second includes RPA (if dV given).
 
double Sigma_vw (const DiracSpinor &v, const DiracSpinor &w) const
 Calculates <v|Sigma|w>
 
Coulomb::meTable< double > srn_table (const DiracOperator::TensorOperator *const h, const std::vector< DiracSpinor > &as, const std::vector< DiracSpinor > &tbs={}, double omega=0.0, const ExternalField::CorePolarisation *const dV=nullptr) const
 constructs an me table of {srn, srn+dv} for each pair or {a,b}
 

Detailed Description

Calculates Structure Radiation + Normalisation of states, using diagram method.

Two main functions: reducedME(), norm(), which retrun the reduced matrix elements for structure radiation and normalisation, respectively.

Note
For Structure Radiation, must call StructureRad::solve_core() first.

Structure radiation is sum of srTB()+srC(); norm() gives normalisation of states.

Typically, one should use splines for the 'legs' (outer states) of diagrams. However, code is written such that {w,v} (the valence states) always appear as the first state in the Q integrals; thus those states are always directly integrated (other states may use the existing y^k integrals, which were calculated using the spline states) * unless using QkTable (see below).

For using spline states as legs: This means you must typically ensure basis is large enough to make relevant valence states "physical"

The user should check if the zeroth order <w|t|v> matches closely between valence/spline states. If not, basis/cavity is too small and SR+N probably meaningless

Option to use QkTable to calculate SR+N. Otherwise, calculates Coulomb integrals on-the-fly. If QkTable is used, leads to ~10x speed-up, but uses large amount of memory. Also, using QkTable means spline states are used for "legs" of diagrams.

Norm() works differently; It directly taken in the operator to calculate norm. This is because norm depends only on Coulomb operators . In some sense, would make sense to keep norm in a seperate class. However, they are typically calculated together, and use the same Coulomb integrals.

Formulas are presented in (for example): W. R. Johnson, Z. W. Liu, and J. Sapirstein, At. Data Nucl. Data Tables 64, 279 (1996).

Specific form of formulas used here are presented in: Phys. Rev. A 107, 052812 (2023)

Constructor & Destructor Documentation

◆ StructureRad()

MBPT::StructureRad::StructureRad ( const std::vector< DiracSpinor > &  basis,
double  en_core,
std::pair< int, int >  nminmax = {0, 999},
const std::string &  Qk_fname = "",
int  k_cut = 99,
const std::vector< double > &  fk = {},
const std::vector< double > &  etak = {},
bool  verbose = true 
)

Construct a Structeure Radiation (MBPT) object.

en_core defines the core boundary: states with e < en_core are treated as core states, while states with e > en_core are treated as excited states. Typically en_core = max(e_core) - min(e_valence) = wf.FermiLevel().

nminmax is the pair {nmin, nmax}. Only core states with n >= nmin are used, and only excited states with n <= nmax are included in the summations.

Qk_fname is the filename for the QkTable. If provided, the QkTable will be read from / written to this file and then used to calculate SR. This leads to ~10 speedup in the calculation at the cost of significantly higher memory usage.

fk and etak are effective screening factors for screening and hole-particle. These should only be used as a test.

Member Function Documentation

◆ core()

const std::vector< DiracSpinor > & MBPT::StructureRad::core ( ) const
inline

const reference to employed subset of core orbitals

◆ excited()

const std::vector< DiracSpinor > & MBPT::StructureRad::excited ( ) const
inline

const reference to employed subset of excited orbitals

◆ basis()

const std::vector< DiracSpinor > & MBPT::StructureRad::basis ( ) const
inline

const reference to employed subset of core+excited orbitals

◆ me_Table()

const Coulomb::meTable< double > & MBPT::StructureRad::me_Table ( ) const
inline

const reference to underlying matrix element table. May be empty

◆ Yk()

const Coulomb::YkTable & MBPT::StructureRad::Yk ( ) const
inline

const reference to Yk table. NOTE: may not be initialised!

◆ Qk()

const std::optional< Coulomb::QkTable > & MBPT::StructureRad::Qk ( ) const
inline

const reference to underlying Qk table. Optional; may not be set

◆ solve_core()

void MBPT::StructureRad::solve_core ( const DiracOperator::TensorOperator *const  h,
const ExternalField::CorePolarisation *const  dV = nullptr 
)

Prepares.

  • Pre-computes the full set of <i||T||j> matrix elements
  • Does for all core-core, core-excited, excited-excited orbitals
  • Optionally includes core polarisation; dV may be null
  • h must not be null
  • For frequency-dependent operators, this assumes operator has already been updated
  • Assumes Core Polarisation has already been solves
Note
This must be called before structure radiation can be calculated

◆ SR()

double MBPT::StructureRad::SR ( const DiracSpinor w,
const DiracSpinor v,
double  omega = 0.0 
) const
inline

Reduced matrix element of structure radiation <w||h_sr||v>

◆ norm()

double MBPT::StructureRad::norm ( const DiracSpinor w,
const DiracSpinor v,
const DiracOperator::TensorOperator *const  h,
const ExternalField::CorePolarisation *const  dV = nullptr 
) const

Returns Normalisation of states, reduced ME: <w||h||v>_norm.

◆ f_norm()

double MBPT::StructureRad::f_norm ( const DiracSpinor v) const
inline

Normalisation factor; defined: <w||h||v>_norm = <w||h||v>(f_v + f_w)

◆ srn()

double MBPT::StructureRad::srn ( const DiracSpinor w,
const DiracSpinor v,
const DiracOperator::TensorOperator *const  h,
const ExternalField::CorePolarisation *const  dV = nullptr,
double  omega = 0.0 
) const
inline

Returns sum of SR+Norm diagrams, reduced ME: <w||T+B+C+N||v>.

Note
Must call solve_core() first! h and dV used for norm() only

◆ f_root_scr()

double MBPT::StructureRad::f_root_scr ( int  k) const
inline

Effective screening factor for Coulomb lines.

◆ eta_hp()

double MBPT::StructureRad::eta_hp ( int  k) const
inline

Effective hole-particle factor for polarisation loops.

◆ BO()

double MBPT::StructureRad::BO ( const DiracSpinor w,
const DiracSpinor v,
double  fw = 1.0,
double  fv = 1.0 
) const

Returns Brueckner orbital contribution to the, reduced ME: <w||h||v>_norm. Returns a pair: {N, N+dV}: second includes RPA (if dV given).

from 10.1006/adnd.1996.0024

◆ Sigma_vw()

double MBPT::StructureRad::Sigma_vw ( const DiracSpinor v,
const DiracSpinor w 
) const

Calculates <v|Sigma|w>

◆ srn_table()

Coulomb::meTable< double > MBPT::StructureRad::srn_table ( const DiracOperator::TensorOperator *const  h,
const std::vector< DiracSpinor > &  as,
const std::vector< DiracSpinor > &  tbs = {},
double  omega = 0.0,
const ExternalField::CorePolarisation *const  dV = nullptr 
) const

constructs an me table of {srn, srn+dv} for each pair or {a,b}


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