test_tensor_functions.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. from sympy.core.relational import Ne
  2. from sympy.core.symbol import (Dummy, Symbol, symbols)
  3. from sympy.functions.elementary.complexes import (adjoint, conjugate, transpose)
  4. from sympy.functions.elementary.piecewise import Piecewise
  5. from sympy.functions.special.tensor_functions import (Eijk, KroneckerDelta, LeviCivita)
  6. from sympy.physics.secondquant import evaluate_deltas, F
  7. x, y = symbols('x y')
  8. def test_levicivita():
  9. assert Eijk(1, 2, 3) == LeviCivita(1, 2, 3)
  10. assert LeviCivita(1, 2, 3) == 1
  11. assert LeviCivita(int(1), int(2), int(3)) == 1
  12. assert LeviCivita(1, 3, 2) == -1
  13. assert LeviCivita(1, 2, 2) == 0
  14. i, j, k = symbols('i j k')
  15. assert LeviCivita(i, j, k) == LeviCivita(i, j, k, evaluate=False)
  16. assert LeviCivita(i, j, i) == 0
  17. assert LeviCivita(1, i, i) == 0
  18. assert LeviCivita(i, j, k).doit() == (j - i)*(k - i)*(k - j)/2
  19. assert LeviCivita(1, 2, 3, 1) == 0
  20. assert LeviCivita(4, 5, 1, 2, 3) == 1
  21. assert LeviCivita(4, 5, 2, 1, 3) == -1
  22. assert LeviCivita(i, j, k).is_integer is True
  23. assert adjoint(LeviCivita(i, j, k)) == LeviCivita(i, j, k)
  24. assert conjugate(LeviCivita(i, j, k)) == LeviCivita(i, j, k)
  25. assert transpose(LeviCivita(i, j, k)) == LeviCivita(i, j, k)
  26. def test_kronecker_delta():
  27. i, j = symbols('i j')
  28. k = Symbol('k', nonzero=True)
  29. assert KroneckerDelta(1, 1) == 1
  30. assert KroneckerDelta(1, 2) == 0
  31. assert KroneckerDelta(k, 0) == 0
  32. assert KroneckerDelta(x, x) == 1
  33. assert KroneckerDelta(x**2 - y**2, x**2 - y**2) == 1
  34. assert KroneckerDelta(i, i) == 1
  35. assert KroneckerDelta(i, i + 1) == 0
  36. assert KroneckerDelta(0, 0) == 1
  37. assert KroneckerDelta(0, 1) == 0
  38. assert KroneckerDelta(i + k, i) == 0
  39. assert KroneckerDelta(i + k, i + k) == 1
  40. assert KroneckerDelta(i + k, i + 1 + k) == 0
  41. assert KroneckerDelta(i, j).subs({"i": 1, "j": 0}) == 0
  42. assert KroneckerDelta(i, j).subs({"i": 3, "j": 3}) == 1
  43. assert KroneckerDelta(i, j)**0 == 1
  44. for n in range(1, 10):
  45. assert KroneckerDelta(i, j)**n == KroneckerDelta(i, j)
  46. assert KroneckerDelta(i, j)**-n == 1/KroneckerDelta(i, j)
  47. assert KroneckerDelta(i, j).is_integer is True
  48. assert adjoint(KroneckerDelta(i, j)) == KroneckerDelta(i, j)
  49. assert conjugate(KroneckerDelta(i, j)) == KroneckerDelta(i, j)
  50. assert transpose(KroneckerDelta(i, j)) == KroneckerDelta(i, j)
  51. # to test if canonical
  52. assert (KroneckerDelta(i, j) == KroneckerDelta(j, i)) == True
  53. assert KroneckerDelta(i, j).rewrite(Piecewise) == Piecewise((0, Ne(i, j)), (1, True))
  54. # Tests with range:
  55. assert KroneckerDelta(i, j, (0, i)).args == (i, j, (0, i))
  56. assert KroneckerDelta(i, j, (-j, i)).delta_range == (-j, i)
  57. # If index is out of range, return zero:
  58. assert KroneckerDelta(i, j, (0, i-1)) == 0
  59. assert KroneckerDelta(-1, j, (0, i-1)) == 0
  60. assert KroneckerDelta(j, -1, (0, i-1)) == 0
  61. assert KroneckerDelta(j, i, (0, i-1)) == 0
  62. def test_kronecker_delta_secondquant():
  63. """secondquant-specific methods"""
  64. D = KroneckerDelta
  65. i, j, v, w = symbols('i j v w', below_fermi=True, cls=Dummy)
  66. a, b, t, u = symbols('a b t u', above_fermi=True, cls=Dummy)
  67. p, q, r, s = symbols('p q r s', cls=Dummy)
  68. assert D(i, a) == 0
  69. assert D(i, t) == 0
  70. assert D(i, j).is_above_fermi is False
  71. assert D(a, b).is_above_fermi is True
  72. assert D(p, q).is_above_fermi is True
  73. assert D(i, q).is_above_fermi is False
  74. assert D(q, i).is_above_fermi is False
  75. assert D(q, v).is_above_fermi is False
  76. assert D(a, q).is_above_fermi is True
  77. assert D(i, j).is_below_fermi is True
  78. assert D(a, b).is_below_fermi is False
  79. assert D(p, q).is_below_fermi is True
  80. assert D(p, j).is_below_fermi is True
  81. assert D(q, b).is_below_fermi is False
  82. assert D(i, j).is_only_above_fermi is False
  83. assert D(a, b).is_only_above_fermi is True
  84. assert D(p, q).is_only_above_fermi is False
  85. assert D(i, q).is_only_above_fermi is False
  86. assert D(q, i).is_only_above_fermi is False
  87. assert D(a, q).is_only_above_fermi is True
  88. assert D(i, j).is_only_below_fermi is True
  89. assert D(a, b).is_only_below_fermi is False
  90. assert D(p, q).is_only_below_fermi is False
  91. assert D(p, j).is_only_below_fermi is True
  92. assert D(q, b).is_only_below_fermi is False
  93. assert not D(i, q).indices_contain_equal_information
  94. assert not D(a, q).indices_contain_equal_information
  95. assert D(p, q).indices_contain_equal_information
  96. assert D(a, b).indices_contain_equal_information
  97. assert D(i, j).indices_contain_equal_information
  98. assert D(q, b).preferred_index == b
  99. assert D(q, b).killable_index == q
  100. assert D(q, t).preferred_index == t
  101. assert D(q, t).killable_index == q
  102. assert D(q, i).preferred_index == i
  103. assert D(q, i).killable_index == q
  104. assert D(q, v).preferred_index == v
  105. assert D(q, v).killable_index == q
  106. assert D(q, p).preferred_index == p
  107. assert D(q, p).killable_index == q
  108. EV = evaluate_deltas
  109. assert EV(D(a, q)*F(q)) == F(a)
  110. assert EV(D(i, q)*F(q)) == F(i)
  111. assert EV(D(a, q)*F(a)) == D(a, q)*F(a)
  112. assert EV(D(i, q)*F(i)) == D(i, q)*F(i)
  113. assert EV(D(a, b)*F(a)) == F(b)
  114. assert EV(D(a, b)*F(b)) == F(a)
  115. assert EV(D(i, j)*F(i)) == F(j)
  116. assert EV(D(i, j)*F(j)) == F(i)
  117. assert EV(D(p, q)*F(q)) == F(p)
  118. assert EV(D(p, q)*F(p)) == F(q)
  119. assert EV(D(p, j)*D(p, i)*F(i)) == F(j)
  120. assert EV(D(p, j)*D(p, i)*F(j)) == F(i)
  121. assert EV(D(p, q)*D(p, i))*F(i) == D(q, i)*F(i)