-
Notifications
You must be signed in to change notification settings - Fork 0
/
wigner.pyx
63 lines (53 loc) · 1.95 KB
/
wigner.pyx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
cdef extern from "math.h":
double exp(double)
double log(double)
double sqrt(double)
cdef class wigner:
#cdef double fact[10000]
def __cinit__(self):
cdef int i
self.fact[0] = 0.0
self.fact[1] = 0.0
for i in range(2,10000):
self.fact[i] = log(i) + self.fact[i-1]
cpdef double w3j(self,int l1,int l2,int l3):
# Calculates the wigner-3j symbol. Please see eq. 15 of
# http://mathworld.wolfram.com/Wigner3j-Symbol.html for more
# details.
cdef int L, z1, z2, z3, z4, z5, z6, z7, z8
L = l1 + l2 + l3
z1 = L - 2*l1
z2 = L - 2*l2
z3 = L - 2*l3
z4 = L/2
z5 = z4 - l1
z6 = z4 - l2
z7 = z4 - l3
z8 = L+1
#if z1 < 0 or z2 < 0 or z3 < 0 or z5 < 0 or z6 < 0 or z7 < 0 or L%2 > 0:
# return 0.0
return (-1)**(L/2)*exp(0.5*(self.fact[z1] + self.fact[z2] \
+ self.fact[z3] - self.fact[z8] + 2.0*(self.fact[z4] \
- self.fact[z5] - self.fact[z6] - self.fact[z7])))
cpdef double w3jsq(self,int l1,int l2,int l3):
# Calculates the wigner-3j symbol. Please see eq. 15 of
# http://mathworld.wolfram.com/Wigner3j-Symbol.html for more
# details.
cdef int L, z1, z2, z3, z4, z5, z6, z7, z8
L = l1 + l2 + l3
z1 = L - 2*l1
z2 = L - 2*l2
z3 = L - 2*l3
z4 = L/2
z5 = z4 - l1
z6 = z4 - l2
z7 = z4 - l3
z8 = L+1
#if z1 < 0 or z2 < 0 or z3 < 0 or z5 < 0 or z6 < 0 or z7 < 0 or L%2 > 0:
# return 0.0
return exp(self.fact[z1] + self.fact[z2] \
+ self.fact[z3] - self.fact[z8] + 2.0*(self.fact[z4] \
- self.fact[z5] - self.fact[z6] - self.fact[z7]))
cpdef double F(self,int l1, int l2, int l):
return sqrt((2.0*l1+1)*(2.0*l2+1)*(2.0*l+1)*0.07957747154) \
*self.w3j(l1,l2,l)