2#include "Angular/Wigner369j.hpp"
3#include "Maths/Grid.hpp"
4#include "Maths/NumCalc_quadIntegrate.hpp"
5#include "Maths/SphericalBessel.hpp"
6#include "Physics/PhysConst_constants.hpp"
7#include "Potentials/NuclearPotentials.hpp"
8#include "Wavefunction/DiracSpinor.hpp"
9#include "qip/Vector.hpp"
18enum class Parity { even, odd, Error };
84 const std::vector<double> &vec = {},
int diff_order = 0,
85 Realness RorI = Realness::real,
bool freq_dep =
false)
88 m_diff_order(diff_order),
90 m_freqDependantQ(freq_dep),
95 virtual ~TensorOperator() =
default;
96 TensorOperator(
const TensorOperator &) =
default;
97 TensorOperator &operator=(
const TensorOperator &) =
default;
98 TensorOperator(TensorOperator &&) =
default;
99 TensorOperator &operator=(TensorOperator &&) =
default;
106 bool m_freqDependantQ{
false};
111 std::vector<double> m_vec;
114 bool freqDependantQ()
const {
return m_freqDependantQ; }
118 bool isZero(
const int ka,
int kb)
const;
121 bool selectrion_rule(
int twoJA,
int piA,
int twoJB,
int piB)
const {
122 if (twoJA == twoJB && twoJA == 0.0)
130 return (m_parity == Parity::even) == (piA == piB);
137 void scale(
double lambda);
140 const std::vector<double> &
getv()
const {
return m_vec; }
143 double getc()
const {
return m_constant; }
145 int get_d_order()
const {
return m_diff_order; }
148 bool imaginaryQ()
const {
return (opC == Realness::imaginary); }
151 int rank()
const {
return m_rank; }
154 int parity()
const {
return (m_parity == Parity::even) ? 1 : -1; }
164 virtual std::string
name()
const {
return "Operator"; };
166 virtual std::string
units()
const {
return "au"; };
195 virtual double angularF(
const int,
const int)
const = 0;
258 double rme3js(
const int twoja,
const int twojb,
int two_mb = 1,
259 int two_q = 0)
const;
263 int two_q = 0)
const {
264 return rme3js(Fa.twoj(), Fb.twoj(), two_mb, two_q);
279 std::optional<int> two_ma = std::nullopt,
280 std::optional<int> two_mb = std::nullopt,
281 std::optional<int> two_q = std::nullopt)
const;
298 const std::vector<double> &in_v = {},
299 const std::array<int, 4> &in_g = {1, 0, 0, 1},
int in_diff = 0,
307 ScalarOperator(
const std::vector<double> &in_v = {},
double in_coef = 1.0)
315 virtual double angularF(
const int ka,
const int kb)
const override {
319 return (std::abs(ka) == std::abs(kb)) ? std::sqrt(2.0 * std::abs(ka)) : 0.0;
323 const double c_ff, c_fg, c_gf, c_gg;
326 double virtual angularCff(
int,
int)
const override {
return c_ff; }
327 double virtual angularCgg(
int,
int)
const override {
return c_gg; }
328 double virtual angularCfg(
int,
int)
const override {
return c_fg; }
329 double virtual angularCgf(
int,
int)
const override {
return c_gf; }
339 double virtual angularCff(
int,
int)
const override final {
return 0.0; }
340 double virtual angularCgg(
int,
int)
const override final {
return 0.0; }
341 double virtual angularCfg(
int,
int)
const override final {
return 0.0; }
342 double virtual angularCgf(
int,
int)
const override final {
return 0.0; }
353double Pab(
double pm,
const std::vector<double> &t,
const DiracSpinor &Fa,
360double Rab(
double pm,
const std::vector<double> &t,
const DiracSpinor &Fa,
392void Gab_rhs(
const std::vector<double> &t,
DiracSpinor *dF,
Speacial operator: 0.
Definition TensorOperator.hpp:334
virtual double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition TensorOperator.hpp:340
virtual double angularCgf(int, int) const override final
Angular factor for g_a*f_b part of radial integral.
Definition TensorOperator.hpp:342
virtual double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition TensorOperator.hpp:339
virtual double angularCfg(int, int) const override final
Angular factor for f_a*g_b part of radial integral.
Definition TensorOperator.hpp:341
Speacial case for scalar operator.
Definition TensorOperator.hpp:295
virtual double angularCgf(int, int) const override
Angular factor for g_a*f_b part of radial integral.
Definition TensorOperator.hpp:329
virtual double angularCfg(int, int) const override
Angular factor for f_a*g_b part of radial integral.
Definition TensorOperator.hpp:328
virtual double angularCgg(int, int) const override
Angular factor for g_a*g_b part of radial integral.
Definition TensorOperator.hpp:327
virtual double angularF(const int ka, const int kb) const override
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
Definition TensorOperator.hpp:315
virtual double angularCff(int, int) const override
Angular factor for f_a*f_b part of radial integral.
Definition TensorOperator.hpp:326
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:65
double fullME(const DiracSpinor &Fa, const DiracSpinor &Fb, std::optional< int > two_ma=std::nullopt, std::optional< int > two_mb=std::nullopt, std::optional< int > two_q=std::nullopt) const
Returns "full" matrix element, for optional (ma, mb, q) [taken as int 2*]. If not specified,...
Definition TensorOperator.cpp:70
virtual double angularCgf(int, int) const
Angular factor for g_a*f_b part of radial integral.
Definition TensorOperator.hpp:190
int symm_sign(const DiracSpinor &Fa, const DiracSpinor &Fb) const
returns relative sign between <a||x||b> and <b||x||a>
Definition TensorOperator.hpp:157
bool imaginaryQ() const
returns true if operator is imaginary (has imag MEs)
Definition TensorOperator.hpp:148
virtual std::string units() const
Returns units of operator (usually au, may be MHz, etc.)
Definition TensorOperator.hpp:166
int parity() const
returns parity, as integer (+1 or -1)
Definition TensorOperator.hpp:154
double rme3js(const DiracSpinor &Fa, const DiracSpinor &Fb, int two_mb=1, int two_q=0) const
ME = rme3js * RME.
Definition TensorOperator.hpp:262
virtual double angularCff(int, int) const
Angular factor for f_a*f_b part of radial integral.
Definition TensorOperator.hpp:184
virtual double angularF(const int, const int) const =0
angularF: links radiation integral to RME. RME = <a||h||b> = angularF(a,b) * radial_int(a,...
virtual double angularCfg(int, int) const
Angular factor for f_a*g_b part of radial integral.
Definition TensorOperator.hpp:188
bool isZero(const int ka, int kb) const
If matrix element <a|h|b> is zero, returns true.
Definition TensorOperator.cpp:18
double matel_factor(MatrixElementType type, int twoJa, int twoJb) const
Converts reduced matrix element to different "type" (MatrixElementType)
Definition TensorOperator.cpp:87
virtual std::string name() const
Returns "name" of operator (e.g., 'E1')
Definition TensorOperator.hpp:164
double getc() const
Returns a const ref to constant c.
Definition TensorOperator.hpp:143
double reducedME(const DiracSpinor &Fa, const DiracSpinor &Fb) const
The reduced matrix element.
Definition TensorOperator.cpp:65
virtual double angularCgg(int, int) const
Angular factor for g_a*g_b part of radial integral.
Definition TensorOperator.hpp:186
DiracSpinor reduced_lhs(const int ka, const DiracSpinor &Fb) const
<b||h||a> = Fa * reduced_lhs(a, Fb) (a needed for angular factor)
Definition TensorOperator.cpp:58
void scale(double lambda)
Permanently re-scales the operator by constant, lambda.
Definition TensorOperator.cpp:107
double rme3js(const int twoja, const int twojb, int two_mb=1, int two_q=0) const
ME = rme3js * RME.
Definition TensorOperator.cpp:43
virtual DiracSpinor radial_rhs(const int kappa_a, const DiracSpinor &Fb) const
radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
Definition TensorOperator.cpp:111
virtual double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const
Radial part of integral R_ab = (Fa|t|Fb).
Definition TensorOperator.cpp:156
int rank() const
Rank k of operator.
Definition TensorOperator.hpp:151
DiracSpinor reduced_rhs(const int ka, const DiracSpinor &Fb) const
<a||h||b> = Fa * reduced_rhs(a, Fb) (a needed for angular factor)
Definition TensorOperator.cpp:53
virtual void updateFrequency(const double)
Update frequency for frequency-dependant operators.
Definition TensorOperator.hpp:134
const std::vector< double > & getv() const
Returns a const ref to vector v.
Definition TensorOperator.hpp:140
TensorOperator(int rank_k, Parity pi, double constant=1.0, const std::vector< double > &vec={}, int diff_order=0, Realness RorI=Realness::real, bool freq_dep=false)
Constructs a tensor operator description.
Definition TensorOperator.hpp:83
Stores radial Dirac spinor: F_nk = (f, g)
Definition DiracSpinor.hpp:42
constexpr int neg1pow_2(int two_a)
Evaluates (-1)^{two_a/2} (for integer a; two_a is even)
Definition Wigner369j.hpp:226
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:236
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:242
double Vab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Vab function: Int[ (fa*gb ) * t(r) , dr].
Definition TensorOperator.cpp:261
double Gab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Gab function: Int[ (ga*gb ) * t(r) , dr].
Definition TensorOperator.cpp:280
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:230
double Wab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Wab function: Int[ (ga*fb ) * t(r) , dr].
Definition TensorOperator.cpp:271
Realness parse_Realness(const std::string &s)
Convert string to Realness.
Definition TensorOperator.cpp:404
MatrixElementType
Type of matrix element returned.
Definition TensorOperator.hpp:33
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:252
Parity
Parity of operator.
Definition TensorOperator.hpp:18
Parity parse_Parity(const std::string &s)
Convert string to Parity.
Definition TensorOperator.cpp:381
Realness
Realness of matrix element; impacts symmetry only.
Definition TensorOperator.hpp:21
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:216
MatrixElementType parse_MatrixElementType(const std::string &s)
Convert string to MatrixElementType.
Definition TensorOperator.cpp:427