|
ampsci
High-precision calculations for one- and two-valence atomic systems
|
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.
#include <EM_multipole_base.hpp>
Inheritance diagram for DiracOperator::EM_multipole:Public Member Functions | |
| const SphericalBessel::JL_table * | jl () 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< TensorOperator > | clone () 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_multipole & | operator= (const EM_multipole &)=default |
| EM_multipole (EM_multipole &&)=default | |
| EM_multipole & | operator= (EM_multipole &&)=default |
Public Member Functions inherited from DiracOperator::TensorOperator | |
| TensorOperator (const TensorOperator &)=default | |
| TensorOperator & | operator= (const TensorOperator &)=default |
| TensorOperator (TensorOperator &&)=default | |
| TensorOperator & | operator= (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 Grid * | m_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_table * | m_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 |
|
inlineprotected |
Initialise the EM_multipole base layer.
Called exclusively from derived-class constructors.
| rank_k | Tensor rank of the operator. |
| pi | Parity. |
| constant | Overall multiplicative constant. |
| vec | Radial vector (usually gr.r(), sometimes empty). |
| RorI | Real or imaginary matrix elements. |
| freq_dep | True if the operator is frequency-dependent. |
| grid | Pointer to the radial Grid (stored for clone()). |
| type | Lorentz type: 'V', 'A', 'S', or 'P'. |
| comp | Component: 'E', 'M', 'L', or 'T'. |
| low_q | True for the low-momentum (long-wavelength) approximation. |
| jl | Optional pointer to a precomputed Bessel table. |
| form | 'V' (velocity/V-form) or 'L' (length-form, VEk_Len only). |
|
inline |
Returns the precomputed Bessel table pointer (may be nullptr).
|
inlineoverridevirtual |
Returns a human-readable label, e.g. "T^E_1", "T^M5_2", "t_1", "P_1".
Reimplemented from DiracOperator::TensorOperator.
|
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).
Implements DiracOperator::TensorOperator.
Reimplemented in DiracOperator::VMk_lowq.
|
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.
Reimplemented from DiracOperator::TensorOperator.
|
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.
Reimplemented from DiracOperator::TensorOperator.
|
protected |
Current frequency; cached by each derived updateFrequency().