ampsci
High-precision calculations for one- and two-valence atomic systems
DiracOperator::EM_multipole

Intermediate abstract base class for all EM relativistic multipole operators. More...

#include <EM_multipole_base.hpp>

+ Inheritance diagram for DiracOperator::EM_multipole:

Public Member Functions

const SphericalBessel::JL_tablejl () const
 Returns the precomputed Bessel table pointer (may be nullptr).
 
std::string name () const override
 Returns a human-readable label, e.g. "T^E_1", "T^M5_2", "t_1", "P_1".
 
double angularF (const int ka, const int kb) const override
 Angular factor linking the radial integral to the reduced matrix element: \( \langle a \| h \| b \rangle = F(\kappa_a,\kappa_b) \cdot \int \! dr \).
 
void updateRank (int new_K) override
 Updates the tensor rank and adjusts parity accordingly.
 
std::unique_ptr< TensorOperatorclone () const override
 Creates a fully independent copy of this operator at its current (rank, frequency) state via the MultipoleOperator factory.
 
 EM_multipole (const EM_multipole &)=default
 
EM_multipoleoperator= (const EM_multipole &)=default
 
 EM_multipole (EM_multipole &&)=default
 
EM_multipoleoperator= (EM_multipole &&)=default
 
- Public Member Functions inherited from DiracOperator::TensorOperator
 TensorOperator (const TensorOperator &)=default
 
TensorOperatoroperator= (const TensorOperator &)=default
 
 TensorOperator (TensorOperator &&)=default
 
TensorOperatoroperator= (TensorOperator &&)=default
 
bool freqDependantQ () const
 
bool isZero (int ka, int kb) const
 If matrix element <a|h|b> is zero, returns true.
 
bool isZero (const DiracSpinor &Fa, const DiracSpinor &Fb) const
 
bool selectrion_rule (int twoJA, int piA, int twoJB, int piB) const
 
virtual void updateFrequency (const double)
 Update frequency for frequency-dependant operators.
 
void scale (double lambda)
 Permanently re-scales the operator by constant, lambda.
 
const std::vector< double > & getv () const
 Returns a const ref to vector v.
 
double getc () const
 Returns a const ref to constant c.
 
int get_d_order () const
 
bool imaginaryQ () const
 returns true if operator is imaginary (has imag MEs)
 
int rank () const
 Rank k of operator.
 
int parity () const
 returns parity, as integer (+1 or -1)
 
int symm_sign (const DiracSpinor &Fa, const DiracSpinor &Fb) const
 returns relative sign between <a||x||b> and <b||x||a>
 
virtual std::string units () const
 Returns units of operator (usually au, may be MHz, etc.)
 
virtual double angularCff (int, int) const
 Angular factor for f_a*f_b part of radial integral.
 
virtual double angularCgg (int, int) const
 Angular factor for g_a*g_b part of radial integral.
 
virtual double angularCfg (int, int) const
 Angular factor for f_a*g_b part of radial integral.
 
virtual double angularCgf (int, int) const
 Angular factor for g_a*f_b part of radial integral.
 
virtual DiracSpinor radial_rhs (const int kappa_a, const DiracSpinor &Fb) const
 radial_int = Fa * radial_rhs(a, Fb) (a needed for angular factor)
 
virtual double radialIntegral (const DiracSpinor &Fa, const DiracSpinor &Fb) const
 Radial part of integral R_ab = (Fa|t|Fb).
 
double rme3js (int twoja, int twojb, int two_mb=1, int two_q=0) const
 ME = rme3js * RME.
 
double rme3js (const DiracSpinor &Fa, const DiracSpinor &Fb, int two_mb=1, int two_q=0) const
 ME = rme3js * RME.
 
DiracSpinor reduced_rhs (const int ka, const DiracSpinor &Fb) const
 <a||h||b> = Fa * reduced_rhs(a, Fb) (a needed for angular factor)
 
DiracSpinor reduced_lhs (const int ka, const DiracSpinor &Fb) const
 <b||h||a> = Fa * reduced_lhs(a, Fb) (a needed for angular factor)
 
double reducedME (const DiracSpinor &Fa, const DiracSpinor &Fb) const
 The reduced matrix element.
 
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, returns z-component (q=0), with ma=mb=min(ja,jb)
 
double matel_factor (MatrixElementType type, int twoJa, int twoJb) const
 Converts reduced matrix element to different "type" (MatrixElementType)
 
double matel_factor (MatrixElementType type, const DiracSpinor &Fa, const DiracSpinor &Fb) const
 

Protected Member Functions

 EM_multipole (int rank_k, Parity pi, double constant, const std::vector< double > &vec, Realness RorI, bool freq_dep, const Grid *grid, char type, char comp, bool low_q, const SphericalBessel::JL_table *jl=nullptr, char form='V')
 Initialise the EM_multipole base layer.
 
- Protected Member Functions inherited from DiracOperator::TensorOperator
 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.
 

Protected Attributes

const Gridm_grid {nullptr}
 
double m_omega
 Current frequency; cached by each derived updateFrequency().
 
char m_type {}
 
char m_comp {}
 
bool m_low_q {}
 
char m_form {}
 
const SphericalBessel::JL_tablem_jl {nullptr}
 
- Protected Attributes inherited from DiracOperator::TensorOperator
int m_rank
 
Parity m_parity
 
int m_diff_order
 
Realness opC
 
bool m_freqDependantQ {false}
 
double m_constant
 
std::vector< double > m_vec
 

Detailed Description

Intermediate abstract base class for all EM relativistic multipole operators.

