test_loads.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from pytest import raises
  2. from sympy import symbols
  3. from sympy.physics.mechanics import (RigidBody, Particle, ReferenceFrame, Point,
  4. outer, dynamicsymbols, Force, Torque)
  5. from sympy.physics.mechanics.loads import gravity, _parse_load
  6. def test_force_default():
  7. N = ReferenceFrame('N')
  8. Po = Point('Po')
  9. f1 = Force(Po, N.x)
  10. assert f1.point == Po
  11. assert f1.force == N.x
  12. assert f1.__repr__() == 'Force(point=Po, force=N.x)'
  13. # Test tuple behaviour
  14. assert isinstance(f1, tuple)
  15. assert f1[0] == Po
  16. assert f1[1] == N.x
  17. assert f1 == (Po, N.x)
  18. assert f1 != (N.x, Po)
  19. assert f1 != (Po, N.x + N.y)
  20. assert f1 != (Point('Co'), N.x)
  21. # Test body as input
  22. P = Particle('P', Po)
  23. f2 = Force(P, N.x)
  24. assert f1 == f2
  25. def test_torque_default():
  26. N = ReferenceFrame('N')
  27. f1 = Torque(N, N.x)
  28. assert f1.frame == N
  29. assert f1.torque == N.x
  30. assert f1.__repr__() == 'Torque(frame=N, torque=N.x)'
  31. # Test tuple behaviour
  32. assert isinstance(f1, tuple)
  33. assert f1[0] == N
  34. assert f1[1] == N.x
  35. assert f1 == (N, N.x)
  36. assert f1 != (N.x, N)
  37. assert f1 != (N, N.x + N.y)
  38. assert f1 != (ReferenceFrame('A'), N.x)
  39. # Test body as input
  40. rb = RigidBody('P', frame=N)
  41. f2 = Torque(rb, N.x)
  42. assert f1 == f2
  43. def test_gravity():
  44. N = ReferenceFrame('N')
  45. m, M, g = symbols('m M g')
  46. F1, F2 = dynamicsymbols('F1 F2')
  47. po = Point('po')
  48. pa = Particle('pa', po, m)
  49. A = ReferenceFrame('A')
  50. P = Point('P')
  51. I = outer(A.x, A.x)
  52. B = RigidBody('B', P, A, M, (I, P))
  53. forceList = [(po, F1), (P, F2)]
  54. forceList.extend(gravity(g * N.y, pa, B))
  55. l = [(po, F1), (P, F2), (po, g * m * N.y), (P, g * M * N.y)]
  56. for i in range(len(l)):
  57. for j in range(len(l[i])):
  58. assert forceList[i][j] == l[i][j]
  59. def test_parse_loads():
  60. N = ReferenceFrame('N')
  61. po = Point('po')
  62. assert _parse_load(Force(po, N.z)) == (po, N.z)
  63. assert _parse_load(Torque(N, N.x)) == (N, N.x)
  64. f1 = _parse_load((po, N.x)) # Test whether a force is recognized
  65. assert isinstance(f1, Force)
  66. assert f1 == Force(po, N.x)
  67. t1 = _parse_load((N, N.y)) # Test whether a torque is recognized
  68. assert isinstance(t1, Torque)
  69. assert t1 == Torque(N, N.y)
  70. # Bodies should be undetermined (even in case of a Particle)
  71. raises(ValueError, lambda: _parse_load((Particle('pa', po), N.x)))
  72. raises(ValueError, lambda: _parse_load((RigidBody('pa', po, N), N.x)))
  73. # Invalid tuple length
  74. raises(ValueError, lambda: _parse_load((po, N.x, po, N.x)))
  75. # Invalid type
  76. raises(TypeError, lambda: _parse_load([po, N.x]))