Wigner Symbols¶
Wigner, Clebsch-Gordan, Racah, and Gaunt coefficients
Collection of functions for calculating Wigner 3j, 6j, 9j, Clebsch-Gordan, Racah as well as Gaunt coefficients exactly, all evaluating to a rational number times the square root of a rational number [Rasch03].
Please see the description of the individual functions for further details and examples.
References¶
[Rasch03] | (1, 2, 3, 4, 5, 6) J. Rasch and A. C. H. Yu, ‘Efficient Storage Scheme for Pre-calculated Wigner 3j, 6j and Gaunt Coefficients’, SIAM J. Sci. Comput. Volume 25, Issue 4, pp. 1416-1428 (2003) |
Credits and Copyright¶
This code was taken from Sage with the permission of all authors:
https://groups.google.com/forum/#!topic/sage-devel/M4NZdu-7O38
AUTHORS:
- Jens Rasch (2009-03-24): initial version for Sage
- Jens Rasch (2009-05-31): updated to sage-4.0
Copyright (C) 2008 Jens Rasch <jyr2000@gmail.com>
-
sympy.physics.wigner.
clebsch_gordan
(j_1, j_2, j_3, m_1, m_2, m_3)[source]¶ Calculates the Clebsch-Gordan coefficient \(\langle j_1 m_1 \; j_2 m_2 | j_3 m_3 \rangle\).
The reference for this function is [Edmonds74].
INPUT:
j_1
,j_2
,j_3
,m_1
,m_2
,m_3
- integer or half integer
OUTPUT:
Rational number times the square root of a rational number.
EXAMPLES:
>>> from sympy import S >>> from sympy.physics.wigner import clebsch_gordan >>> clebsch_gordan(S(3)/2, S(1)/2, 2, S(3)/2, S(1)/2, 2) 1 >>> clebsch_gordan(S(3)/2, S(1)/2, 1, S(3)/2, -S(1)/2, 1) sqrt(3)/2 >>> clebsch_gordan(S(3)/2, S(1)/2, 1, -S(1)/2, S(1)/2, 0) -sqrt(2)/2
NOTES:
The Clebsch-Gordan coefficient will be evaluated via its relation to Wigner 3j symbols:
\[\langle j_1 m_1 \; j_2 m_2 | j_3 m_3 \rangle =(-1)^{j_1-j_2+m_3} \sqrt{2j_3+1} \operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,-m_3)\]See also the documentation on Wigner 3j symbols which exhibit much higher symmetry relations than the Clebsch-Gordan coefficient.
AUTHORS:
- Jens Rasch (2009-03-24): initial version
-
sympy.physics.wigner.
dot_rot_grad_Ynm
(j, p, l, m, theta, phi)[source]¶ Returns dot product of rotational gradients of spherical harmonics.
This function returns the right hand side of the following expression:
\[\vec{R}Y{_j^{p}} \cdot \vec{R}Y{_l^{m}} = (-1)^{m+p} \sum\limits_{k=|l-j|}^{l+j}Y{_k^{m+p}} * \alpha_{l,m,j,p,k} * \frac{1}{2} (k^2-j^2-l^2+k-j-l)\]Arguments
j, p, l, m .... indices in spherical harmonics (expressions or integers) theta, phi .... angle arguments in spherical harmonics
Example
>>> from sympy import symbols >>> from sympy.physics.wigner import dot_rot_grad_Ynm >>> theta, phi = symbols("theta phi") >>> dot_rot_grad_Ynm(3, 2, 2, 0, theta, phi).doit() 3*sqrt(55)*Ynm(5, 2, theta, phi)/(11*sqrt(pi))
-
sympy.physics.wigner.
gaunt
(l_1, l_2, l_3, m_1, m_2, m_3, prec=None)[source]¶ Calculate the Gaunt coefficient.
The Gaunt coefficient is defined as the integral over three spherical harmonics:
\[\begin{split}\begin{aligned} \operatorname{Gaunt}(l_1,l_2,l_3,m_1,m_2,m_3) &=\int Y_{l_1,m_1}(\Omega) Y_{l_2,m_2}(\Omega) Y_{l_3,m_3}(\Omega) \,d\Omega \\ &=\sqrt{\frac{(2l_1+1)(2l_2+1)(2l_3+1)}{4\pi}} \operatorname{Wigner3j}(l_1,l_2,l_3,0,0,0) \operatorname{Wigner3j}(l_1,l_2,l_3,m_1,m_2,m_3) \end{aligned}\end{split}\]INPUT:
l_1
,l_2
,l_3
,m_1
,m_2
,m_3
- integerprec
- precision, default:None
. Providing a precision can drastically speed up the calculation.
OUTPUT:
Rational number times the square root of a rational number (if
prec=None
), or real number if a precision is given.Examples
>>> from sympy.physics.wigner import gaunt >>> gaunt(1,0,1,1,0,-1) -1/(2*sqrt(pi)) >>> gaunt(1000,1000,1200,9,3,-12).n(64) 0.00689500421922113448...
It is an error to use non-integer values for \(l\) and \(m\):
sage: gaunt(1.2,0,1.2,0,0,0) Traceback (most recent call last): ... ValueError: l values must be integer sage: gaunt(1,0,1,1.1,0,-1.1) Traceback (most recent call last): ... ValueError: m values must be integer
NOTES:
The Gaunt coefficient obeys the following symmetry rules:
invariant under any permutation of the columns
\[\begin{split}\begin{aligned} Y(l_1,l_2,l_3,m_1,m_2,m_3) &=Y(l_3,l_1,l_2,m_3,m_1,m_2) \\ &=Y(l_2,l_3,l_1,m_2,m_3,m_1) \\ &=Y(l_3,l_2,l_1,m_3,m_2,m_1) \\ &=Y(l_1,l_3,l_2,m_1,m_3,m_2) \\ &=Y(l_2,l_1,l_3,m_2,m_1,m_3) \end{aligned}\end{split}\]invariant under space inflection, i.e.
\[Y(l_1,l_2,l_3,m_1,m_2,m_3) =Y(l_1,l_2,l_3,-m_1,-m_2,-m_3)\]symmetric with respect to the 72 Regge symmetries as inherited for the \(3j\) symbols [Regge58]
zero for \(l_1\), \(l_2\), \(l_3\) not fulfilling triangle relation
zero for violating any one of the conditions: \(l_1 \ge |m_1|\), \(l_2 \ge |m_2|\), \(l_3 \ge |m_3|\)
non-zero only for an even sum of the \(l_i\), i.e. \(L = l_1 + l_2 + l_3 = 2n\) for \(n\) in \(\mathbb{N}\)
ALGORITHM:
This function uses the algorithm of [Liberatodebrito82] to calculate the value of the Gaunt coefficient exactly. Note that the formula contains alternating sums over large factorials and is therefore unsuitable for finite precision arithmetic and only useful for a computer algebra system [Rasch03].
REFERENCES:
[Liberatodebrito82] ‘FORTRAN program for the integral of three spherical harmonics’, A. Liberato de Brito, Comput. Phys. Commun., Volume 25, pp. 81-85 (1982) AUTHORS:
- Jens Rasch (2009-03-24): initial version for Sage
-
sympy.physics.wigner.
racah
(aa, bb, cc, dd, ee, ff, prec=None)[source]¶ Calculate the Racah symbol \(W(a,b,c,d;e,f)\).
INPUT:
a
, ...,f
- integer or half integerprec
- precision, default:None
. Providing a precision can drastically speed up the calculation.
OUTPUT:
Rational number times the square root of a rational number (if
prec=None
), or real number if a precision is given.Examples
>>> from sympy.physics.wigner import racah >>> racah(3,3,3,3,3,3) -1/14
NOTES:
The Racah symbol is related to the Wigner 6j symbol:
\[\operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) =(-1)^{j_1+j_2+j_4+j_5} W(j_1,j_2,j_5,j_4,j_3,j_6)\]Please see the 6j symbol for its much richer symmetries and for additional properties.
ALGORITHM:
This function uses the algorithm of [Edmonds74] to calculate the value of the 6j symbol exactly. Note that the formula contains alternating sums over large factorials and is therefore unsuitable for finite precision arithmetic and only useful for a computer algebra system [Rasch03].
AUTHORS:
- Jens Rasch (2009-03-24): initial version
-
sympy.physics.wigner.
wigner_3j
(j_1, j_2, j_3, m_1, m_2, m_3)[source]¶ Calculate the Wigner 3j symbol \(\operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3)\).
INPUT:
j_1
,j_2
,j_3
,m_1
,m_2
,m_3
- integer or half integer
OUTPUT:
Rational number times the square root of a rational number.
Examples
>>> from sympy.physics.wigner import wigner_3j >>> wigner_3j(2, 6, 4, 0, 0, 0) sqrt(715)/143 >>> wigner_3j(2, 6, 4, 0, 0, 1) 0
It is an error to have arguments that are not integer or half integer values:
sage: wigner_3j(2.1, 6, 4, 0, 0, 0) Traceback (most recent call last): ... ValueError: j values must be integer or half integer sage: wigner_3j(2, 6, 4, 1, 0, -1.1) Traceback (most recent call last): ... ValueError: m values must be integer or half integer
NOTES:
The Wigner 3j symbol obeys the following symmetry rules:
invariant under any permutation of the columns (with the exception of a sign change where \(J:=j_1+j_2+j_3\)):
\[\begin{split}\begin{aligned} \operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3) &=\operatorname{Wigner3j}(j_3,j_1,j_2,m_3,m_1,m_2) \\ &=\operatorname{Wigner3j}(j_2,j_3,j_1,m_2,m_3,m_1) \\ &=(-1)^J \operatorname{Wigner3j}(j_3,j_2,j_1,m_3,m_2,m_1) \\ &=(-1)^J \operatorname{Wigner3j}(j_1,j_3,j_2,m_1,m_3,m_2) \\ &=(-1)^J \operatorname{Wigner3j}(j_2,j_1,j_3,m_2,m_1,m_3) \end{aligned}\end{split}\]invariant under space inflection, i.e.
\[\operatorname{Wigner3j}(j_1,j_2,j_3,m_1,m_2,m_3) =(-1)^J \operatorname{Wigner3j}(j_1,j_2,j_3,-m_1,-m_2,-m_3)\]symmetric with respect to the 72 additional symmetries based on the work by [Regge58]
zero for \(j_1\), \(j_2\), \(j_3\) not fulfilling triangle relation
zero for \(m_1 + m_2 + m_3 \neq 0\)
zero for violating any one of the conditions \(j_1 \ge |m_1|\), \(j_2 \ge |m_2|\), \(j_3 \ge |m_3|\)
ALGORITHM:
This function uses the algorithm of [Edmonds74] to calculate the value of the 3j symbol exactly. Note that the formula contains alternating sums over large factorials and is therefore unsuitable for finite precision arithmetic and only useful for a computer algebra system [Rasch03].
REFERENCES:
[Regge58] (1, 2) ‘Symmetry Properties of Clebsch-Gordan Coefficients’, T. Regge, Nuovo Cimento, Volume 10, pp. 544 (1958) [Edmonds74] (1, 2, 3, 4, 5) ‘Angular Momentum in Quantum Mechanics’, A. R. Edmonds, Princeton University Press (1974) AUTHORS:
- Jens Rasch (2009-03-24): initial version
-
sympy.physics.wigner.
wigner_6j
(j_1, j_2, j_3, j_4, j_5, j_6, prec=None)[source]¶ Calculate the Wigner 6j symbol \(\operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6)\).
INPUT:
j_1
, ...,j_6
- integer or half integerprec
- precision, default:None
. Providing a precision can drastically speed up the calculation.
OUTPUT:
Rational number times the square root of a rational number (if
prec=None
), or real number if a precision is given.Examples
>>> from sympy.physics.wigner import wigner_6j >>> wigner_6j(3,3,3,3,3,3) -1/14 >>> wigner_6j(5,5,5,5,5,5) 1/52
It is an error to have arguments that are not integer or half integer values or do not fulfill the triangle relation:
sage: wigner_6j(2.5,2.5,2.5,2.5,2.5,2.5) Traceback (most recent call last): ... ValueError: j values must be integer or half integer and fulfill the triangle relation sage: wigner_6j(0.5,0.5,1.1,0.5,0.5,1.1) Traceback (most recent call last): ... ValueError: j values must be integer or half integer and fulfill the triangle relation
NOTES:
The Wigner 6j symbol is related to the Racah symbol but exhibits more symmetries as detailed below.
\[\operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) =(-1)^{j_1+j_2+j_4+j_5} W(j_1,j_2,j_5,j_4,j_3,j_6)\]The Wigner 6j symbol obeys the following symmetry rules:
Wigner 6j symbols are left invariant under any permutation of the columns:
\[\begin{split}\begin{aligned} \operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) &=\operatorname{Wigner6j}(j_3,j_1,j_2,j_6,j_4,j_5) \\ &=\operatorname{Wigner6j}(j_2,j_3,j_1,j_5,j_6,j_4) \\ &=\operatorname{Wigner6j}(j_3,j_2,j_1,j_6,j_5,j_4) \\ &=\operatorname{Wigner6j}(j_1,j_3,j_2,j_4,j_6,j_5) \\ &=\operatorname{Wigner6j}(j_2,j_1,j_3,j_5,j_4,j_6) \end{aligned}\end{split}\]They are invariant under the exchange of the upper and lower arguments in each of any two columns, i.e.
\[\operatorname{Wigner6j}(j_1,j_2,j_3,j_4,j_5,j_6) =\operatorname{Wigner6j}(j_1,j_5,j_6,j_4,j_2,j_3) =\operatorname{Wigner6j}(j_4,j_2,j_6,j_1,j_5,j_3) =\operatorname{Wigner6j}(j_4,j_5,j_3,j_1,j_2,j_6)\]additional 6 symmetries [Regge59] giving rise to 144 symmetries in total
only non-zero if any triple of \(j\)‘s fulfill a triangle relation
ALGORITHM:
This function uses the algorithm of [Edmonds74] to calculate the value of the 6j symbol exactly. Note that the formula contains alternating sums over large factorials and is therefore unsuitable for finite precision arithmetic and only useful for a computer algebra system [Rasch03].
REFERENCES:
[Regge59] ‘Symmetry Properties of Racah Coefficients’, T. Regge, Nuovo Cimento, Volume 11, pp. 116 (1959)
-
sympy.physics.wigner.
wigner_9j
(j_1, j_2, j_3, j_4, j_5, j_6, j_7, j_8, j_9, prec=None)[source]¶ Calculate the Wigner 9j symbol \(\operatorname{Wigner9j}(j_1,j_2,j_3,j_4,j_5,j_6,j_7,j_8,j_9)\).
INPUT:
j_1
, ...,j_9
- integer or half integerprec
- precision, default:None
. Providing a precision can drastically speed up the calculation.
OUTPUT:
Rational number times the square root of a rational number (if
prec=None
), or real number if a precision is given.Examples
>>> from sympy.physics.wigner import wigner_9j >>> wigner_9j(1,1,1, 1,1,1, 1,1,0 ,prec=64) # ==1/18 0.05555555...
It is an error to have arguments that are not integer or half integer values or do not fulfill the triangle relation:
sage: wigner_9j(0.5,0.5,0.5, 0.5,0.5,0.5, 0.5,0.5,0.5,prec=64) Traceback (most recent call last): ... ValueError: j values must be integer or half integer and fulfill the triangle relation sage: wigner_9j(1,1,1, 0.5,1,1.5, 0.5,1,2.5,prec=64) Traceback (most recent call last): ... ValueError: j values must be integer or half integer and fulfill the triangle relation
ALGORITHM:
This function uses the algorithm of [Edmonds74] to calculate the value of the 3j symbol exactly. Note that the formula contains alternating sums over large factorials and is therefore unsuitable for finite precision arithmetic and only useful for a computer algebra system [Rasch03].