2#include "DiracOperator/TensorOperator.hpp"
3#include "IO/InputBlock.hpp"
4#include "Maths/SphericalBessel.hpp"
5#include "Wavefunction/Wavefunction.hpp"
6#include "qip/Maths.hpp"
9#include "EM_multipole_lowqr.hpp"
33 gr.
r(), 0, Realness::imaginary,
true),
39 std::string
name() const override final {
40 return std::string(
"V^E(Len)_") + std::to_string(m_K);
43 double angularF(
const int ka,
const int kb)
const override final {
61 std::vector<double> m_jK{};
62 std::vector<double> m_jKp1{};
63 const std::vector<double> *p_jK{
nullptr};
64 const std::vector<double> *p_jKp1{
nullptr};
68 VEk_Len(
const VEk_Len &) =
default;
69 VEk_Len &operator=(
const VEk_Len &) =
default;
88 VEk(
const Grid &gr,
int K,
double omega,
91 gr.
r(), 0, Realness::imaginary,
true),
97 std::string
name() const override final {
98 return std::string(
"V^E_") + std::to_string(m_K);
101 double angularF(
const int ka,
const int kb)
const override final {
119 std::vector<double> m_jK_on_qr{};
120 std::vector<double> m_jKp1{};
121 const std::vector<double> *p_jK_on_qr{
nullptr};
122 const std::vector<double> *p_jKp1{
nullptr};
126 VEk(
const VEk &) =
default;
127 VEk &operator=(
const VEk &) =
default;
145 VLk(
const Grid &gr,
int K,
double omega,
148 gr.
r(), 0, Realness::imaginary,
true),
154 std::string
name() const override final {
155 return std::string(
"V^L_") + std::to_string(m_K);
158 double angularF(
const int ka,
const int kb)
const override final {
176 std::vector<double> m_jK_on_qr{};
177 std::vector<double> m_jKp1{};
178 const std::vector<double> *p_jK_on_qr{
nullptr};
179 const std::vector<double> *p_jKp1{
nullptr};
183 VLk(
const VLk &) =
default;
184 VLk &operator=(
const VLk &) =
default;
201 VMk(
const Grid &gr,
int K,
double omega,
204 gr.
r(), 0, Realness::imaginary,
true),
211 std::string
name() const override final {
212 return std::string(
"V^M_") + std::to_string(m_K);
215 double angularF(
const int ka,
const int kb)
const override final {
233 std::vector<double> m_jK{};
234 const std::vector<double> *p_jK{
nullptr};
238 VMk(
const VMk &) =
default;
239 VMk &operator=(
const VMk &) =
default;
256 Phik(
const Grid &gr,
int K,
double omega,
259 gr.
r(), 0, Realness::real,
true),
265 std::string
name() const override final {
266 return std::string(
"Phi_") + std::to_string(m_K);
269 double angularF(
const int ka,
const int kb)
const override final {
287 std::vector<double> m_jK{};
288 const std::vector<double> *p_jK{
nullptr};
292 Phik(
const Phik &) =
default;
293 Phik &operator=(
const Phik &) =
default;
311 Sk(
const Grid &gr,
int K,
double omega,
314 gr.
r(), 0, Realness::real,
true),
320 std::string
name() const override final {
321 return std::string(
"t^S_") + std::to_string(m_K);
324 double angularF(
const int ka,
const int kb)
const override final {
342 std::vector<double> m_jK{};
343 const std::vector<double> *p_jK{
nullptr};
347 Sk(
const Sk &) =
default;
348 Sk &operator=(
const Sk &) =
default;
369 AEk(
const Grid &gr,
int K,
double omega,
372 gr.
r(), 0, Realness::real),
378 std::string
name() const override final {
379 return std::string(
"T^E5_") + std::to_string(m_K);
382 double angularF(
const int ka,
const int kb)
const override final {
398 std::vector<double> m_jK_on_qr{};
399 std::vector<double> m_jKp1{};
400 const std::vector<double> *p_jK_on_qr{
nullptr};
401 const std::vector<double> *p_jKp1{
nullptr};
405 AEk(
const AEk &) =
default;
406 AEk &operator=(
const AEk &) =
default;
420 ALk(
const Grid &gr,
int K,
double omega,
423 gr.
r(), 0, Realness::real,
true),
429 std::string
name() const override final {
430 return std::string(
"T^L5_") + std::to_string(m_K);
433 double angularF(
const int ka,
const int kb)
const override final {
449 std::vector<double> m_jK_on_qr{};
450 std::vector<double> m_jKp1{};
451 const std::vector<double> *p_jK_on_qr{
nullptr};
452 const std::vector<double> *p_jKp1{
nullptr};
456 ALk(
const ALk &) =
default;
457 ALk &operator=(
const ALk &) =
default;
471 AMk(
const Grid &gr,
int K,
double omega,
474 gr.
r(), 0, Realness::real,
true),
481 std::string
name() const override final {
482 return std::string(
"T^M5_") + std::to_string(m_K);
485 double angularF(
const int ka,
const int kb)
const override final {
501 std::vector<double> m_jK{};
502 const std::vector<double> *p_jK{
nullptr};
506 AMk(
const AMk &) =
default;
507 AMk &operator=(
const AMk &) =
default;
522 Phi5k(
const Grid &gr,
int K,
double omega,
525 gr.
r(), 0, Realness::real,
true),
531 std::string
name() const override final {
532 return std::string(
"Phi5_") + std::to_string(m_K);
535 double angularF(
const int ka,
const int kb)
const override final {
551 std::vector<double> m_jK{};
552 const std::vector<double> *p_jK{
nullptr};
556 Phi5k(
const Phi5k &) =
default;
557 Phi5k &operator=(
const Phi5k &) =
default;
572 S5k(
const Grid &gr,
int K,
double omega,
575 gr.
r(), 0, Realness::real,
true),
581 std::string
name() const override final {
582 return std::string(
"S5_") + std::to_string(m_K);
585 double angularF(
const int ka,
const int kb)
const override final {
601 std::vector<double> m_jK{};
602 const std::vector<double> *p_jK{
nullptr};
606 S5k(
const S5k &) =
default;
607 S5k &operator=(
const S5k &) =
default;
621 std::sqrt(K / (K + 1.0));
629inline std::unique_ptr<DiracOperator::TensorOperator>
633 {
"",
"Note: This function cannot use the Spherical Bessel looup table. If "
634 "require efficiency for large number of q values, construct directly"},
635 {
"k",
"Rank: k=1 for E1, =2 for E2 etc. [1]"},
636 {
"omega",
"Frequency: nb: q := alpha*omega [1.0e-4]"},
637 {
"type",
"V,A,S,P (Vector, Axial, Scalar, Pseudoscalar) [V]"},
638 {
"low_q",
"bool. Use low-q formulas (K=0 and 1 only, no L-form) [false]"},
639 {
"component",
"E,M,L,T (electric, magnetic, longitudanel, temporal). "
640 "Temporal is forced if type = S or P. [E]"},
641 {
"form",
"L,V (Length, Velocity); only for electric vector [L]"},
646 const auto k = input.
get(
"k", 1);
647 const auto omega = input.
get(
"omega", 1.0e-4);
649 const auto low_q = input.
get(
"low_q",
false);
651 using namespace std::string_literals;
652 const auto type = input.
get(
"type",
"V"s);
653 const auto component = input.
get(
"component",
"E"s);
654 const auto form = input.
get(
"form",
"V"s);
668 if (LengthForm && !(Electric && Vector)) {
669 std::cout <<
"Fail; Length form only valid for Electric Vector\n";
673 if (Electric && Vector)
674 return std::make_unique<VEk_lowq>(wf.
grid(), k, omega);
675 if (Electric && AxialVector)
676 return std::make_unique<AEk_lowq>(wf.
grid(), k, omega);
679 if (Longitudinal && Vector)
680 return std::make_unique<VLk_lowq>(wf.
grid(), k, omega);
681 if (Longitudinal && AxialVector)
682 return std::make_unique<ALk_lowq>(wf.
grid(), k, omega);
685 if (Magnetic && Vector)
686 return std::make_unique<VMk_lowq>(wf.
grid(), k, omega);
687 if (Magnetic && AxialVector)
688 return std::make_unique<AMk_lowq>(wf.
grid(), k, omega);
691 if (Temporal && Vector)
692 return std::make_unique<Phik_lowq>(wf.
grid(), k, omega);
693 if (Temporal && AxialVector)
694 return std::make_unique<Phi5k_lowq>(wf.
grid(), k, omega);
697 return std::make_unique<Sk_lowq>(wf.
grid(), k, omega);
699 return std::make_unique<S5k_lowq>(wf.
grid(), k, omega);
703 if (Electric && LengthForm && Vector)
704 return std::make_unique<VEk_Len>(wf.
grid(), k, omega);
705 if (Electric && Vector)
706 return std::make_unique<VEk>(wf.
grid(), k, omega);
707 if (Electric && AxialVector)
708 return std::make_unique<AEk>(wf.
grid(), k, omega);
711 if (Longitudinal && Vector)
712 return std::make_unique<VLk>(wf.
grid(), k, omega);
713 if (Longitudinal && AxialVector)
714 return std::make_unique<ALk>(wf.
grid(), k, omega);
717 if (Magnetic && Vector)
718 return std::make_unique<VMk>(wf.
grid(), k, omega);
719 if (Magnetic && AxialVector)
720 return std::make_unique<AMk>(wf.
grid(), k, omega);
723 if (Temporal && Vector)
724 return std::make_unique<Phik>(wf.
grid(), k, omega);
725 if (Temporal && AxialVector)
726 return std::make_unique<Phi5k>(wf.
grid(), k, omega);
729 return std::make_unique<Sk>(wf.
grid(), k, omega);
731 return std::make_unique<S5k>(wf.
grid(), k, omega);
733 std::cout <<
"Fail; Invalid Combination\n";
734 return std::make_unique<NullOperator>();
778std::unique_ptr<DiracOperator::TensorOperator>
Axial electric multipole operator: .
Definition EM_multipole.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.hpp:382
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:378
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.cpp:329
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:392
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:362
Axial longitudinal multipole operator: .
Definition EM_multipole.hpp:418
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.cpp:410
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.hpp:433
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:446
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:429
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:432
Axial magnetic multipole operator: .
Definition EM_multipole.hpp:469
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.hpp:485
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.cpp:467
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:481
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:506
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:489
Temporal component of the axial vector multipole operator: .
Definition EM_multipole.hpp:520
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.hpp:535
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.cpp:522
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:531
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:550
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:539
Temporal component of the vector multipole operator: .
Definition EM_multipole.hpp:254
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.cpp:244
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:261
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.hpp:269
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:272
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:265
Pseudoscalar multipole operator: .
Definition EM_multipole.hpp:570
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:581
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:582
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.cpp:565
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:592
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.hpp:585
Scalar multipole operator: .
Definition EM_multipole.hpp:309
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:320
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.cpp:287
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.hpp:324
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:314
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:304
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:65
Vector electric multipole (transition) operator, Length-form: ( ).
Definition EM_multipole.hpp:28
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.cpp:9
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.hpp:43
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:39
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:31
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:47
Vector electric multipole (V-form) operator: .
Definition EM_multipole.hpp:86
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:97
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:111
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.hpp:101
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:92
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.cpp:66
Vector longitudinal multipole operator (V-form): .
Definition EM_multipole.hpp:143
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.hpp:158
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:154
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.cpp:132
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:170
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:156
Vector magnetic multipole operator: .
Definition EM_multipole.hpp:199
void updateFrequency(const double omega) override final
nb: q = alpha*omega!
Definition EM_multipole.cpp:229
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.cpp:191
double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const override final
Radial part of integral R_ab = (Fa|t|Fb).
Definition EM_multipole.cpp:213
std::string name() const override final
Returns "name" of operator (e.g., 'E1')
Definition EM_multipole.hpp:211
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.hpp:215
s (spin) operator
Definition jls.hpp:50
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:41
Holds grid, including type + Jacobian (dr/du)
Definition Grid.hpp:31
const std::vector< double > & r() const
Grid points, r.
Definition Grid.hpp:75
Spherical Bessel Lookup table; in the form j_L(qr) = J[L][q][r].
Definition SphericalBessel.hpp:120
Stores Wavefunction (set of valence orbitals, grid, HF etc.)
Definition Wavefunction.hpp:37
const Grid & grid() const
Returns a const reference to the radial grid.
Definition Wavefunction.hpp:82
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
double moment_factor(int K, double omega)
Convert from "transition form" to "moment form" [check sign?].
Definition EM_multipole.hpp:617
Dirac Operators: General + derived.
Definition GenerateOperator.cpp:3
std::unique_ptr< DiracOperator::TensorOperator > MultipoleOperator(const Grid &grid, int k, double omega, char type, char comp, bool low_q, const SphericalBessel::JL_table *jl)
Factory for relativistic multipole operators.
Definition EM_multipole.cpp:607
constexpr double alpha
Fine-structure constant: alpha = 1/137.035 999 177(21) [CODATA 2022].
Definition PhysConst_constants.hpp:24
constexpr T double_factorial(T x)
Double factorial x!! - nb: does not check for overflow. Max x is 20 for uint64_t.
Definition Maths.hpp:131
bool ci_wc_compare(std::string_view s1, std::string_view s2)
Compares two strings, s1 and s2. s2 may contain ONE wildcard ('*') which will match anything....
Definition String.hpp:140
constexpr auto pow(T x)
x^n for integer n (n compile-time template parameter), x any arithmetic type (T). Returns double for ...
Definition Maths.hpp:88