test_util.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. from sympy.core.containers import Tuple
  2. from sympy.core.numbers import pi
  3. from sympy.core.power import Pow
  4. from sympy.core.symbol import symbols
  5. from sympy.core.sympify import sympify
  6. from sympy.printing.str import sstr
  7. from sympy.physics.units import (
  8. G, centimeter, coulomb, day, degree, gram, hbar, hour, inch, joule, kelvin,
  9. kilogram, kilometer, length, meter, mile, minute, newton, planck,
  10. planck_length, planck_mass, planck_temperature, planck_time, radians,
  11. second, speed_of_light, steradian, time, km)
  12. from sympy.physics.units.util import convert_to, check_dimensions
  13. from sympy.testing.pytest import raises
  14. from sympy.functions.elementary.miscellaneous import sqrt
  15. def NS(e, n=15, **options):
  16. return sstr(sympify(e).evalf(n, **options), full_prec=True)
  17. L = length
  18. T = time
  19. def test_dim_simplify_add():
  20. # assert Add(L, L) == L
  21. assert L + L == L
  22. def test_dim_simplify_mul():
  23. # assert Mul(L, T) == L*T
  24. assert L*T == L*T
  25. def test_dim_simplify_pow():
  26. assert Pow(L, 2) == L**2
  27. def test_dim_simplify_rec():
  28. # assert Mul(Add(L, L), T) == L*T
  29. assert (L + L) * T == L*T
  30. def test_convert_to_quantities():
  31. assert convert_to(3, meter) == 3
  32. assert convert_to(mile, kilometer) == 25146*kilometer/15625
  33. assert convert_to(meter/second, speed_of_light) == speed_of_light/299792458
  34. assert convert_to(299792458*meter/second, speed_of_light) == speed_of_light
  35. assert convert_to(2*299792458*meter/second, speed_of_light) == 2*speed_of_light
  36. assert convert_to(speed_of_light, meter/second) == 299792458*meter/second
  37. assert convert_to(2*speed_of_light, meter/second) == 599584916*meter/second
  38. assert convert_to(day, second) == 86400*second
  39. assert convert_to(2*hour, minute) == 120*minute
  40. assert convert_to(mile, meter) == 201168*meter/125
  41. assert convert_to(mile/hour, kilometer/hour) == 25146*kilometer/(15625*hour)
  42. assert convert_to(3*newton, meter/second) == 3*newton
  43. assert convert_to(3*newton, kilogram*meter/second**2) == 3*meter*kilogram/second**2
  44. assert convert_to(kilometer + mile, meter) == 326168*meter/125
  45. assert convert_to(2*kilometer + 3*mile, meter) == 853504*meter/125
  46. assert convert_to(inch**2, meter**2) == 16129*meter**2/25000000
  47. assert convert_to(3*inch**2, meter) == 48387*meter**2/25000000
  48. assert convert_to(2*kilometer/hour + 3*mile/hour, meter/second) == 53344*meter/(28125*second)
  49. assert convert_to(2*kilometer/hour + 3*mile/hour, centimeter/second) == 213376*centimeter/(1125*second)
  50. assert convert_to(kilometer * (mile + kilometer), meter) == 2609344 * meter ** 2
  51. assert convert_to(steradian, coulomb) == steradian
  52. assert convert_to(radians, degree) == 180*degree/pi
  53. assert convert_to(radians, [meter, degree]) == 180*degree/pi
  54. assert convert_to(pi*radians, degree) == 180*degree
  55. assert convert_to(pi, degree) == 180*degree
  56. # https://github.com/sympy/sympy/issues/26263
  57. assert convert_to(sqrt(meter**2 + meter**2.0), meter) == sqrt(meter**2 + meter**2.0)
  58. assert convert_to((meter**2 + meter**2.0)**2, meter) == (meter**2 + meter**2.0)**2
  59. def test_convert_to_tuples_of_quantities():
  60. from sympy.core.symbol import symbols
  61. alpha, beta = symbols('alpha beta')
  62. assert convert_to(speed_of_light, [meter, second]) == 299792458 * meter / second
  63. assert convert_to(speed_of_light, (meter, second)) == 299792458 * meter / second
  64. assert convert_to(speed_of_light, Tuple(meter, second)) == 299792458 * meter / second
  65. assert convert_to(joule, [meter, kilogram, second]) == kilogram*meter**2/second**2
  66. assert convert_to(joule, [centimeter, gram, second]) == 10000000*centimeter**2*gram/second**2
  67. assert convert_to(299792458*meter/second, [speed_of_light]) == speed_of_light
  68. assert convert_to(speed_of_light / 2, [meter, second, kilogram]) == meter/second*299792458 / 2
  69. # This doesn't make physically sense, but let's keep it as a conversion test:
  70. assert convert_to(2 * speed_of_light, [meter, second, kilogram]) == 2 * 299792458 * meter / second
  71. assert convert_to(G, [G, speed_of_light, planck]) == 1.0*G
  72. assert NS(convert_to(meter, [G, speed_of_light, hbar]), n=7) == '6.187142e+34*gravitational_constant**0.5000000*hbar**0.5000000/speed_of_light**1.500000'
  73. assert NS(convert_to(planck_mass, kilogram), n=7) == '2.176434e-8*kilogram'
  74. assert NS(convert_to(planck_length, meter), n=7) == '1.616255e-35*meter'
  75. assert NS(convert_to(planck_time, second), n=6) == '5.39125e-44*second'
  76. assert NS(convert_to(planck_temperature, kelvin), n=7) == '1.416784e+32*kelvin'
  77. assert NS(convert_to(convert_to(meter, [G, speed_of_light, planck]), meter), n=10) == '1.000000000*meter'
  78. # similar to https://github.com/sympy/sympy/issues/26263
  79. assert convert_to(sqrt(meter**2 + second**2.0), [meter, second]) == sqrt(meter**2 + second**2.0)
  80. assert convert_to((meter**2 + second**2.0)**2, [meter, second]) == (meter**2 + second**2.0)**2
  81. # similar to https://github.com/sympy/sympy/issues/21463
  82. assert convert_to(1/(beta*meter + meter), 1/meter) == 1/(beta*meter + meter)
  83. assert convert_to(1/(beta*meter + alpha*meter), 1/kilometer) == (1/(kilometer*beta/1000 + alpha*kilometer/1000))
  84. def test_eval_simplify():
  85. from sympy.physics.units import cm, mm, km, m, K, kilo
  86. from sympy.core.symbol import symbols
  87. x, y = symbols('x y')
  88. assert (cm/mm).simplify() == 10
  89. assert (km/m).simplify() == 1000
  90. assert (km/cm).simplify() == 100000
  91. assert (10*x*K*km**2/m/cm).simplify() == 1000000000*x*kelvin
  92. assert (cm/km/m).simplify() == 1/(10000000*centimeter)
  93. assert (3*kilo*meter).simplify() == 3000*meter
  94. assert (4*kilo*meter/(2*kilometer)).simplify() == 2
  95. assert (4*kilometer**2/(kilo*meter)**2).simplify() == 4
  96. def test_quantity_simplify():
  97. from sympy.physics.units.util import quantity_simplify
  98. from sympy.physics.units import kilo, foot
  99. from sympy.core.symbol import symbols
  100. x, y = symbols('x y')
  101. assert quantity_simplify(x*(8*kilo*newton*meter + y)) == x*(8000*meter*newton + y)
  102. assert quantity_simplify(foot*inch*(foot + inch)) == foot**2*(foot + foot/12)/12
  103. assert quantity_simplify(foot*inch*(foot*foot + inch*(foot + inch))) == foot**2*(foot**2 + foot/12*(foot + foot/12))/12
  104. assert quantity_simplify(2**(foot/inch*kilo/1000)*inch) == 4096*foot/12
  105. assert quantity_simplify(foot**2*inch + inch**2*foot) == 13*foot**3/144
  106. def test_quantity_simplify_across_dimensions():
  107. from sympy.physics.units.util import quantity_simplify
  108. from sympy.physics.units import ampere, ohm, volt, joule, pascal, farad, second, watt, siemens, henry, tesla, weber, hour, newton
  109. assert quantity_simplify(ampere*ohm, across_dimensions=True, unit_system="SI") == volt
  110. assert quantity_simplify(6*ampere*ohm, across_dimensions=True, unit_system="SI") == 6*volt
  111. assert quantity_simplify(volt/ampere, across_dimensions=True, unit_system="SI") == ohm
  112. assert quantity_simplify(volt/ohm, across_dimensions=True, unit_system="SI") == ampere
  113. assert quantity_simplify(joule/meter**3, across_dimensions=True, unit_system="SI") == pascal
  114. assert quantity_simplify(farad*ohm, across_dimensions=True, unit_system="SI") == second
  115. assert quantity_simplify(joule/second, across_dimensions=True, unit_system="SI") == watt
  116. assert quantity_simplify(meter**3/second, across_dimensions=True, unit_system="SI") == meter**3/second
  117. assert quantity_simplify(joule/second, across_dimensions=True, unit_system="SI") == watt
  118. assert quantity_simplify(joule/coulomb, across_dimensions=True, unit_system="SI") == volt
  119. assert quantity_simplify(volt/ampere, across_dimensions=True, unit_system="SI") == ohm
  120. assert quantity_simplify(ampere/volt, across_dimensions=True, unit_system="SI") == siemens
  121. assert quantity_simplify(coulomb/volt, across_dimensions=True, unit_system="SI") == farad
  122. assert quantity_simplify(volt*second/ampere, across_dimensions=True, unit_system="SI") == henry
  123. assert quantity_simplify(volt*second/meter**2, across_dimensions=True, unit_system="SI") == tesla
  124. assert quantity_simplify(joule/ampere, across_dimensions=True, unit_system="SI") == weber
  125. assert quantity_simplify(5*kilometer/hour, across_dimensions=True, unit_system="SI") == 25*meter/(18*second)
  126. assert quantity_simplify(5*kilogram*meter/second**2, across_dimensions=True, unit_system="SI") == 5*newton
  127. def test_check_dimensions():
  128. x = symbols('x')
  129. assert check_dimensions(inch + x) == inch + x
  130. assert check_dimensions(length + x) == length + x
  131. # after subs we get 2*length; check will clear the constant
  132. assert check_dimensions((length + x).subs(x, length)) == length
  133. assert check_dimensions(newton*meter + joule) == joule + meter*newton
  134. raises(ValueError, lambda: check_dimensions(inch + 1))
  135. raises(ValueError, lambda: check_dimensions(length + 1))
  136. raises(ValueError, lambda: check_dimensions(length + time))
  137. raises(ValueError, lambda: check_dimensions(meter + second))
  138. raises(ValueError, lambda: check_dimensions(2 * meter + second))
  139. raises(ValueError, lambda: check_dimensions(2 * meter + 3 * second))
  140. raises(ValueError, lambda: check_dimensions(1 / second + 1 / meter))
  141. raises(ValueError, lambda: check_dimensions(2 * meter*(mile + centimeter) + km))