2#include "Angular/include.hpp"
3#include "Coulomb/include.hpp"
4#include "Wavefunction/DiracSpinor.hpp"
11template <
typename Q
integrals,
typename QorL
integrals>
13 const QorLintegrals &lk,
const std::vector<DiracSpinor> &core,
14 const std::vector<DiracSpinor> &excited) {
26 const bool LisQ = [&]() {
27 if constexpr (std::is_same_v<Qintegrals, QorLintegrals>)
40#pragma omp parallel for reduction(+ : de_v)
41 for (
auto in = 0ul; in < excited.size(); ++in) {
42 const auto &n = excited[in];
43 for (
const auto &a : core) {
46 for (
const auto &m : excited) {
47 const auto inv_de = 1.0 / (v.
en() + a.en() - m.en() - n.en());
49 for (
int k = k0; k <= kI; k += 2) {
51 const auto Q_kvamn = qk.Q(k, v, a, m, n);
52 const auto L_kvamn = LisQ ? Q_kvamn : lk.Q(k, m, n, v, a);
53 const auto P_kvamn = lk.P(k, n, m, a, v);
56 de_v += Q_kvamn * L_kvamn * inv_de / (2 * k + 1);
58 de_v += Q_kvamn * P_kvamn * inv_de / (2 * k + 1);
63 for (
const auto &b : core) {
64 const auto inv_de = 1.0 / (v.
en() + n.en() - a.en() - b.en());
66 for (
int k = k0; k <= kI; k += 2) {
68 const auto Q_kvnab = qk.Q(k, v, n, a, b);
69 const auto L_kvnab = LisQ ? Q_kvnab : lk.Q(k, v, n, a, b);
70 const auto P_kvnab = lk.P(k, v, n, a, b);
73 de_v += Q_kvnab * L_kvnab * inv_de / (2 * k + 1);
75 de_v += Q_kvnab * P_kvnab * inv_de / (2 * k + 1);
97template <
typename Q
integrals,
typename L
integrals>
99 const Lintegrals &lk,
const std::vector<DiracSpinor> &core,
100 const std::vector<DiracSpinor> &excited,
104#pragma omp parallel for reduction(+ : de_v)
105 for (
auto in = 0ul; in < excited.size(); ++in) {
106 const auto &n = excited[in];
107 for (
const auto &a : core) {
110 for (
const auto &m : excited) {
111 const auto inv_de = 1.0 / (v.
en() + a.en() - m.en() - n.en());
113 for (
int k = k0; k <= kI; ++k) {
114 const auto W_kvamn = qk.W(k, v, a, m, n, sj);
117 const auto L_kmnva = lk.Q(k, m, n, v, a);
118 de_v += W_kvamn * L_kmnva * inv_de / (2 * k + 1);
123 for (
const auto &b : core) {
124 const auto inv_de = 1.0 / (v.
en() + n.en() - a.en() - b.en());
126 for (
int k = k0; k <= kI; ++k) {
127 const auto W_kvnab = qk.W(k, v, n, a, b, sj);
130 const auto L_kvnab = lk.Q(k, v, n, a, b);
131 de_v += W_kvnab * L_kvnab * inv_de / (2 * k + 1);
145template <
typename Q
integrals,
typename QorL
integrals>
146double de_core(
const Qintegrals &qk,
const QorLintegrals &lk,
147 const std::vector<DiracSpinor> &core,
148 const std::vector<DiracSpinor> &excited) {
156 const bool LisQ = [&]() {
157 if constexpr (std::is_same_v<Qintegrals, QorLintegrals>)
164#pragma omp parallel for reduction(+ : de_c)
165 for (
auto in = 0ul; in < excited.size(); ++in) {
166 const auto &n = excited[in];
167 for (
const auto &m : excited) {
168 for (
const auto &a : core) {
169 for (
const auto &b : core) {
170 const auto inv_de = 1.0 / (a.en() + b.en() - m.en() - n.en());
172 for (
int k = k0; k <= kI; k += 2) {
173 const auto Q_kabmn = qk.Q(k, a, b, m, n);
174 const auto L_kmnab = LisQ ? Q_kabmn : lk.Q(k, m, n, a, b);
175 const auto P_kmnab = lk.P(k, m, n, a, b);
176 de_c += 0.5 * Q_kabmn * (L_kmnab + P_kmnab) * inv_de / (2 * k + 1);
Lookup table for Wigner 6j symbols.
Definition SixJTable.hpp:82
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:44
int twojp1() const
2j+1
Definition DiracSpinor.hpp:99
double en() const
Single-particle energy, not including rest energy.
Definition DiracSpinor.hpp:132
std::pair< int, int > k_minmax_W(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)
Returns min and max k (multipolarity) allowed for W^k_abcd. DOES NOT contain parity rules (6j only) -...
Definition CoulombIntegrals.cpp:492
std::pair< int, int > k_minmax_Q(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)
Returns min and max k (multipolarity) allowed for Q^k_abcd. Parity rule is included,...
Definition CoulombIntegrals.hpp:146
double de_valence_w(const DiracSpinor &v, const Qintegrals &qk, const Lintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited, const Angular::SixJTable *sj=nullptr)
Ladder (or MBPT2) valence energy, antisymmetrising the FIRST integral.
double de_core(const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited)
Second-order (or ladder) correction to the core energy.
double de_valence(const DiracSpinor &v, const Qintegrals &qk, const QorLintegrals &lk, const std::vector< DiracSpinor > &core, const std::vector< DiracSpinor > &excited)
Second-order (or ladder) correction to the valence energy.