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

ok

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.

#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
 Returns true if the operator is frequency-dependent (requires updateFrequency() calls).
 
bool isZero (int ka, int kb) const
 Returns true if <a|h|b> = 0 by rank/parity selection rules.
 
bool isZero (const DiracSpinor &Fa, const DiracSpinor &Fb) const
 Overload taking DiracSpinors; forwards to isZero(ka, kb).
 
bool selectrion_rule (int twoJA, int piA, int twoJB, int piB) const
 Returns true if the matrix element is non-zero by angular momentum and parity selection rules (arguments are 2j and pi as integers).
 
virtual void updateFrequency (const double)
 Updates the operator for a new frequency omega.
 
const std::vector< double > & getv () const
 Returns a const ref to the stored vector v.
 
double getc () const
 Returns the "overall" constant c.
 
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 as a string (usually au, may be MHz, etc.)
 
virtual double angularCff (int kappa_a, int kappa_b) const
 Angular coefficient C_ff for the f_a*f_b term of the radial integral.
 
virtual double angularCgg (int, int) const
 Angular coefficient C_gg for the g_a*g_b term of the radial integral.
 
virtual double angularCfg (int, int) const
 Angular coefficient C_fg for the f_a*g_b term of the radial integral.
 
virtual double angularCgf (int, int) const
 Angular coefficient C_gf for the g_a*f_b term of the radial integral.
 
double angularCxy (uint8_t x, uint8_t y, int kappa_a, int kappa_b) const
 Dispatches to angularCff/fg/gf/gg based on component indices x, y.
 
virtual DiracSpinor radial_rhs (const int kappa_a, const DiracSpinor &Fb) const
 Computes the right-hand spinor dF_b for the radial integral.
 
virtual double radialIntegral (const DiracSpinor &Fa, const DiracSpinor &Fb) const
 Radial integral R_ab, defined by RME = angularF(a,b) * radialIntegral(a,b).
 
double rme3js (int twoja, int twojb, int two_mb=1, int two_q=0) const
 3j-symbol factor linking the full ME to the RME.
 
double rme3js (const DiracSpinor &Fa, const DiracSpinor &Fb, int two_mb=1, int two_q=0) const
 Overload of rme3js taking DiracSpinors.
 
DiracSpinor reduced_rhs (const int ka, const DiracSpinor &Fb) const
 Returns angularF(ka,kb) * radial_rhs(ka,Fb); spinor-valued RME action on Fb, used in perturbation theory/TDHF.
 
DiracSpinor reduced_lhs (const int ka, const DiracSpinor &Fb) const
 As reduced_rhs but for the conjugate direction; Fb * reduced_lhs(ka, Fb) = <b||h||a>.
 
double reducedME (const DiracSpinor &Fa, const DiracSpinor &Fb) const
 Returns the reduced matrix element <a||h||b> = A_ab * R_ab.
 
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
 Returns the factor to convert a reduced ME to a different form (Reduced, Stretched, or HFConstant); see MatrixElementType.
 
double matel_factor (MatrixElementType type, const DiracSpinor &Fa, const DiracSpinor &Fb) const
 Overload of matel_factor taking DiracSpinors.
 

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={}, Realness RorI=Realness::real, bool freq_dep=false)
 Constructs a specific tensor operator. Called by derived classes.
 

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
 
Realness m_Realness
 
bool m_freqDependantQ {false}
 
double m_constant
 
std::vector< double > m_vec
 

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: