2#include "Angular/Angular.hpp"
3#include "Coulomb/Coulomb.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,
15 const std::vector<double> &v_fk,
16 const std::vector<double> &v_eta) {
28 const bool LisQ = [&]() {
29 if constexpr (std::is_same_v<Qintegrals, QorLintegrals>)
36 auto Fk = [&v_fk](
int k) {
37 return k < (int)v_fk.size() ? v_fk[std::size_t(k)] : 1.0;
40 auto Eta = [&v_eta](
int k) {
41 return k < (int)v_eta.size() ? v_eta[std::size_t(k)] : 1.0;
51#pragma omp parallel for reduction(+ : de_v)
52 for (
auto in = 0ul; in < excited.size(); ++in) {
53 const auto &n = excited[in];
54 for (
const auto &a : core) {
57 for (
const auto &m : excited) {
58 const auto inv_de = 1.0 / (v.
en() + a.en() - m.en() - n.en());
60 for (
int k = k0; k <= kI; k += 2) {
62 const auto fk = Fk(k);
63 const auto etak = Eta(k);
65 const auto Q_kvamn = qk.Q(k, v, a, m, n);
66 const auto L_kvamn = LisQ ? fk * Q_kvamn : lk.Q(k, m, n, v, a);
67 const auto P_kvamn = lk.P(k, n, m, a, v);
70 de_v += etak * Q_kvamn * L_kvamn * inv_de / (2 * k + 1);
72 de_v += fk * Q_kvamn * P_kvamn * inv_de / (2 * k + 1);
77 for (
const auto &b : core) {
78 const auto inv_de = 1.0 / (v.
en() + n.en() - a.en() - b.en());
80 for (
int k = k0; k <= kI; k += 2) {
82 const auto fk = Fk(k);
83 const auto etak = Eta(k);
85 const auto Q_kvnab = qk.Q(k, v, n, a, b);
86 const auto L_kvnab = LisQ ? fk * Q_kvnab : lk.Q(k, v, n, a, b);
87 const auto P_kvnab = lk.P(k, v, n, a, b);
90 de_v += etak * Q_kvnab * L_kvnab * inv_de / (2 * k + 1);
92 de_v += fk * Q_kvnab * P_kvnab * inv_de / (2 * k + 1);
108template <
typename Q
integrals,
typename QorL
integrals>
109double de_core(
const Qintegrals &qk,
const QorLintegrals &lk,
110 const std::vector<DiracSpinor> &core,
111 const std::vector<DiracSpinor> &excited) {
119 const bool LisQ = [&]() {
120 if constexpr (std::is_same_v<Qintegrals, QorLintegrals>)
127#pragma omp parallel for reduction(+ : de_c)
128 for (
auto in = 0ul; in < excited.size(); ++in) {
129 const auto &n = excited[in];
130 for (
const auto &m : excited) {
131 for (
const auto &a : core) {
132 for (
const auto &b : core) {
133 const auto inv_de = 1.0 / (a.en() + b.en() - m.en() - n.en());
135 for (
int k = k0; k <= kI; k += 2) {
136 const auto Q_kabmn = qk.Q(k, a, b, m, n);
137 const auto L_kmnab = LisQ ? Q_kabmn : lk.Q(k, m, n, a, b);
138 const auto P_kmnab = lk.P(k, m, n, a, b);
139 de_c += 0.5 * Q_kabmn * (L_kmnab + P_kmnab) * inv_de / (2 * k + 1);
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
int twojp1() const
2j+1
Definition DiracSpinor.hpp:91
double en() const
Single-particle energy, not including rest energy.
Definition DiracSpinor.hpp:113
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.cpp:556
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 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.