ampsci
High-precision calculations for one- and two-valence atomic systems
Angular::CkTable

ok

Lookup table for Ck_ab reduced matrix elements and the special 3j symbol (j_a, j_b, k; -1/2, 1/2, 0).

Pre-computes and caches the angular symbols needed for radial matrix-element evaluation. Three quantities are stored for each triple \((k, \kappa_a, \kappa_b)\):

  • The reduced matrix element of the normalised spherical harmonic:

    \[ C^k_{ab} \equiv \redmatel{\kappa_a}{C^k}{\kappa_b} = (-1)^{j_a+\frac{1}{2}}\sqrt{[j_a][j_b]} \threej{j_a}{j_b}{k}{-\tfrac{1}{2}}{\tfrac{1}{2}}{0} \,\pi(l_a+l_b+k), \]

    where \([x]\equiv 2x+1\) and \(\pi\) encodes the parity selection rule. \(C^k_{ab}\) is antisymmetric under interchange up to a phase.
  • The symmetrised (tilde) variant:

    \[ \widetilde C^k_{ab} = (-1)^{j_a+\frac{1}{2}} C^k_{ab}, \]

    which is fully symmetric: \(\widetilde C^k_{ab} = \widetilde C^k_{ba}\).
  • The underlying special 3j symbol:

    \[ \threej{j_a}{j_b}{k}{-\tfrac{1}{2}}{\tfrac{1}{2}}{0}. \]

All table lookups take \(k\) and the Dirac quantum numbers \(\kappa_a, \kappa_b\) as input.

Note
  • Table is filled up to a maximum \(2j\) at construction; call fill() to extend it afterwards.
  • All symbols with \(2j \le \) max_tj() and \(k \le \) max_k() are guaranteed to be present; there are no gaps.
  • Non-mutable accessors are thread-safe. The _mutable variants extend the table on demand but are not thread-safe.
Warning
Calling a non-mutable accessor with out-of-range indices is undefined behaviour; check against max_tj() and max_k() first.

#include <CkTable.hpp>

Public Member Functions

 CkTable (const int in_max_twoj=0)
 Constructs the table, pre-filling all symbols up to in_max_twoj.
 
void fill (const int in_max_twoj)
 Extends the lookup table to cover all symbols up to in_max_twoj.
 
double get_Ckab_mutable (int k, int ka, int kb)
 Returns Ck_ab; extends table if needed. Not thread-safe.
 
double get_tildeCkab_mutable (int k, int ka, int kb)
 Returns tilde-Ck_ab; extends table if needed. Not thread-safe.
 
double get_3jkab_mutable (int k, int ka, int kb)
 Returns 3j(j_a,j_b,k; -1/2,1/2,0); extends table if needed. Not thread-safe.
 
double get_Ckab (int k, int ka, int kb) const
 Returns Ck_ab. Undefined behaviour if indices exceed max_tj() or max_k().
 
double get_tildeCkab (int k, int ka, int kb) const
 Returns tilde-Ck_ab. Undefined behaviour if indices exceed max_tj() or max_k().
 
double get_3jkab (int k, int ka, int kb) const
 Returns 3j(j_a,j_b,k; -1/2,1/2,0). Undefined behaviour if indices exceed max_tj() or max_k().
 
double operator() (int k, int ka, int kb) const
 Equivalent to get_Ckab(k, ka, kb).
 
double get_Lambdakab (int k, int ka, int kb) const
 Returns Lambda^k_ab := 3j(j_a,j_b,k; -1/2,1/2,0)^2 * parity(l_a+l_b+k).
 
int max_tj () const
 Maximum value of 2j currently stored in the table.
 
int max_k () const
 Maximum value of k currently stored in the table.
 

Constructor & Destructor Documentation

◆ CkTable()

Angular::CkTable::CkTable ( const int  in_max_twoj = 0)
inline

Constructs the table, pre-filling all symbols up to in_max_twoj.

Calls fill() internally; passing zero (the default) creates an empty table that can be extended later with fill() or the mutable accessors.

Parameters
in_max_twojMaximum value of \(2j\) to pre-compute.

Member Function Documentation

◆ fill()

void Angular::CkTable::fill ( const int  in_max_twoj)

Extends the lookup table to cover all symbols up to in_max_twoj.

Called automatically on construction. Only needed explicitly when the required \(2j\) grows beyond the original maximum.

Parameters
in_max_twojNew maximum value of \(2j\); no-op if already met.

◆ get_Ckab_mutable()

double Angular::CkTable::get_Ckab_mutable ( int  k,
int  ka,
int  kb 
)

Returns Ck_ab; extends table if needed. Not thread-safe.

◆ get_tildeCkab_mutable()

double Angular::CkTable::get_tildeCkab_mutable ( int  k,
int  ka,
int  kb 
)

Returns tilde-Ck_ab; extends table if needed. Not thread-safe.

◆ get_3jkab_mutable()

double Angular::CkTable::get_3jkab_mutable ( int  k,
int  ka,
int  kb 
)

Returns 3j(j_a,j_b,k; -1/2,1/2,0); extends table if needed. Not thread-safe.

◆ get_Ckab()

double Angular::CkTable::get_Ckab ( int  k,
int  ka,
int  kb 
) const

Returns Ck_ab. Undefined behaviour if indices exceed max_tj() or max_k().

◆ get_tildeCkab()

double Angular::CkTable::get_tildeCkab ( int  k,
int  ka,
int  kb 
) const

Returns tilde-Ck_ab. Undefined behaviour if indices exceed max_tj() or max_k().

◆ get_3jkab()

double Angular::CkTable::get_3jkab ( int  k,
int  ka,
int  kb 
) const

Returns 3j(j_a,j_b,k; -1/2,1/2,0). Undefined behaviour if indices exceed max_tj() or max_k().

◆ operator()()

double Angular::CkTable::operator() ( int  k,
int  ka,
int  kb 
) const
inline

Equivalent to get_Ckab(k, ka, kb).

◆ get_Lambdakab()

double Angular::CkTable::get_Lambdakab ( int  k,
int  ka,
int  kb 
) const

Returns Lambda^k_ab := 3j(j_a,j_b,k; -1/2,1/2,0)^2 * parity(l_a+l_b+k).

This is the angular factor that appears in the Coulomb interaction after angular reduction, and equals \(\left(C^k_{ab}\right)^2 / ([j_a][j_b])\) up to a phase.

◆ max_tj()

int Angular::CkTable::max_tj ( ) const
inline

Maximum value of 2j currently stored in the table.

◆ max_k()

int Angular::CkTable::max_k ( ) const
inline

Maximum value of k currently stored in the table.


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