|
ampsci
High-precision calculations for one- and two-valence atomic systems
|
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::YkTable & | Yk () 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} | |
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.
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)
| 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.
|
inline |
const reference to employed subset of core orbitals
|
inline |
const reference to employed subset of excited orbitals
|
inline |
const reference to employed subset of core+excited orbitals
|
inline |
const reference to underlying matrix element table. May be empty
|
inline |
const reference to Yk table. NOTE: may not be initialised!
|
inline |
const reference to underlying Qk table. Optional; may not be set
| void MBPT::StructureRad::solve_core | ( | const DiracOperator::TensorOperator *const | h, |
| const ExternalField::CorePolarisation *const | dV = nullptr |
||
| ) |
Prepares.
|
inline |
Reduced matrix element of structure radiation <w||h_sr||v>
| 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.
|
inline |
Normalisation factor; defined: <w||h||v>_norm = <w||h||v>(f_v + f_w)
|
inline |
Returns sum of SR+Norm diagrams, reduced ME: <w||T+B+C+N||v>.
|
inline |
Effective screening factor for Coulomb lines.
|
inline |
Effective hole-particle factor for polarisation loops.
| 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
| double MBPT::StructureRad::Sigma_vw | ( | const DiracSpinor & | v, |
| const DiracSpinor & | w | ||
| ) | const |
Calculates <v|Sigma|w>
| 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}