2#include "DiracOperator/Operators/EM_multipole_base.hpp"
3#include "IO/InputBlock.hpp"
4#include "Wavefunction/Wavefunction.hpp"
5#include "qip/Maths.hpp"
13 :
EM_multipole(K, Parity::odd, -std::sqrt(2.0) / 3.0, {},
14 Realness::imaginary,
false, &gr,
'V',
'E',
true) {}
18 double angularCff(
int,
int)
const override final {
return 0; }
19 double angularCgg(
int,
int)
const override final {
return 0; }
21 return m_rank == 1 ? ka - kb - 1 : 0.0;
24 return m_rank == 1 ? ka - kb + 1 : 0.0;
32 :
EM_multipole(K, Parity::even, 0, gr.
r(), Realness::imaginary,
true, &gr,
38 double angularF(
const int ka,
const int kb)
const override final {
42 double angularCff(
int,
int)
const override final {
return 0; }
43 double angularCgg(
int,
int)
const override final {
return 0; }
45 return m_rank == 1 ? 1.0 : 0.0;
48 return m_rank == 1 ? 1.0 : 0.0;
55 m_constant = -m_q / (3.0 * std::sqrt(2.0));
66 :
EM_multipole(K, Parity::odd, 1.0 / 3.0, {}, Realness::imaginary,
false,
67 &gr,
'V',
'L',
true) {}
71 double angularCff(
int,
int)
const override final {
return 0; }
72 double angularCgg(
int,
int)
const override final {
return 0; }
74 return m_rank == 1 ? ka - kb - 1 : 0.0;
77 return m_rank == 1 ? ka - kb + 1 : 0.0;
88 gr.
r(), Realness::real,
true, &gr,
'V',
'T',
true),
99 if (
isZero(kappa_a, Fb.kappa())) {
106 Rab_rhs(+1, m_r2, &dF, Fb, -(m_q * m_q / 6.0));
107 }
else if (m_rank == 1) {
108 Rab_rhs(+1, m_vec, &dF, Fb, (m_q / 3.0));
117 if (
isZero(Fa.kappa(), Fb.kappa())) {
122 return -(m_q * m_q / 6.0) *
Rab(+1, m_r2, Fa, Fb);
125 return (m_q / 3.0) *
Rab(+1, m_vec, Fa, Fb);
139 std::vector<double> m_r2;
148 gr.
r(), Realness::real,
true, &gr,
'S',
'T',
true) {
155 dF.
min_pt() = Fb.min_pt();
156 dF.
max_pt() = Fb.max_pt();
158 if (
isZero(kappa_a, Fb.kappa())) {
165 Gab_rhs(&dF, Fb, -2.0);
166 }
else if (m_rank == 1) {
167 Rab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
176 if (
isZero(Fa.kappa(), Fb.kappa())) {
181 return -2.0 *
Gab(Fa, Fb);
185 return (m_q / 3.0) *
Rab(-1, m_vec, Fa, Fb);
211 gr.
r(), Realness::real,
false, &gr,
'A',
'E',
true) {
218 dF.
min_pt() = Fb.min_pt();
219 dF.
max_pt() = Fb.max_pt();
221 if (
isZero(kappa_a, Fb.kappa()) || kappa_a == -Fb.kappa()) {
227 const auto dk = double(kappa_a + Fb.kappa());
228 const auto dk_int = kappa_a + Fb.kappa();
229 const auto same_kap = kappa_a == Fb.kappa();
232 const double cx = std::sqrt(2.0) / 3.0;
234 if (same_kap || dk_int == 1) {
235 Gab_rhs(&dF, Fb, -2.0 * cx * dk);
243 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
247 Gab_rhs(&dF, Fb, -4.0 * cx2 * m_q);
250 Rab_rhs(-1, m_vec, &dF, Fb, cx2 * dk * m_q);
251 Rab_rhs(+1, m_vec, &dF, Fb, -2.0 * cx2 * m_q);
261 if (
isZero(Fa.kappa(), Fb.kappa()) || Fa.kappa() == -Fb.kappa()) {
265 const auto dk = double(Fa.kappa() + Fb.kappa());
266 const auto dk_int = Fa.kappa() + Fb.kappa();
268 const auto same_kap = Fa.kappa() == Fb.kappa();
271 const auto cx = std::sqrt(2.0);
273 if (same_kap || dk_int == 1) {
274 return (-2.0 / 3.0) * cx * dk *
Gab(Fa, Fb);
276 const auto Rm1 =
Rab(-1, Fa, Fb);
277 const auto Rp1 =
Rab(+1, Fa, Fb);
278 return cx * (dk * Rm1 - Rp1) / 3.0;
282 const auto cx2 = (1.0 / 15.0) * std::sqrt(3.0 / 2.0);
286 return cx2 * m_q * (-4.0 *
Gab(m_vec, Fa, Fb));
290 (dk *
Rab(-1, m_vec, Fa, Fb) - 2.0 *
Rab(+1, m_vec, Fa, Fb));
312 gr.
r(), Realness::real,
true, &gr,
'A',
'L',
true) {
319 dF.
min_pt() = Fb.min_pt();
320 dF.
max_pt() = Fb.max_pt();
322 if (
isZero(kappa_a, Fb.kappa())) {
329 Rab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
330 }
else if (m_rank == 1) {
331 const auto dk_int = kappa_a + Fb.kappa();
332 const auto dk = double(dk_int);
333 const auto same_kap = kappa_a == Fb.kappa();
336 if (same_kap || dk_int == 1) {
337 Gab_rhs(&dF, Fb, (2.0 / 3.0) * dk);
339 const auto c = -(1.0 / 3.0);
352 if (
isZero(Fa.kappa(), Fb.kappa())) {
357 return -(m_q / 3.0) *
Rab(+1, m_vec, Fa, Fb);
361 const auto dk_int = Fa.kappa() + Fb.kappa();
362 const auto dk = double(dk_int);
363 const auto same_kap = Fa.kappa() == Fb.kappa();
365 if (same_kap || dk_int == 1)
366 return (2.0 / 3.0) * dk *
Gab(Fa, Fb);
368 return -(1.0 / 3.0) * (dk *
Rab(-1, Fa, Fb) -
Rab(+1, Fa, Fb));
389 gr.
r(), Realness::real,
true, &gr,
'A',
'M',
true) {
397 dF.
min_pt() = Fb.min_pt();
398 dF.
max_pt() = Fb.max_pt();
400 if (
isZero(kappa_a, Fb.kappa()) || (kappa_a == Fb.kappa())) {
406 const auto sk = double(kappa_a - Fb.kappa());
408 Rab_rhs(-1, m_vec, &dF, Fb, -(m_q / (std::sqrt(2.0) * 3.0)) * sk);
413 const auto c = -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk;
414 Rab_rhs(-1, m_vec * m_vec, &dF, Fb, c);
423 if (
isZero(Fa.kappa(), Fb.kappa())) {
427 const auto sk = double(Fa.kappa() - Fb.kappa());
430 const auto ck = sk / std::sqrt(2.0);
431 return -ck * m_q *
Rab(-1, m_vec, Fa, Fb) / 3.0;
435 return -(m_q * m_q / (std::sqrt(6.0) * 15.0)) * sk *
436 Rab(-1, m_vec * m_vec, Fa, Fb);
459 gr.
r(), Realness::real,
true, &gr,
'A',
'T',
true),
467 dF.
min_pt() = Fb.min_pt();
468 dF.
max_pt() = Fb.max_pt();
470 if (
isZero(kappa_a, Fb.kappa())) {
476 const auto w_ab = m_q / m_alpha;
477 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
478 const auto c = -m_alpha * w_ab * f_rel;
479 Rab_rhs(+1, m_vec, &dF, Fb, c);
480 }
else if (m_rank == 1) {
482 Pab_rhs(-1, m_vec, &dF, Fb, (m_q / 3.0));
491 if (
isZero(Fa.kappa(), Fb.kappa())) {
497 const auto w_ab = Fa.en() - Fb.en();
498 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
499 return -m_alpha * w_ab *
Rab(+1, m_vec, Fa, Fb) * f_rel;
505 return (m_q / 3.0) *
Pab(-1, m_vec, Fa, Fb);
530 gr.
r(), Realness::real,
true, &gr,
'P',
'T',
true),
538 dF.
min_pt() = Fb.min_pt();
539 dF.
max_pt() = Fb.max_pt();
541 if (
isZero(kappa_a, Fb.kappa())) {
550 const auto w_ab = m_q / m_alpha;
551 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * kappa_a * w_ab);
552 const auto wab2 = std::pow(w_ab, 2);
553 const auto c = 0.5 * m_alpha * m_alpha * m_alpha * wab2 * f_rel;
555 Rab_rhs(+1, m_vec, &dF, Fb, c);
556 }
else if (m_rank == 1) {
557 Pab_rhs(+1, m_vec, &dF, Fb, -(m_q / 3.0));
566 if (
isZero(Fa.kappa(), Fb.kappa())) {
573 const auto w_ab = Fa.en() - Fb.en();
574 const auto f_rel = 1.0 / (1.0 + m_alpha * m_alpha * Fa.kappa() * w_ab);
576 const auto wab2 = std::pow(w_ab, 2);
577 return 0.5 * m_alpha * m_alpha * m_alpha * wab2 *
Rab(+1, m_vec, Fa, Fb) *
582 return -(m_q / 3.0) *
Pab(+1, m_vec, Fa, Fb);
591 m_q = m_alpha * omega;
Low qr form of Axial electric multipole operator: .
Definition EM_multipole_lowqr.hpp:207
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:258
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:297
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:215
Low qr form of Axial longitudinal multipole operator: .
Definition EM_multipole_lowqr.hpp:308
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:349
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:374
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:316
Low qr form of Axial magnetic multipole operator: .
Definition EM_multipole_lowqr.hpp:385
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:420
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:442
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:394
Intermediate abstract base class for all EM relativistic multipole operators.
Definition EM_multipole_base.hpp:50
double m_omega
Current frequency; cached by each derived updateFrequency().
Definition EM_multipole_base.hpp:174
Low qr form of Temporal component of the axial vector multipole operator: . NOTE: If K=0,...
Definition EM_multipole_lowqr.hpp:454
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:512
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:488
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:464
Low qr form of Temporal component of the vector multipole operator: .
Definition EM_multipole_lowqr.hpp:84
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:93
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:114
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:132
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:526
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
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:535
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:563
Low qr form of Scalar multipole operator: .
Definition EM_multipole_lowqr.hpp:144
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:152
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole_lowqr.hpp:173
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:192
bool isZero(int ka, int kb) const
If matrix element <a|h|b> is zero, returns true.
Definition TensorOperator.cpp:18
Low qr form of Vector electric. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:10
void updateFrequency(const double) override final
Update frequency for frequency-dependant operators.
Definition EM_multipole_lowqr.hpp:16
double angularCfg(int ka, int kb) const override final
Angular factor for f_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:20
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:19
double angularCgf(int ka, int kb) const override final
Angular factor for g_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:23
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:18
Low qr form of Vector longitudinal.
Definition EM_multipole_lowqr.hpp:63
double angularCfg(int ka, int kb) const override final
Angular factor for f_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:73
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:71
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:72
double angularCgf(int ka, int kb) const override final
Angular factor for g_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:76
void updateFrequency(const double) override final
Update frequency for frequency-dependant operators.
Definition EM_multipole_lowqr.hpp:69
Low qr form of Vector magnetic. Only for K=1 (zero otherwise)
Definition EM_multipole_lowqr.hpp:29
double angularCfg(int, int) const override final
Angular factor for f_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:44
double angularF(const int ka, const int kb) const override final
Definition EM_multipole_lowqr.hpp:38
double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition EM_multipole_lowqr.hpp:43
double angularCgf(int, int) const override final
Angular factor for g_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:47
double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition EM_multipole_lowqr.hpp:42
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole_lowqr.hpp:52
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
auto max_pt() const
Effective size(); index after last non-zero point (index for f[i])
Definition DiracSpinor.hpp:145
auto min_pt() const
First non-zero point (index for f[i])
Definition DiracSpinor.hpp:141
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:220
double Ck_kk(int k, int ka, int kb)
Reduced (relativistic) angular ME: <ka||C^k||kb> [takes k and kappa].
Definition Wigner369j.hpp:372
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:239
double Gab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Gab function: Int[ (ga*gb ) * t(r) , dr].
Definition TensorOperator.cpp:277
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:227
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:249
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:213
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