These are the \( t^K_Q \tilde\gamma \), \( T^{(\sigma)}_{KQ} \tilde\gamma \) operators from the vector expansion:

\[ \begin{align} e^{i\vec{q}\cdot\vec{r}} &= \sqrt{4\pi}\sum_{KQ}\sqrt{[K]} \, i^K \, {Y^*_{KQ}}{(\hat q)} \, t^K_Q(q,r),\\ \vec{\alpha} \, e^{i\vec{q}\cdot\vec{r}} & = \sqrt{4\pi} \sum_{KQ\sigma} \sqrt{[K]} \, i^{K-\sigma} \, \vec{Y}_{KQ}^{(\sigma)*}(\hat{{q}}) \, T^{(\sigma)}_{KQ}, \end{align} \]

with \( \tilde\gamma = 1,\) \( \gamma^5, \) \( \gamma^0, \) \( i\gamma^0\gamma^5 \) for vector (V), axial(pseudo)-vector (A), scalar (S), or pseudoscalar (P).

Stores the construction parameters needed to reconstruct the concrete operator via the MultipoleOperator factory, enabling type-erased cloning without the caller knowing the derived type.

Specifically, the stored parameters are: a pointer to the radial grid, the current frequency omega (updated by each derived class's updateFrequency()), the Lorentz type character m_type, the component character m_comp, the low-q flag m_low_q, an optional Bessel table pointer m_jl (shallow-owned; shared between original and clone), and a form character m_form (used to distinguish the length-form electric operator VEk_Len from the velocity-form VEk).

All concrete EM multipole operators VEk, VMk, VLk, Phik, Sk, AEk, ALk, AMk, Phi5k, S5k, and their low-q counterparts derive from this class.

Note
This class does not implement angularF() and so remains abstract. Operators must be constructed via the concrete derived types or the MultipoleOperator factory.

Constructor & Destructor Documentation

◆ EM_multipole()

DiracOperator::EM_multipole::EM_multipole ( int  rank_k,
Parity  pi,
double  constant,
const std::vector< double > &  vec,
Realness  RorI,
bool  freq_dep,
const Grid grid,
char  type,
char  comp,
bool  low_q,
const SphericalBessel::JL_table jl = nullptr,
char  form = 'V' 
)
inlineprotected

Initialise the EM_multipole base layer.

Called exclusively from derived-class constructors.

Parameters
rank_kTensor rank of the operator.
piParity.
constantOverall multiplicative constant.
vecRadial vector (usually gr.r(), sometimes empty).
RorIReal or imaginary matrix elements.
freq_depTrue if the operator is frequency-dependent.
gridPointer to the radial Grid (stored for clone()).
typeLorentz type: 'V', 'A', 'S', or 'P'.
compComponent: 'E', 'M', 'L', or 'T'.
low_qTrue for the low-momentum (long-wavelength) approximation.
jlOptional pointer to a precomputed Bessel table.
form'V' (velocity/V-form) or 'L' (length-form, VEk_Len only).

Member Function Documentation

◆ jl()

const SphericalBessel::JL_table * DiracOperator::EM_multipole::jl ( ) const
inline

Returns the precomputed Bessel table pointer (may be nullptr).

◆ name()

std::string DiracOperator::EM_multipole::name ( ) const
inlineoverridevirtual

Returns a human-readable label, e.g. "T^E_1", "T^M5_2", "t_1", "P_1".

Reimplemented from DiracOperator::TensorOperator.

◆ angularF()

double DiracOperator::EM_multipole::angularF ( const int  ka,
const int  kb 
) const
inlineoverridevirtual

Angular factor linking the radial integral to the reduced matrix element: \( \langle a \| h \| b \rangle = F(\kappa_a,\kappa_b) \cdot \int \! dr \).

Returns \( C^K(\kappa_a, \kappa_b) \) or \( C^K(\kappa_a, -\kappa_b) \) depending on the Lorentz structure. The flipped form applies to: vector-magnetic (VM), all axial components except axial-magnetic (AE, AL, AT), and pseudoscalar (P).

Note
\( C^K(\kappa_a,-\kappa_b) = C^K(-\kappa_a,\kappa_b) \).
VMk_lowq overrides this with an extra \((_a+_b)\) prefactor.

Implements DiracOperator::TensorOperator.

Reimplemented in DiracOperator::VMk_lowq.

◆ updateRank()

void DiracOperator::EM_multipole::updateRank ( int  new_K)
inlineoverridevirtual

Updates the tensor rank and adjusts parity accordingly.

Parity follows the tensor rank: even K gives even parity for most operators, but is flipped (even K odd parity) for vector-magnetic, all axial components except axial-magnetic, and pseudoscalar operators. The same flip rule as angularF() applies.

Note
Must be followed by a call to updateFrequency() to recompute the radial Bessel vectors for the new rank.

Reimplemented from DiracOperator::TensorOperator.

◆ clone()

std::unique_ptr< TensorOperator > DiracOperator::EM_multipole::clone ( ) const
overridevirtual

Creates a fully independent copy of this operator at its current (rank, frequency) state via the MultipoleOperator factory.

The Bessel table pointer m_jl is shallow-copied (the clone shares the same external table), but all computed radial vectors are regenerated independently on the first updateFrequency() call.

Returns
A std::unique_ptr<TensorOperator> to the cloned operator.

Reimplemented from DiracOperator::TensorOperator.

Member Data Documentation

◆ m_omega

double DiracOperator::EM_multipole::m_omega
protected
Initial value:
{
0.0}

Current frequency; cached by each derived updateFrequency().


The documentation for this class was generated from the following files: