ampsci
c++ program for high-precision atomic structure calculations of single-valence systems
Loading...
Searching...
No Matches
Ladder.hpp
1#pragma once
2#include "Angular/Angular.hpp"
3#include "Coulomb/Coulomb.hpp"
4#include "MBPT/RDMatrix.hpp"
5#include "Wavefunction/DiracSpinor.hpp"
6
7namespace MBPT {
8
9// // Weighted average:
10// fk = 0.714, 0.617, 0.832, 0.885, 0.941, 0.970, 0.987, 0.994
11// fk = 0.654, 0.514, 0.792, 0.857, 0.930, 0.967, 0.986, 0.994 // w/ hp
12// eta= 1.258, 1.511, 1.281, 1.175, 1.114, 1.073, 1.062, 1.066
13
15
18double Lkmnij(int k, const DiracSpinor &m, const DiracSpinor &n,
19 const DiracSpinor &i, const DiracSpinor &j,
20 const Coulomb::QkTable &qk, const std::vector<DiracSpinor> &core,
21 const std::vector<DiracSpinor> &excited, bool include_L4,
22 const Angular::SixJTable &SJ,
23 const Coulomb::LkTable *const Lk = nullptr,
24 const std::vector<double> &fk = {});
25
27
34double L1(int k, const DiracSpinor &m, const DiracSpinor &n,
35 const DiracSpinor &i, const DiracSpinor &j,
36 const Coulomb::QkTable &qk, const std::vector<DiracSpinor> &excited,
37 const Angular::SixJTable &SJ,
38 const Coulomb::LkTable *const Lk = nullptr,
39 const std::vector<double> &fk = {});
40
42
47double L2(int k, const DiracSpinor &m, const DiracSpinor &n,
48 const DiracSpinor &i, const DiracSpinor &j,
49 const Coulomb::QkTable &qk, const std::vector<DiracSpinor> &core,
50 const std::vector<DiracSpinor> &excited, const Angular::SixJTable &SJ,
51 const Coulomb::LkTable *const Lk = nullptr,
52 const std::vector<double> &fk = {});
53
54inline double L3(int k, const DiracSpinor &m, const DiracSpinor &n,
55 const DiracSpinor &i, const DiracSpinor &j,
56 const Coulomb::QkTable &qk,
57 const std::vector<DiracSpinor> &core,
58 const std::vector<DiracSpinor> &excited,
59 const Angular::SixJTable &SJ,
60 const Coulomb::LkTable *const Lk = nullptr,
61 const std::vector<double> &fk = {}) {
62 return L2(k, n, m, j, i, qk, core, excited, SJ, Lk, fk);
63}
64
65double L4(int k, const DiracSpinor &m, const DiracSpinor &n,
66 const DiracSpinor &i, const DiracSpinor &j,
67 const Coulomb::QkTable &qk, const std::vector<DiracSpinor> &core,
68 const Angular::SixJTable &SJ,
69 const Coulomb::LkTable *const Lk = nullptr,
70 const std::vector<double> &fk = {});
71
74 const std::vector<DiracSpinor> &excited,
75 const std::vector<DiracSpinor> &core,
76 const std::vector<DiracSpinor> &i_orbs, bool include_L4,
77 const Angular::SixJTable &sjt,
78 const Coulomb::LkTable *const lk_prev = nullptr,
79 bool print_progbar = true,
80 const std::vector<double> &fk = {});
81
83
88template <typename Qintegrals, typename QorLintegrals>
89double de_valence(const DiracSpinor &v, const Qintegrals &qk,
90 const QorLintegrals &lk, const std::vector<DiracSpinor> &core,
91 const std::vector<DiracSpinor> &excited,
92 const std::vector<double> &fk = {},
93 const std::vector<double> &etak = {});
94
96
101template <typename Qintegrals, typename QorLintegrals>
102double de_core(const Qintegrals &qk, const QorLintegrals &lk,
103 const std::vector<DiracSpinor> &core,
104 const std::vector<DiracSpinor> &excited);
105
106// template implementations:
107#include "Ladder.ipp"
108
109} // namespace MBPT
Lookup table for Wigner 6J symbols.
Definition SixJTable.hpp:24
Base (pure virtual) class to store Coulomb integrals, and similar. 3 derived classes,...
Definition QkTable.hpp:57
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
Many-body perturbation theory.
Definition CI_Integrals.hpp:9
double L2(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk, const std::vector< double > &fk)
Ladder integral, L^k_mnab := L1_mnij + L2_mnij + L3_nmji, L3_mnij = L2_nmji.
Definition Ladder.cpp:179
void fill_Lk_mnib(Coulomb::LkTable *lk, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &excited, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &i_orbs, bool include_L4, const Angular::SixJTable &sjt, const Coulomb::LkTable *const lk_prev, bool print_progbar, const std::vector< double > &fk)
Fills Lk matrix.
Definition Ladder.cpp:250
double de_core(const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited)
Calculate energy shift (either ladder, or sigma2) for CORE.
double Lkmnij(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, bool include_L4, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk, const std::vector< double > &fk)
Calculates ladder integral, L^k_mnab.
Definition Ladder.cpp:12
double de_valence(const DiracSpinor &v, const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const std::vector< double > &fk={}, const std::vector< double > &etak={})
Calculate energy shift (either ladder, or sigma2) for valence.
double L1(int k, const DiracSpinor &m, const DiracSpinor &n, const DiracSpinor &i, const DiracSpinor &j, const Coulomb::QkTable &qk, const std::vector< DiracSpinor > &excited, const Angular::SixJTable &SJ, const Coulomb::LkTable *const Lk, const std::vector< double > &fk)
Ladder integral, L^k_mnij := L1_mnij + L2_mnij + L2_nmji.
Definition Ladder.cpp:31