2#include "DiracOperator/TensorOperator.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5#include "qip/Maths.hpp"
14 Realness::imaginary,
false),
17 std::string
name() const override final {
18 return std::string(
"V_lowq^E_") + std::to_string(m_rank);
21 double angularF(
const int ka,
const int kb)
const override final {
25 double angularCff(
int,
int)
const override final {
return 0; }
26 double angularCgg(
int,
int)
const override final {
return 0; }
27 double angularCfg(
int ka,
int kb)
const override final {
28 return m_K == 1 ? ka - kb - 1 : 0.0;
30 double angularCgf(
int ka,
int kb)
const override final {
31 return m_K == 1 ? ka - kb + 1 : 0.0;
42 :
TensorOperator(1, Parity::even, 0, gr.
r(), 0, Realness::imaginary,
true),
47 std::string
name() const override final {
48 return std::string(
"V_lowq^E_") + std::to_string(m_rank);
51 double angularF(
const int ka,
const int kb)
const override final {
55 double angularCff(
int,
int)
const override final {
return 0; }
56 double angularCgg(
int,
int)
const override final {
return 0; }
57 double angularCfg(
int,
int)
const override final {
58 return m_K == 1 ? 1.0 : 0.0;
60 double angularCgf(
int,
int)
const override final {
61 return m_K == 1 ? 1.0 : 0.0;
67 m_constant = -m_q / (3.0 * std::sqrt(2.0));
79 :
TensorOperator(1, Parity::odd, 1.0 / 3.0, {}, 0, Realness::imaginary,
83 std::string
name() const override final {
84 return std::string(
"V_lowq^E_") + std::to_string(m_rank);
87 double angularF(
const int ka,
const int kb)
const override final {
91 double angularCff(
int,
int)
const override final {
return 0; }
92 double angularCgg(
int,
int)
const override final {
return 0; }
93 double angularCfg(
int ka,
int kb)
const override final {
94 return m_K == 1 ? ka - kb - 1 : 0.0;
96 double angularCgf(
int ka,
int kb)
const override final {
97 return m_K == 1 ? ka - kb + 1 : 0.0;
111 gr.
r(), 0, Realness::real,
true),
117 std::string
name() const override final {
118 return std::string(
"Phi_lowq_") + std::to_string(m_K);
121 double angularF(
const int ka,
const int kb)
const override final {
128 dF.
min_pt() = Fb.min_pt();
129 dF.
max_pt() = Fb.max_pt();
131 if (
isZero(kappa_a, Fb.kappa())) {
138 Rab_rhs(+1, m_r2, &dF, Fb, -(m_q * m_q / 6.0));
139 }
else if (m_K == 1) {
140 Rab_rhs(+1, m_vec, &dF, Fb, (m_q / 3.0));
149 if (
isZero(Fa.kappa(), Fb.kappa())) {
154 return -(m_q * m_q / 6.0) *
Rab(+1, m_r2, Fa, Fb);
157 return (m_q / 3.0) *
Rab(+1, m_vec, Fa, Fb);
171 std::vector<double> m_r2;
180 gr.
r(), 0, Realness::real,
true),
185 std::string
name() const override final {
186 return std::string(
"t^S_k_lowq") + std::to_string(m_K);
189 double angularF(
const int ka,
const int kb)
const override final {
196 dF.
min_pt() = Fb.min_pt();
197 dF.
max_pt() = Fb.max_pt();
199 if (
isZero(kappa_a, Fb.kappa())) {
206 Gab_rhs(&dF, Fb, -2.0);
207 }
else if (m_K == 1) {
208 Rab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
217 if (
isZero(Fa.kappa(), Fb.kappa())) {
222 return -2.0 *
Gab(Fa, Fb);
226 return (m_q / 3.0) *
Rab(-1, m_vec, Fa, Fb);
252 gr.
r(), 0, Realness::real),
257 std::string
name() const override final {
258 return std::string(
"T^E5_lowq_") + std::to_string(m_K);
261 double angularF(
const int ka,
const int kb)
const override final {
268 dF.
min_pt() = Fb.min_pt();
269 dF.
max_pt() = Fb.max_pt();
271 if (
isZero(kappa_a, Fb.kappa()) || kappa_a == -Fb.kappa()) {
277 const auto dk = double(kappa_a + Fb.kappa());
278 const auto dk_int = kappa_a + Fb.kappa();
279 const auto same_kap = kappa_a == Fb.kappa();
282 const double cx = std::sqrt(2.0) / 3.0;
284 if (same_kap || dk_int == 1) {
285 Gab_rhs(&dF, Fb, -2.0 * cx * dk);
293 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
297 Gab_rhs(&dF, Fb, -4.0 * cx2 * m_q);
300 Rab_rhs(-1, m_vec, &dF, Fb, cx2 * dk * m_q);
301 Rab_rhs(+1, m_vec, &dF, Fb, -2.0 * cx2 * m_q);
311 if (
isZero(Fa.kappa(), Fb.kappa()) || Fa.kappa() == -Fb.kappa()) {
315 const auto dk = double(Fa.kappa() + Fb.kappa());
316 const auto dk_int = Fa.kappa() + Fb.kappa();
318 const auto same_kap = Fa.kappa() == Fb.kappa();
321 const auto cx = std::sqrt(2.0);
323 if (same_kap || dk_int == 1) {
324 return (-2.0 / 3.0) * cx * dk *
Gab(Fa, Fb);
326 const auto Rm1 =
Rab(-1, Fa, Fb);
327 const auto Rp1 =
Rab(+1, Fa, Fb);
328 return cx * (dk * Rm1 - Rp1) / 3.0;
332 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
336 return cx2 * m_q * (-4.0 *
Gab(m_vec, Fa, Fb));
340 (dk *
Rab(-1, m_vec, Fa, Fb) - 2.0 *
Rab(+1, m_vec, Fa, Fb));
362 gr.
r(), 0, Realness::real,
true),
367 std::string
name() const override final {
368 return std::string(
"T^L5_k_lowq") + std::to_string(m_K);
371 double angularF(
const int ka,
const int kb)
const override final {
378 dF.
min_pt() = Fb.min_pt();
379 dF.
max_pt() = Fb.max_pt();
381 if (
isZero(kappa_a, Fb.kappa())) {
388 Rab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
389 }
else if (m_K == 1) {
390 const auto dk_int = kappa_a + Fb.kappa();
391 const auto dk = double(dk_int);
392 const auto same_kap = kappa_a == Fb.kappa();
395 if (same_kap || dk_int == 1) {
396 Gab_rhs(&dF, Fb, (2.0 / 3.0) * dk);
398 const auto c = -(1.0 / 3.0);
411 if (
isZero(Fa.kappa(), Fb.kappa())) {
416 return -(m_q / 3.0) *
Rab(+1, m_vec, Fa, Fb);
420 const auto dk_int = Fa.kappa() + Fb.kappa();
421 const auto dk = double(dk_int);
422 const auto same_kap = Fa.kappa() == Fb.kappa();
424 if (same_kap || dk_int == 1)
425 return (2.0 / 3.0) * dk *
Gab(Fa, Fb);
427 return -(1.0 / 3.0) * (dk *
Rab(-1, Fa, Fb) -
Rab(+1, Fa, Fb));
448 gr.
r(), 0, Realness::real,
true),
454 std::string
name() const override final {
455 return std::string(
"T^M5_k_lowq_1") + std::to_string(m_K);
458 double angularF(
const int ka,
const int kb)
const override final {
465 dF.
min_pt() = Fb.min_pt();
466 dF.
max_pt() = Fb.max_pt();
468 if (
isZero(kappa_a, Fb.kappa()) || (kappa_a == Fb.kappa())) {
474 const auto sk = double(kappa_a - Fb.kappa());
476 Rab_rhs(-1, m_vec, &dF, Fb, -(m_q / (std::sqrt(2.0) * 3.0)) * sk);
481 const auto c = -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk;
482 Rab_rhs(-1, m_vec * m_vec, &dF, Fb, c);
491 if (
isZero(Fa.kappa(), Fb.kappa())) {
495 const auto sk = double(Fa.kappa() - Fb.kappa());
498 const auto ck = sk / std::sqrt(2.0);
499 return -ck * m_q *
Rab(-1, m_vec, Fa, Fb) / 3.0;
503 return -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk *
504 Rab(-1, m_vec * m_vec, Fa, Fb);
527 gr.
r(), 0, Realness::real,
true),
533 std::string
name() const override final {
534 return std::string(
"Phi5_lowq_") + std::to_string(m_K);
537 double angularF(
const int ka,
const int kb)
const override final {
544 dF.
min_pt() = Fb.min_pt();
545 dF.
max_pt() = Fb.max_pt();
547 if (
isZero(kappa_a, Fb.kappa())) {
553 const auto w_ab = m_q / m_alpha;
554 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
555 const auto c = -m_alpha * w_ab * f_rel;
556 Rab_rhs(+1, m_vec, &dF, Fb, c);
557 }
else if (m_K == 1) {
559 Pab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
568 if (
isZero(Fa.kappa(), Fb.kappa())) {
574 const auto w_ab = Fa.en() - Fb.en();
575 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
576 return -m_alpha * w_ab *
Rab(+1, m_vec, Fa, Fb) * f_rel;
582 return (m_q / 3.0) *
Pab(-1, m_vec, Fa, Fb);
607 gr.
r(), 0, Realness::real,
true),
613 std::string
name() const override final {
614 return std::string(
"S5_k_lowq") + std::to_string(m_K);
617 double angularF(
const int ka,
const int kb)
const override final {
624 dF.
min_pt() = Fb.min_pt();
625 dF.
max_pt() = Fb.max_pt();
627 if (
isZero(kappa_a, Fb.kappa())) {
636 const auto w_ab = m_q / m_alpha;
637 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
638 const auto wab2 = std::pow(w_ab, 2);
639 const auto c = 0.5 * m_alpha * m_alpha * m_alpha * wab2 * f_rel;
641 Rab_rhs(+1, m_vec, &dF, Fb, c);
642 }
else if (m_K == 1) {
643 Pab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
652 if (
isZero(Fa.kappa(), Fb.kappa())) {
659 const auto w_ab = Fa.en() - Fb.en();
660 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
662 const auto wab2 = std::pow(w_ab, 2);
663 return 0.5 * m_alpha * m_alpha * m_alpha * wab2 *
Rab(+1, m_vec, Fa, Fb) *
668 return -(m_q / 3.0) *
Pab(+1, m_vec, Fa, Fb);
676 m_q = m_alpha * omega;
Low qr form of Axial electric multipole operator: .
Definition EM_multipole_lowqr.hpp:248
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:308
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:347
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:265
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:257
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:261
Low qr form of Axial longitudinal multipole operator: .
Definition EM_multipole_lowqr.hpp:358
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:367
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:371
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:408
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:433
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:375
Low qr form of Axial magnetic multipole operator: .
Definition EM_multipole_lowqr.hpp:444
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:458
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:488
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:510
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:462
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:454
Low qr form of Temporal component of the axial vector multipole operator: . NOTE: If K=0,...
Definition EM_multipole_lowqr.hpp:522
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:533
void updateFrequency(const double omega) override final
NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
Definition EM_multipole_lowqr.hpp:589
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:537
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:565
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:541
Low qr form of Temporal component of the vector multipole operator: .
Definition EM_multipole_lowqr.hpp:107
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:125
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:121
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:117
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:146
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:164
Low qr form of Pseudoscalar multipole operator: NOTE: If K=0, omega should be (ea-eb); for K=1 shoul...
Definition EM_multipole_lowqr.hpp:603
void updateFrequency(const double omega) override final
NOTE: If K=0, omega should be (ea-eb); for K=1 should be q = alpha*omega!
Definition EM_multipole_lowqr.hpp:675
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:617
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:621
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:649
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:613
Low qr form of Scalar multipole operator: .
Definition EM_multipole_lowqr.hpp:176
DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const override final
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition EM_multipole_lowqr.hpp:193
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Defined via <a||h||b> = angularF(a,b) * radialIntegral(a,b) (Note: if radial_rhs is overridden,...
Definition EM_multipole_lowqr.hpp:214
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:233
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:185
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:189
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:110
bool isZero(const int ka, int kb) const
If matrix element <a|h|b> is zero, returns true.
Definition TensorOperator.cpp:15
Low qr form of Vector electric. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:10
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:17
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:21
Low qr form of Vector longitudanal.
Definition EM_multipole_lowqr.hpp:76
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:83
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:87
Low qr form of Vector magnetic. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:39
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole_lowqr.hpp:47
double angularF(const int ka, const int kb) const override final
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition EM_multipole_lowqr.hpp:51
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:65
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
auto max_pt() const
Effective size(); index after last non-zero point (index for f[i])
Definition DiracSpinor.hpp:144
auto min_pt() const
First non-zero point (index for f[i])
Definition DiracSpinor.hpp:140
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31
const std::vector< double > & r() const
Grid points, r.
Definition Grid.hpp:75
std::vector< double > rpow(double k) const
Calculates+returns vector of 1/r.
Definition Grid.cpp:120
constexpr bool evenQ(int a)
Returns true if a is even - for integer values.
Definition Wigner369j.hpp:154
double Ck_kk(int k, int ka, int kb)
Reduced (relativistic) angular ME: <ka||C^k||kb> [takes k and kappa].
Definition Wigner369j.hpp:306
Dirac Operators: General + derived.
Definition GenerateOperator.cpp:3
void Pab_rhs(double pm, const std::vector< double > &t, DiracSpinor *dF, const DiracSpinor &Fb, double a)
Pab_rhs function: dF_ab += A * t(r) * (g, pm*f) , pm=+/-1 (usually). NOTE: uses +=,...
Definition TensorOperator.cpp:219
double Gab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Gab function: Int[ (ga*gb ) * t(r) , dr].
Definition TensorOperator.cpp:257
double Rab(double pm, const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Rab function: Int[ (fa*fb + pm*ga*gb) * t(r) , dr]. pm = +/-1 (usually)
Definition TensorOperator.cpp:207
void Rab_rhs(double pm, const std::vector< double > &t, DiracSpinor *dF, const DiracSpinor &Fb, double a)
Rab_rhs function: dF_ab += A * t(r) * (f, pm*g) , pm=+/-1 (usually). NOTE: uses +=,...
Definition TensorOperator.cpp:229
double Pab(double pm, const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Pab function: Int[ (fa*gb + pm*ga*fb) * t(r) , dr]. pm = +/-1 (usually)
Definition TensorOperator.cpp:193
constexpr double alpha
Fine-structure constant: alpha = 1/137.035 999 177(21) [CODATA 2022].
Definition PhysConst_constants.hpp:24
namespace qip::overloads provides operator overloads for std::vector
Definition Vector.hpp:451