test_util.py 8.3 KB

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