|
ampsci
High-precision calculations for one- and two-valence atomic systems
|
Magnetic dipole operator: <a||M1||b>
\[ <a||M1||b> = R (k_a + k_b) <-k_a||C^1||k_b> \]
\[R = \frac{-3}{\alpha^2\omega} \int (f_ag_b+g_af_b) j_1(kr) \, dr\]
\( k = \omega/c = \omega*\alpha \). Negative sign (and alpha) puts into units |mu_B|. For k<<1 (static case): j1(kr) -> (r*k)/3,
\[R = \frac{-1}{\alpha} \int (f_ag_b+g_af_b) r \, dr\]
Probably, alpha should always by actual alpha, just units, not relativistic?
Be careful with this operator - compare with: U. I. Safronova, M. S. Safronova, and W. R. Johnson, Phys. Rev. A 95, 042507 (2017).
#include <M1.hpp>
Inheritance diagram for DiracOperator::M1:Public Member Functions | |
| M1 (const Grid &gr, const double alpha, const double omega=0.0) | |
| M1 & | operator= (const M1 &)=delete |
| M1 (const M1 &)=default | |
| std::string | name () const override final |
| Returns "name" of operator (e.g., 'E1') | |
| std::string | units () const override final |
| Returns units of operator as a string (usually au, may be MHz, etc.) | |
| double | angularF (const int ka, const int kb) const override final |
| Angular factor A_ab linking the radial integral to the RME. | |
| double | angularCff (int, int) const override final |
| Angular coefficient C_ff for the f_a*f_b term of the radial integral. | |
| double | angularCgg (int, int) const override final |
| Angular coefficient C_gg for the g_a*g_b term of the radial integral. | |
| double | angularCfg (int, int) const override final |
| Angular coefficient C_fg for the f_a*g_b term of the radial integral. | |
| double | angularCgf (int, int) const override final |
| Angular coefficient C_gf for the g_a*f_b term of the radial integral. | |
| void | updateFrequency (const double omega) override final |
| Updates the operator for a new frequency omega. | |
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 | updateRank (int) |
| 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> | |
| 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 std::unique_ptr< TensorOperator > | clone () const |
| Returns a polymorphic copy of the operator at its current state, or nullptr if cloning is not supported by the derived class. | |
| 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. | |
Additional Inherited Members | |
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 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 |
|
inlinefinaloverridevirtual |
Returns "name" of operator (e.g., 'E1')
Reimplemented from DiracOperator::TensorOperator.
|
inlinefinaloverridevirtual |
Returns units of operator as a string (usually au, may be MHz, etc.)
Reimplemented from DiracOperator::TensorOperator.
|
inlinefinaloverridevirtual |
Angular factor A_ab linking the radial integral to the RME.
All derived operators must implement this. It gives the purely angular part of the reduced matrix element:
\[ \langle a \| \hat{h} \| b \rangle \equiv A_{ab} \cdot R_{ab} \]
where \( R_{ab} \) is returned by radialIntegral(). For most operators, \( A_{ab} \) is a product of Clebsch-Gordan / 3j coefficients and depends only on \( \kappa_a, \kappa_b \) (and the rank \( k \) and parity \( \pi \) of the operator).
Implements DiracOperator::TensorOperator.
|
inlinefinaloverridevirtual |
Angular coefficient C_ff for the f_a*f_b term of the radial integral.
The default radial integral is structured as:
\[ R_{ab} = c\int_0^\infty v(r)\left( C_{ff}\,f_a f_b + C_{fg}\,f_a g_b + C_{gf}\,g_a f_b + C_{gg}\,g_a g_b \right)\,{\rm d}r \]
These coefficients are often constants, but may depend on \( \kappa_a, \kappa_b \) for operators with angular-momentum-dependent coupling between large and small components (e.g., spin-dependent operators). Override in derived classes as needed.
| kappa_a | kappa \( \kappa_a \) for left-hand-side (bra) |
| kappa_b | kappa \( \kappa_b \) for right-hand-side (ket) |
Reimplemented from DiracOperator::TensorOperator.
|
inlinefinaloverridevirtual |
Angular coefficient C_gg for the g_a*g_b term of the radial integral.
Reimplemented from DiracOperator::TensorOperator.
|
inlinefinaloverridevirtual |
Angular coefficient C_fg for the f_a*g_b term of the radial integral.
Reimplemented from DiracOperator::TensorOperator.
|
inlinefinaloverridevirtual |
Angular coefficient C_gf for the g_a*f_b term of the radial integral.
Reimplemented from DiracOperator::TensorOperator.
|
inlinefinaloverridevirtual |
Updates the operator for a new frequency omega.
Must be overridden by any frequency-dependent operator (i.e., where freqDependantQ() returns true). Called before computing matrix elements whenever the frequency changes.
The base class implementation aborts – if a frequency-dependent operator is constructed but this function is not overridden, it will abort at runtime when called.
| omega | Frequency in atomic units. |
Reimplemented from DiracOperator::TensorOperator.