test_dimensions.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. from sympy.physics.units.systems.si import dimsys_SI
  2. from sympy.core.numbers import pi
  3. from sympy.core.singleton import S
  4. from sympy.core.symbol import Symbol
  5. from sympy.functions.elementary.complexes import Abs
  6. from sympy.functions.elementary.exponential import log
  7. from sympy.functions.elementary.miscellaneous import sqrt
  8. from sympy.functions.elementary.trigonometric import (acos, atan2, cos)
  9. from sympy.physics.units.dimensions import Dimension
  10. from sympy.physics.units.definitions.dimension_definitions import (
  11. length, time, mass, force, pressure, angle
  12. )
  13. from sympy.physics.units import foot
  14. from sympy.testing.pytest import raises
  15. def test_Dimension_definition():
  16. assert dimsys_SI.get_dimensional_dependencies(length) == {length: 1}
  17. assert length.name == Symbol("length")
  18. assert length.symbol == Symbol("L")
  19. halflength = sqrt(length)
  20. assert dimsys_SI.get_dimensional_dependencies(halflength) == {length: S.Half}
  21. def test_Dimension_error_definition():
  22. # tuple with more or less than two entries
  23. raises(TypeError, lambda: Dimension(("length", 1, 2)))
  24. raises(TypeError, lambda: Dimension(["length"]))
  25. # non-number power
  26. raises(TypeError, lambda: Dimension({"length": "a"}))
  27. # non-number with named argument
  28. raises(TypeError, lambda: Dimension({"length": (1, 2)}))
  29. # symbol should by Symbol or str
  30. raises(AssertionError, lambda: Dimension("length", symbol=1))
  31. def test_str():
  32. assert str(Dimension("length")) == "Dimension(length)"
  33. assert str(Dimension("length", "L")) == "Dimension(length, L)"
  34. def test_Dimension_properties():
  35. assert dimsys_SI.is_dimensionless(length) is False
  36. assert dimsys_SI.is_dimensionless(length/length) is True
  37. assert dimsys_SI.is_dimensionless(Dimension("undefined")) is False
  38. assert length.has_integer_powers(dimsys_SI) is True
  39. assert (length**(-1)).has_integer_powers(dimsys_SI) is True
  40. assert (length**1.5).has_integer_powers(dimsys_SI) is False
  41. def test_Dimension_add_sub():
  42. assert length + length == length
  43. assert length - length == length
  44. assert -length == length
  45. raises(TypeError, lambda: length + foot)
  46. raises(TypeError, lambda: foot + length)
  47. raises(TypeError, lambda: length - foot)
  48. raises(TypeError, lambda: foot - length)
  49. # issue 14547 - only raise error for dimensional args; allow
  50. # others to pass
  51. x = Symbol('x')
  52. e = length + x
  53. assert e == x + length and e.is_Add and set(e.args) == {length, x}
  54. e = length + 1
  55. assert e == 1 + length == 1 - length and e.is_Add and set(e.args) == {length, 1}
  56. assert dimsys_SI.get_dimensional_dependencies(mass * length / time**2 + force) == \
  57. {length: 1, mass: 1, time: -2}
  58. assert dimsys_SI.get_dimensional_dependencies(mass * length / time**2 + force -
  59. pressure * length**2) == \
  60. {length: 1, mass: 1, time: -2}
  61. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(mass * length / time**2 + pressure))
  62. def test_Dimension_mul_div_exp():
  63. assert 2*length == length*2 == length/2 == length
  64. assert 2/length == 1/length
  65. x = Symbol('x')
  66. m = x*length
  67. assert m == length*x and m.is_Mul and set(m.args) == {x, length}
  68. d = x/length
  69. assert d == x*length**-1 and d.is_Mul and set(d.args) == {x, 1/length}
  70. d = length/x
  71. assert d == length*x**-1 and d.is_Mul and set(d.args) == {1/x, length}
  72. velo = length / time
  73. assert (length * length) == length ** 2
  74. assert dimsys_SI.get_dimensional_dependencies(length * length) == {length: 2}
  75. assert dimsys_SI.get_dimensional_dependencies(length ** 2) == {length: 2}
  76. assert dimsys_SI.get_dimensional_dependencies(length * time) == {length: 1, time: 1}
  77. assert dimsys_SI.get_dimensional_dependencies(velo) == {length: 1, time: -1}
  78. assert dimsys_SI.get_dimensional_dependencies(velo ** 2) == {length: 2, time: -2}
  79. assert dimsys_SI.get_dimensional_dependencies(length / length) == {}
  80. assert dimsys_SI.get_dimensional_dependencies(velo / length * time) == {}
  81. assert dimsys_SI.get_dimensional_dependencies(length ** -1) == {length: -1}
  82. assert dimsys_SI.get_dimensional_dependencies(velo ** -1.5) == {length: -1.5, time: 1.5}
  83. length_a = length**"a"
  84. assert dimsys_SI.get_dimensional_dependencies(length_a) == {length: Symbol("a")}
  85. assert dimsys_SI.get_dimensional_dependencies(length**pi) == {length: pi}
  86. assert dimsys_SI.get_dimensional_dependencies(length**(length/length)) == {length: Dimension(1)}
  87. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(length**length))
  88. assert length != 1
  89. assert length / length != 1
  90. length_0 = length ** 0
  91. assert dimsys_SI.get_dimensional_dependencies(length_0) == {}
  92. # issue 18738
  93. a = Symbol('a')
  94. b = Symbol('b')
  95. c = sqrt(a**2 + b**2)
  96. c_dim = c.subs({a: length, b: length})
  97. assert dimsys_SI.equivalent_dims(c_dim, length)
  98. def test_Dimension_functions():
  99. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(cos(length)))
  100. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(acos(angle)))
  101. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(atan2(length, time)))
  102. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(log(length)))
  103. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(log(100, length)))
  104. raises(TypeError, lambda: dimsys_SI.get_dimensional_dependencies(log(length, 10)))
  105. assert dimsys_SI.get_dimensional_dependencies(pi) == {}
  106. assert dimsys_SI.get_dimensional_dependencies(cos(1)) == {}
  107. assert dimsys_SI.get_dimensional_dependencies(cos(angle)) == {}
  108. assert dimsys_SI.get_dimensional_dependencies(atan2(length, length)) == {}
  109. assert dimsys_SI.get_dimensional_dependencies(log(length / length, length / length)) == {}
  110. assert dimsys_SI.get_dimensional_dependencies(Abs(length)) == {length: 1}
  111. assert dimsys_SI.get_dimensional_dependencies(Abs(length / length)) == {}
  112. assert dimsys_SI.get_dimensional_dependencies(sqrt(-1)) == {}