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"
19enum class Parity { even, odd, Error };
85 const std::vector<double> &vec = {},
int diff_order = 0,
86 Realness RorI = Realness::real,
bool freq_dep =
false)
89 m_diff_order(diff_order),
91 m_freqDependantQ(freq_dep),
120 bool m_freqDependantQ{
false};
125 std::vector<double> m_vec;
128 bool freqDependantQ()
const {
return m_freqDependantQ; }
132 bool isZero(
int ka,
int kb)
const;
135 bool selectrion_rule(
int twoJA,
int piA,
int twoJB,
int piB)
const {
136 if (twoJA == twoJB && twoJA == 0.0)
142 return (m_parity == Parity::even) == (piA == piB);
147 std::cout <<
"Must reimplement updateFrequency()\n";
148 std::cout << this->
name() <<
"\n";
157 std::cout <<
"Must reimplement updateRank() is needed\n";
158 std::cout << this->
name() <<
"\n";
163 void scale(
double lambda);
166 const std::vector<double> &
getv()
const {
return m_vec; }
169 double getc()
const {
return m_constant; }
171 int get_d_order()
const {
return m_diff_order; }
174 bool imaginaryQ()
const {
return (opC == Realness::imaginary); }
177 int rank()
const {
return m_rank; }
180 int parity()
const {
return (m_parity == Parity::even) ? 1 : -1; }
190 virtual std::string
name()
const {
return "Operator"; };
192 virtual std::string
units()
const {
return "au"; };
221 virtual double angularF(
const int,
const int)
const = 0;
224 virtual std::unique_ptr<TensorOperator>
clone()
const {
return nullptr; }
287 double rme3js(
int twoja,
int twojb,
int two_mb = 1,
int two_q = 0)
const;
291 int two_q = 0)
const {
292 return rme3js(Fa.twoj(), Fb.twoj(), two_mb, two_q);
307 std::optional<int> two_ma = std::nullopt,
308 std::optional<int> two_mb = std::nullopt,
309 std::optional<int> two_q = std::nullopt)
const;
326 const std::vector<double> &in_v = {},
327 const std::array<int, 4> &in_g = {1, 0, 0, 1},
int in_diff = 0,
335 ScalarOperator(
const std::vector<double> &in_v = {},
double in_coef = 1.0)
343 virtual double angularF(
const int ka,
const int kb)
const override {
347 return (std::abs(ka) == std::abs(kb)) ? std::sqrt(2.0 * std::abs(ka)) : 0.0;
351 const double c_ff, c_fg, c_gf, c_gg;
354 double virtual angularCff(
int,
int)
const override {
return c_ff; }
355 double virtual angularCgg(
int,
int)
const override {
return c_gg; }
356 double virtual angularCfg(
int,
int)
const override {
return c_fg; }
357 double virtual angularCgf(
int,
int)
const override {
return c_gf; }
367 double virtual angularCff(
int,
int)
const override final {
return 0.0; }
368 double virtual angularCgg(
int,
int)
const override final {
return 0.0; }
369 double virtual angularCfg(
int,
int)
const override final {
return 0.0; }
370 double virtual angularCgf(
int,
int)
const override final {
return 0.0; }
381double Pab(
double pm,
const std::vector<double> &t,
const DiracSpinor &Fa,
388double Rab(
double pm,
const std::vector<double> &t,
const DiracSpinor &Fa,
420void Gab_rhs(
const std::vector<double> &t,
DiracSpinor *dF,
Speacial operator: 0.
Definition TensorOperator.hpp:362
virtual double angularCgg(int, int) const override final
Angular factor for g_a*g_b part of radial integral.
Definition TensorOperator.hpp:368
virtual double angularCgf(int, int) const override final
Angular factor for g_a*f_b part of radial integral.
Definition TensorOperator.hpp:370
virtual double angularCff(int, int) const override final
Angular factor for f_a*f_b part of radial integral.
Definition TensorOperator.hpp:367
virtual double angularCfg(int, int) const override final
Angular factor for f_a*g_b part of radial integral.
Definition TensorOperator.hpp:369
Speacial case for scalar operator.
Definition TensorOperator.hpp:323
virtual double angularCgf(int, int) const override
Angular factor for g_a*f_b part of radial integral.
Definition TensorOperator.hpp:357
virtual double angularCfg(int, int) const override
Angular factor for f_a*g_b part of radial integral.
Definition TensorOperator.hpp:356
virtual double angularCgg(int, int) const override
Angular factor for g_a*g_b part of radial integral.
Definition TensorOperator.hpp:355
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:343
virtual double angularCff(int, int) const override
Angular factor for f_a*f_b part of radial integral.
Definition TensorOperator.hpp:354
General operator (virtual base class); operators derive from this.
Definition TensorOperator.hpp:66
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:67
virtual double angularCgf(int, int) const
Angular factor for g_a*f_b part of radial integral.
Definition TensorOperator.hpp:216
virtual std::unique_ptr< TensorOperator > clone() const
Returns a polymorphic copy at the current state, or nullptr if not supported.
Definition TensorOperator.hpp:224
int symm_sign(const DiracSpinor &Fa, const DiracSpinor &Fb) const
returns relative sign between <a||x||b> and <b||x||a>
Definition TensorOperator.hpp:183
bool imaginaryQ() const
returns true if operator is imaginary (has imag MEs)
Definition TensorOperator.hpp:174
virtual std::string units() const
Returns units of operator (usually au, may be MHz, etc.)
Definition TensorOperator.hpp:192
int parity() const
returns parity, as integer (+1 or -1)
Definition TensorOperator.hpp:180
double rme3js(const DiracSpinor &Fa, const DiracSpinor &Fb, int two_mb=1, int two_q=0) const
ME = rme3js * RME.
Definition TensorOperator.hpp:290
virtual double angularCff(int, int) const
Angular factor for f_a*f_b part of radial integral.
Definition TensorOperator.hpp:210
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:214
double matel_factor(MatrixElementType type, int twoJa, int twoJb) const
Converts reduced matrix element to different "type" (MatrixElementType)
Definition TensorOperator.cpp:84
virtual std::string name() const
Returns "name" of operator (e.g., 'E1')
Definition TensorOperator.hpp:190
double getc() const
Returns a const ref to constant c.
Definition TensorOperator.hpp:169
double reducedME(const DiracSpinor &Fa, const DiracSpinor &Fb) const
The reduced matrix element.
Definition TensorOperator.cpp:62
virtual double angularCgg(int, int) const
Angular factor for g_a*g_b part of radial integral.
Definition TensorOperator.hpp:212
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:55
void scale(double lambda)
Permanently re-scales the operator by constant, lambda.
Definition TensorOperator.cpp:104
double rme3js(int twoja, int twojb, int two_mb=1, int two_q=0) const
ME = rme3js * RME.
Definition TensorOperator.cpp:40
bool isZero(int ka, int kb) const
If matrix element <a|h|b> is zero, returns true.
Definition TensorOperator.cpp:18
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:108
virtual void updateRank(int)
Updates the rank of operator (rarely used). Generally also updates parity.
Definition TensorOperator.hpp:156
virtual double radialIntegral(const DiracSpinor &Fa, const DiracSpinor &Fb) const
Radial part of integral R_ab = (Fa|t|Fb).
Definition TensorOperator.cpp:153
int rank() const
Rank k of operator.
Definition TensorOperator.hpp:177
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:50
virtual void updateFrequency(const double)
Update frequency for frequency-dependant operators.
Definition TensorOperator.hpp:146
const std::vector< double > & getv() const
Returns a const ref to vector v.
Definition TensorOperator.hpp:166
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:84
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:239
double Vab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Vab function: Int[ (fa*gb ) * t(r) , dr].
Definition TensorOperator.cpp:258
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
double Wab(const std::vector< double > &t, const DiracSpinor &Fa, const DiracSpinor &Fb)
Wab function: Int[ (ga*fb ) * t(r) , dr].
Definition TensorOperator.cpp:268
Realness parse_Realness(const std::string &s)
Convert string to Realness.
Definition TensorOperator.cpp:401
MatrixElementType
Type of matrix element returned.
Definition TensorOperator.hpp:34
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
Parity
Parity of operator.
Definition TensorOperator.hpp:19
Parity parse_Parity(const std::string &s)
Convert string to Parity.
Definition TensorOperator.cpp:378
Realness
Realness of matrix element; impacts symmetry only.
Definition TensorOperator.hpp:22
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
MatrixElementType parse_MatrixElementType(const std::string &s)
Convert string to MatrixElementType.
Definition TensorOperator.cpp:424
Used to pass generic parameters to update() function.
Definition TensorOperator.hpp:104