A C++ ensemble of functions to compute the Wigner 3j- and 6j- symbols. It reimplements the algorithm designed by Schulten and Gordon in C++, but also contains the original Fortran implementation. It can act either as a complete C++ replacement to the original Fortran implementation, or a C++ interface to them. See the API docs for details. It can either compute an array of Wigner 3j or 6j symbols, or a single coefficient. It also computes the Clebsch-Gordan coefficients.
Note that there is a third party Python wrapper available on GitHub.
This library uses CMake to help the build process. First, download the source code. It is recommended to create a separate directory for building, i.e.
mkdir build/
cd build/
Then, run
cmake .. && make && sudo make install
By default, the library is installed to /usr/lib/
and the include files are in /usr/include/
.
To install to another directory, say /usr/local/
, use the command-line argument
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local && make && sudo make install
We list the user-facing functions that compute the Wigner symbols. The functions are
behind the namespace WignerSymbols
. Both the C++ implementation (my own) and the
original Fortran implementation (by Schulten and Gordon) are provided by this package.
In my own tests, I had found that the original Fortran implementation provided only
single
precision. This might be compiler-dependent, so you might have better luck.
The Fortran version is also somewhat faster (10% faster, approximately). In any case,
this program provides either a complete C++ replacement, or a C++ interface to the
evaluation of Wigner symbols.
std::vector<double> wigner3j(double l2, double l3, double m1, double m2, double m3)
Computes Wigner 3j symbols with all possible values ofl1
. Returns anstd::vector<double>
with the coefficients sorted by increasing values ofl1
.double wigner3j(double l1, double l2, double l3, double m1, double m2, double m3)
Computes a specific Wigner 3j symbol.double clebschGordan(double l1, double l2, double l3, double m1, double m2, double m3)
Computes a specific Clebch-Gordan coeffcient.std::vector<double> wigner6j(double l2, double l3, double l4, double l5, double l6)
Computes Wigner 6j symbols with all possible values ofl1
. Returns anstd::vector<double>
with the coefficients sorted by increasing values ofl1
.double wigner6j(double l1, double l2, double l3, double l4, double l5, double l6)
Computes a specific Wigner 6j symbol.
std::vector<double> wigner3j_f(double l2, double l3, double m1, double m2, double m3)
Computes Wigner 3j symbols with all possible values ofl1
.double wigner3j_f(double l1, double l2, double l3, double m1, double m2, double m3)
Computes a specific Wigner 3j symbol.double clebschGordan_f(double l1, double l2, double l3, double m1, double m2, double m3)
Computes a specific Clebch-Gordan coeffcient.std::vector<double> wigner6j_f(double l2, double l3, double l4, double l5, double l6)
Computes Wigner 6j symbols with all possible values ofl1
.double wigner6j_f(double l1, double l2, double l3, double l4, double l5, double l6)
Computes a specific Wigner 6j symbol.
- K. Schulten and R. G. Gordon, Recursive evaluation of 3j and 6j coefficients, Comput. Phys. Commun. 11, 269–278 (1976). DOI: 10.1016/0010-4655(76)90058-8
- K. Schulten, Exact recursive evaluation of 3j- and 6j-coefficients for quantum-mechanical coupling of angular momenta, J. Math. Phys. 16, 1961 (1975). DOI: 10.1063/1.522426.
- J. Luscombe and M. Luban, Simplified recursive algorithm for Wigner 3j and 6j symbols, Phys. Rev. E 57, 7274–7277 (1998). DOI: 10.1103/PhysRevE.57.7274.