test_cg.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. from sympy.concrete.summations import Sum
  2. from sympy.core.numbers import Rational
  3. from sympy.core.singleton import S
  4. from sympy.core.symbol import symbols
  5. from sympy.functions.elementary.miscellaneous import sqrt
  6. from sympy.physics.quantum.cg import Wigner3j, Wigner6j, Wigner9j, CG, cg_simp
  7. from sympy.functions.special.tensor_functions import KroneckerDelta
  8. def test_cg_simp_add():
  9. j, m1, m1p, m2, m2p = symbols('j m1 m1p m2 m2p')
  10. # Test Varshalovich 8.7.1 Eq 1
  11. a = CG(S.Half, S.Half, 0, 0, S.Half, S.Half)
  12. b = CG(S.Half, Rational(-1, 2), 0, 0, S.Half, Rational(-1, 2))
  13. c = CG(1, 1, 0, 0, 1, 1)
  14. d = CG(1, 0, 0, 0, 1, 0)
  15. e = CG(1, -1, 0, 0, 1, -1)
  16. assert cg_simp(a + b) == 2
  17. assert cg_simp(c + d + e) == 3
  18. assert cg_simp(a + b + c + d + e) == 5
  19. assert cg_simp(a + b + c) == 2 + c
  20. assert cg_simp(2*a + b) == 2 + a
  21. assert cg_simp(2*c + d + e) == 3 + c
  22. assert cg_simp(5*a + 5*b) == 10
  23. assert cg_simp(5*c + 5*d + 5*e) == 15
  24. assert cg_simp(-a - b) == -2
  25. assert cg_simp(-c - d - e) == -3
  26. assert cg_simp(-6*a - 6*b) == -12
  27. assert cg_simp(-4*c - 4*d - 4*e) == -12
  28. a = CG(S.Half, S.Half, j, 0, S.Half, S.Half)
  29. b = CG(S.Half, Rational(-1, 2), j, 0, S.Half, Rational(-1, 2))
  30. c = CG(1, 1, j, 0, 1, 1)
  31. d = CG(1, 0, j, 0, 1, 0)
  32. e = CG(1, -1, j, 0, 1, -1)
  33. assert cg_simp(a + b) == 2*KroneckerDelta(j, 0)
  34. assert cg_simp(c + d + e) == 3*KroneckerDelta(j, 0)
  35. assert cg_simp(a + b + c + d + e) == 5*KroneckerDelta(j, 0)
  36. assert cg_simp(a + b + c) == 2*KroneckerDelta(j, 0) + c
  37. assert cg_simp(2*a + b) == 2*KroneckerDelta(j, 0) + a
  38. assert cg_simp(2*c + d + e) == 3*KroneckerDelta(j, 0) + c
  39. assert cg_simp(5*a + 5*b) == 10*KroneckerDelta(j, 0)
  40. assert cg_simp(5*c + 5*d + 5*e) == 15*KroneckerDelta(j, 0)
  41. assert cg_simp(-a - b) == -2*KroneckerDelta(j, 0)
  42. assert cg_simp(-c - d - e) == -3*KroneckerDelta(j, 0)
  43. assert cg_simp(-6*a - 6*b) == -12*KroneckerDelta(j, 0)
  44. assert cg_simp(-4*c - 4*d - 4*e) == -12*KroneckerDelta(j, 0)
  45. # Test Varshalovich 8.7.1 Eq 2
  46. a = CG(S.Half, S.Half, S.Half, Rational(-1, 2), 0, 0)
  47. b = CG(S.Half, Rational(-1, 2), S.Half, S.Half, 0, 0)
  48. c = CG(1, 1, 1, -1, 0, 0)
  49. d = CG(1, 0, 1, 0, 0, 0)
  50. e = CG(1, -1, 1, 1, 0, 0)
  51. assert cg_simp(a - b) == sqrt(2)
  52. assert cg_simp(c - d + e) == sqrt(3)
  53. assert cg_simp(a - b + c - d + e) == sqrt(2) + sqrt(3)
  54. assert cg_simp(a - b + c) == sqrt(2) + c
  55. assert cg_simp(2*a - b) == sqrt(2) + a
  56. assert cg_simp(2*c - d + e) == sqrt(3) + c
  57. assert cg_simp(5*a - 5*b) == 5*sqrt(2)
  58. assert cg_simp(5*c - 5*d + 5*e) == 5*sqrt(3)
  59. assert cg_simp(-a + b) == -sqrt(2)
  60. assert cg_simp(-c + d - e) == -sqrt(3)
  61. assert cg_simp(-6*a + 6*b) == -6*sqrt(2)
  62. assert cg_simp(-4*c + 4*d - 4*e) == -4*sqrt(3)
  63. a = CG(S.Half, S.Half, S.Half, Rational(-1, 2), j, 0)
  64. b = CG(S.Half, Rational(-1, 2), S.Half, S.Half, j, 0)
  65. c = CG(1, 1, 1, -1, j, 0)
  66. d = CG(1, 0, 1, 0, j, 0)
  67. e = CG(1, -1, 1, 1, j, 0)
  68. assert cg_simp(a - b) == sqrt(2)*KroneckerDelta(j, 0)
  69. assert cg_simp(c - d + e) == sqrt(3)*KroneckerDelta(j, 0)
  70. assert cg_simp(a - b + c - d + e) == sqrt(
  71. 2)*KroneckerDelta(j, 0) + sqrt(3)*KroneckerDelta(j, 0)
  72. assert cg_simp(a - b + c) == sqrt(2)*KroneckerDelta(j, 0) + c
  73. assert cg_simp(2*a - b) == sqrt(2)*KroneckerDelta(j, 0) + a
  74. assert cg_simp(2*c - d + e) == sqrt(3)*KroneckerDelta(j, 0) + c
  75. assert cg_simp(5*a - 5*b) == 5*sqrt(2)*KroneckerDelta(j, 0)
  76. assert cg_simp(5*c - 5*d + 5*e) == 5*sqrt(3)*KroneckerDelta(j, 0)
  77. assert cg_simp(-a + b) == -sqrt(2)*KroneckerDelta(j, 0)
  78. assert cg_simp(-c + d - e) == -sqrt(3)*KroneckerDelta(j, 0)
  79. assert cg_simp(-6*a + 6*b) == -6*sqrt(2)*KroneckerDelta(j, 0)
  80. assert cg_simp(-4*c + 4*d - 4*e) == -4*sqrt(3)*KroneckerDelta(j, 0)
  81. # Test Varshalovich 8.7.2 Eq 9
  82. # alpha=alphap,beta=betap case
  83. # numerical
  84. a = CG(S.Half, S.Half, S.Half, Rational(-1, 2), 1, 0)**2
  85. b = CG(S.Half, S.Half, S.Half, Rational(-1, 2), 0, 0)**2
  86. c = CG(1, 0, 1, 1, 1, 1)**2
  87. d = CG(1, 0, 1, 1, 2, 1)**2
  88. assert cg_simp(a + b) == 1
  89. assert cg_simp(c + d) == 1
  90. assert cg_simp(a + b + c + d) == 2
  91. assert cg_simp(4*a + 4*b) == 4
  92. assert cg_simp(4*c + 4*d) == 4
  93. assert cg_simp(5*a + 3*b) == 3 + 2*a
  94. assert cg_simp(5*c + 3*d) == 3 + 2*c
  95. assert cg_simp(-a - b) == -1
  96. assert cg_simp(-c - d) == -1
  97. # symbolic
  98. a = CG(S.Half, m1, S.Half, m2, 1, 1)**2
  99. b = CG(S.Half, m1, S.Half, m2, 1, 0)**2
  100. c = CG(S.Half, m1, S.Half, m2, 1, -1)**2
  101. d = CG(S.Half, m1, S.Half, m2, 0, 0)**2
  102. assert cg_simp(a + b + c + d) == 1
  103. assert cg_simp(4*a + 4*b + 4*c + 4*d) == 4
  104. assert cg_simp(3*a + 5*b + 3*c + 4*d) == 3 + 2*b + d
  105. assert cg_simp(-a - b - c - d) == -1
  106. a = CG(1, m1, 1, m2, 2, 2)**2
  107. b = CG(1, m1, 1, m2, 2, 1)**2
  108. c = CG(1, m1, 1, m2, 2, 0)**2
  109. d = CG(1, m1, 1, m2, 2, -1)**2
  110. e = CG(1, m1, 1, m2, 2, -2)**2
  111. f = CG(1, m1, 1, m2, 1, 1)**2
  112. g = CG(1, m1, 1, m2, 1, 0)**2
  113. h = CG(1, m1, 1, m2, 1, -1)**2
  114. i = CG(1, m1, 1, m2, 0, 0)**2
  115. assert cg_simp(a + b + c + d + e + f + g + h + i) == 1
  116. assert cg_simp(4*(a + b + c + d + e + f + g + h + i)) == 4
  117. assert cg_simp(a + b + 2*c + d + 4*e + f + g + h + i) == 1 + c + 3*e
  118. assert cg_simp(-a - b - c - d - e - f - g - h - i) == -1
  119. # alpha!=alphap or beta!=betap case
  120. # numerical
  121. a = CG(S.Half, S(
  122. 1)/2, S.Half, Rational(-1, 2), 1, 0)*CG(S.Half, Rational(-1, 2), S.Half, S.Half, 1, 0)
  123. b = CG(S.Half, S(
  124. 1)/2, S.Half, Rational(-1, 2), 0, 0)*CG(S.Half, Rational(-1, 2), S.Half, S.Half, 0, 0)
  125. c = CG(1, 1, 1, 0, 2, 1)*CG(1, 0, 1, 1, 2, 1)
  126. d = CG(1, 1, 1, 0, 1, 1)*CG(1, 0, 1, 1, 1, 1)
  127. assert cg_simp(a + b) == 0
  128. assert cg_simp(c + d) == 0
  129. # symbolic
  130. a = CG(S.Half, m1, S.Half, m2, 1, 1)*CG(S.Half, m1p, S.Half, m2p, 1, 1)
  131. b = CG(S.Half, m1, S.Half, m2, 1, 0)*CG(S.Half, m1p, S.Half, m2p, 1, 0)
  132. c = CG(S.Half, m1, S.Half, m2, 1, -1)*CG(S.Half, m1p, S.Half, m2p, 1, -1)
  133. d = CG(S.Half, m1, S.Half, m2, 0, 0)*CG(S.Half, m1p, S.Half, m2p, 0, 0)
  134. assert cg_simp(a + b + c + d) == KroneckerDelta(m1, m1p)*KroneckerDelta(m2, m2p)
  135. a = CG(1, m1, 1, m2, 2, 2)*CG(1, m1p, 1, m2p, 2, 2)
  136. b = CG(1, m1, 1, m2, 2, 1)*CG(1, m1p, 1, m2p, 2, 1)
  137. c = CG(1, m1, 1, m2, 2, 0)*CG(1, m1p, 1, m2p, 2, 0)
  138. d = CG(1, m1, 1, m2, 2, -1)*CG(1, m1p, 1, m2p, 2, -1)
  139. e = CG(1, m1, 1, m2, 2, -2)*CG(1, m1p, 1, m2p, 2, -2)
  140. f = CG(1, m1, 1, m2, 1, 1)*CG(1, m1p, 1, m2p, 1, 1)
  141. g = CG(1, m1, 1, m2, 1, 0)*CG(1, m1p, 1, m2p, 1, 0)
  142. h = CG(1, m1, 1, m2, 1, -1)*CG(1, m1p, 1, m2p, 1, -1)
  143. i = CG(1, m1, 1, m2, 0, 0)*CG(1, m1p, 1, m2p, 0, 0)
  144. assert cg_simp(
  145. a + b + c + d + e + f + g + h + i) == KroneckerDelta(m1, m1p)*KroneckerDelta(m2, m2p)
  146. def test_cg_simp_sum():
  147. x, a, b, c, cp, alpha, beta, gamma, gammap = symbols(
  148. 'x a b c cp alpha beta gamma gammap')
  149. # Varshalovich 8.7.1 Eq 1
  150. assert cg_simp(x * Sum(CG(a, alpha, b, 0, a, alpha), (alpha, -a, a)
  151. )) == x*(2*a + 1)*KroneckerDelta(b, 0)
  152. assert cg_simp(x * Sum(CG(a, alpha, b, 0, a, alpha), (alpha, -a, a)) + CG(1, 0, 1, 0, 1, 0)) == x*(2*a + 1)*KroneckerDelta(b, 0) + CG(1, 0, 1, 0, 1, 0)
  153. assert cg_simp(2 * Sum(CG(1, alpha, 0, 0, 1, alpha), (alpha, -1, 1))) == 6
  154. # Varshalovich 8.7.1 Eq 2
  155. assert cg_simp(x*Sum((-1)**(a - alpha) * CG(a, alpha, a, -alpha, c,
  156. 0), (alpha, -a, a))) == x*sqrt(2*a + 1)*KroneckerDelta(c, 0)
  157. assert cg_simp(3*Sum((-1)**(2 - alpha) * CG(
  158. 2, alpha, 2, -alpha, 0, 0), (alpha, -2, 2))) == 3*sqrt(5)
  159. # Varshalovich 8.7.2 Eq 4
  160. assert cg_simp(Sum(CG(a, alpha, b, beta, c, gamma)*CG(a, alpha, b, beta, cp, gammap), (alpha, -a, a), (beta, -b, b))) == KroneckerDelta(c, cp)*KroneckerDelta(gamma, gammap)
  161. assert cg_simp(Sum(CG(a, alpha, b, beta, c, gamma)*CG(a, alpha, b, beta, c, gammap), (alpha, -a, a), (beta, -b, b))) == KroneckerDelta(gamma, gammap)
  162. assert cg_simp(Sum(CG(a, alpha, b, beta, c, gamma)*CG(a, alpha, b, beta, cp, gamma), (alpha, -a, a), (beta, -b, b))) == KroneckerDelta(c, cp)
  163. assert cg_simp(Sum(CG(
  164. a, alpha, b, beta, c, gamma)**2, (alpha, -a, a), (beta, -b, b))) == 1
  165. assert cg_simp(Sum(CG(2, alpha, 1, beta, 2, gamma)*CG(2, alpha, 1, beta, 2, gammap), (alpha, -2, 2), (beta, -1, 1))) == KroneckerDelta(gamma, gammap)
  166. def test_doit():
  167. assert Wigner3j(S.Half, Rational(-1, 2), S.Half, S.Half, 0, 0).doit() == -sqrt(2)/2
  168. assert Wigner6j(1, 2, 3, 2, 1, 2).doit() == sqrt(21)/105
  169. assert Wigner6j(3, 1, 2, 2, 2, 1).doit() == sqrt(21) / 105
  170. assert Wigner9j(
  171. 2, 1, 1, Rational(3, 2), S.Half, 1, S.Half, S.Half, 0).doit() == sqrt(2)/12
  172. assert CG(S.Half, S.Half, S.Half, Rational(-1, 2), 1, 0).doit() == sqrt(2)/2