ampsci
c++ program for high-precision atomic structure calculations of single-valence systems
Loading...
Searching...
No Matches
CoulombIntegrals.hpp
1#pragma once
2#include "Angular/include.hpp"
3#include "Wavefunction/DiracSpinor.hpp"
4#include <optional>
5#include <vector>
6
8namespace Coulomb {
9
12std::vector<double> yk_ab(const int k, const DiracSpinor &Fa,
13 const DiracSpinor &Fb, const std::size_t maxi = 0);
14
16void yk_ab(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
17 std::vector<double> &ykab, const std::size_t maxi = 0);
18
20void bk_ab(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
21 std::vector<double> &b0, std::vector<double> &binf,
22 const std::size_t maxi = 0);
23
25void gk_ab(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
26 std::vector<double> &g0, std::vector<double> &ginf,
27 const std::size_t maxi = 0);
28
29//==============================================================================
30
32double Rk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
33 const DiracSpinor &Fc, const DiracSpinor &Fd);
34
36double Rk_abcd(const DiracSpinor &Fa, const DiracSpinor &Fc,
37 const std::vector<double> &ykbd);
38
40DiracSpinor Rkv_bcd(const int k, const int kappa_v, const DiracSpinor &Fb,
41 const DiracSpinor &Fc, const DiracSpinor &Fd);
42
44DiracSpinor Rkv_bcd(const int kappa_v, const DiracSpinor &Fc,
45 const std::vector<double> &ykbd);
46
48void Rkv_bcd(DiracSpinor *const Rkv, const DiracSpinor &Fc,
49 const std::vector<double> &ykbd);
50
51//==============================================================================
52
55double Qk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
56 const DiracSpinor &Fc, const DiracSpinor &Fd);
57
60DiracSpinor Qkv_bcd(const int k, int kappa_v, const DiracSpinor &Fb,
61 const DiracSpinor &Fc, const DiracSpinor &Fd);
62
63//==============================================================================
65double g_abcd(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c,
66 const DiracSpinor &d, int tma, int tmb, int tmc, int tmd);
67
68//==============================================================================
70bool Qk_abcd_SR(int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
71 const DiracSpinor &Fc, const DiracSpinor &Fd);
73bool Qk_abcd_SR(int k, int ka, int kb, int kc, int kd);
74
76bool Pk_abcd_SR(int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
77 const DiracSpinor &Fc, const DiracSpinor &Fd);
78
80bool Pk_abcd_SR(int k, int ka, int kb, int kc, int kd);
81
82//==============================================================================
83
85double Pk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
86 const DiracSpinor &Fc, const DiracSpinor &Fd);
87
89DiracSpinor Pkv_bcd(const int k, int kappa_v, const DiracSpinor &Fb,
90 const DiracSpinor &Fc, const DiracSpinor &Fd);
91
92//==============================================================================
93
95
100double Wk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb,
101 const DiracSpinor &Fc, const DiracSpinor &Fd);
102
103DiracSpinor Wkv_bcd(const int k, int kappa_v, const DiracSpinor &Fb,
104 const DiracSpinor &Fc, const DiracSpinor &Fd);
105
106//==============================================================================
107
110std::pair<int, int> k_minmax_Ck(const DiracSpinor &a, const DiracSpinor &b);
113std::pair<int, int> k_minmax_Ck(int kappa_a, int kappa_b);
114
117std::pair<int, int> k_minmax_tj(int tja, int tjb);
118
122std::pair<int, int> k_minmax_Q(const DiracSpinor &a, const DiracSpinor &b,
123 const DiracSpinor &c, const DiracSpinor &d);
124
128std::pair<int, int> k_minmax_Q(int kappa_a, int kappa_b, int kappa_c,
129 int kappa_d);
130
134std::pair<int, int> k_minmax_P(const DiracSpinor &a, const DiracSpinor &b,
135 const DiracSpinor &c, const DiracSpinor &d);
136
141std::pair<int, int> k_minmax_W(const DiracSpinor &a, const DiracSpinor &b,
142 const DiracSpinor &c, const DiracSpinor &d);
143
144//==============================================================================
145
146template <class A>
147static int twojk(const A &a) {
148 if constexpr (std::is_same_v<A, DiracSpinor>) {
149 return a.twoj();
150 } else {
151 static_assert(std::is_same_v<A, int>);
152 return 2 * a;
153 }
154}
155
156template <class A>
157static std::optional<int> twojknull(const A &a) {
158 if constexpr (std::is_same_v<A, DiracSpinor>) {
159 return a.twoj();
160 } else if constexpr (std::is_same_v<A, int>) {
161 static_assert(std::is_same_v<A, int>);
162 return 2 * a;
163 } else {
164 return std::nullopt;
165 }
166}
167
168template <class A, class B, class C, class D, class E, class F>
169static double sixj(const A &a, const B &b, const C &c, const D &d, const E &e,
170 const F &f) {
171 return Angular::sixj_2(twojk(a), twojk(b), twojk(c), twojk(d), twojk(e),
172 twojk(f));
173}
174
175template <class A = std::optional<int>, class B = std::optional<int>,
176 class C = std::optional<int>, class D = std::optional<int>,
177 class E = std::optional<int>, class F = std::optional<int>>
178static bool sixjTriads(const A &a, const B &b, const C &c, const D &d,
179 const E &e, const F &f) {
180 return Angular::sixjTriads(twojknull(a), twojknull(b), twojknull(c),
181 twojknull(d), twojknull(e), twojknull(f));
182}
183
184template <class A, class B, class C>
185static bool triangle(const A &a, const B &b, const C &c) {
186 return Angular::triangle(twojk(a), twojk(b), twojk(c));
187}
188
189} // namespace Coulomb
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
double sixj_2(int two_j1, int two_j2, int two_j3, int two_j4, int two_j5, int two_j6)
6j symbol {j1 j2 j3 \ j4 j5 j6} - [takes 2*j as int]
Definition Wigner369j.hpp:267
constexpr int triangle(int j1, int j2, int J)
Returns 1 if triangle rule is satisfied. nb: works with j OR twoj!
Definition Wigner369j.hpp:162
bool sixjTriads(std::optional< int > a, std::optional< int > b, std::optional< int > c, std::optional< int > d, std::optional< int > e, std::optional< int > f)
Checks if a 6j symbol is valid - each input is optional.
Definition Wigner369j.hpp:248
Functions (+classes) for computing Coulomb integrals.
Definition CoulombIntegrals.cpp:13
std::pair< int, int > k_minmax_tj(int tja, int tjb)
Returns min and max k (multipolarity) allowed for Triangle(k,a,b), NOT accounting for parity (2j only...
Definition CoulombIntegrals.cpp:551
DiracSpinor Qkv_bcd(const int k, const int kappa_a, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd)
Calculates Q^k(v)_bcd for given k,kappa_v. From scratch (calculates y) [see YkTable version if alread...
Definition CoulombIntegrals.cpp:398
bool Pk_abcd_SR(int k, int ka, int kb, int kc, int kd)
Just selection rule for Pk_abcd.
Definition CoulombIntegrals.cpp:388
std::pair< int, int > k_minmax_Ck(const DiracSpinor &a, const DiracSpinor &b)
Returns min and max k (multipolarity) allowed for C^k_ab, accounting for parity (used by k_minmax_Q)
Definition CoulombIntegrals.cpp:519
double g_abcd(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d, int tma, int tmb, int tmc, int tmd)
Calculates g from scratch - not used often.
Definition CoulombIntegrals.cpp:491
double Rk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd)
Calculates R^k_abcd for given k. From scratch (calculates y)
Definition CoulombIntegrals.cpp:300
double Qk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd)
Calculates Q^k_abcd for given k. From scratch (calculates y) [see YkTable version if already have YkT...
Definition CoulombIntegrals.cpp:357
DiracSpinor Rkv_bcd(const int k, const int kappa_a, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd)
"Right-hand-side" R^k{v}_bcd [i.e., without Fv integral]
Definition CoulombIntegrals.cpp:320
bool Qk_abcd_SR(int k, int ka, int kb, int kc, int kd)
Just selection rule for Qk_abcd.
Definition CoulombIntegrals.cpp:379
double Pk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd)
Exchange only version of W (W-Q): W = Q + P [see Qk above].
Definition CoulombIntegrals.cpp:428
std::pair< int, int > k_minmax_P(const DiracSpinor &a, const DiracSpinor &b, const DiracSpinor &c, const DiracSpinor &d)
Returns min and max k (multipolarity) allowed for P^k_abcd. DOES NOT contain parity rules (6j only) -...
Definition CoulombIntegrals.cpp:591
DiracSpinor Pkv_bcd(const int k, int kappa_a, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd)
Exchange only version of W (W-Q): W = Q + P [see Qk above].
Definition CoulombIntegrals.cpp:449
double Wk_abcd(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const DiracSpinor &Fc, const DiracSpinor &Fd)
Calculates W^k_abcd for given k. From scratch (calculates y)
Definition CoulombIntegrals.cpp:484
void bk_ab(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, std::vector< double > &b0, std::vector< double > &binf, std::size_t maxi)
Breit b^k function: (0,r) and (r,inf) part stored sepperately (in/out)
Definition CoulombIntegrals.cpp:236
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:611
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
void gk_ab(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, std::vector< double > &g0, std::vector< double > &ginf, const std::size_t maxi)
Breit g^k function: (0,r) + (r,inf) part stored together (in/out)
Definition CoulombIntegrals.cpp:266
std::vector< double > yk_ab(const int k, const DiracSpinor &Fa, const DiracSpinor &Fb, const std::size_t maxi)
Calculates Hartree Screening functions .
Definition CoulombIntegrals.cpp:179