body_base.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from abc import ABC, abstractmethod
  2. from sympy import Symbol, sympify
  3. from sympy.physics.vector import Point
  4. __all__ = ['BodyBase']
  5. class BodyBase(ABC):
  6. """Abstract class for body type objects."""
  7. def __init__(self, name, masscenter=None, mass=None):
  8. # Note: If frame=None, no auto-generated frame is created, because a
  9. # Particle does not need to have a frame by default.
  10. if not isinstance(name, str):
  11. raise TypeError('Supply a valid name.')
  12. self._name = name
  13. if mass is None:
  14. mass = Symbol(f'{name}_mass')
  15. if masscenter is None:
  16. masscenter = Point(f'{name}_masscenter')
  17. self.mass = mass
  18. self.masscenter = masscenter
  19. self.potential_energy = 0
  20. self.points = []
  21. def __str__(self):
  22. return self.name
  23. def __repr__(self):
  24. return (f'{self.__class__.__name__}({repr(self.name)}, masscenter='
  25. f'{repr(self.masscenter)}, mass={repr(self.mass)})')
  26. @property
  27. def name(self):
  28. """The name of the body."""
  29. return self._name
  30. @property
  31. def masscenter(self):
  32. """The body's center of mass."""
  33. return self._masscenter
  34. @masscenter.setter
  35. def masscenter(self, point):
  36. if not isinstance(point, Point):
  37. raise TypeError("The body's center of mass must be a Point object.")
  38. self._masscenter = point
  39. @property
  40. def mass(self):
  41. """The body's mass."""
  42. return self._mass
  43. @mass.setter
  44. def mass(self, mass):
  45. self._mass = sympify(mass)
  46. @property
  47. def potential_energy(self):
  48. """The potential energy of the body.
  49. Examples
  50. ========
  51. >>> from sympy.physics.mechanics import Particle, Point
  52. >>> from sympy import symbols
  53. >>> m, g, h = symbols('m g h')
  54. >>> O = Point('O')
  55. >>> P = Particle('P', O, m)
  56. >>> P.potential_energy = m * g * h
  57. >>> P.potential_energy
  58. g*h*m
  59. """
  60. return self._potential_energy
  61. @potential_energy.setter
  62. def potential_energy(self, scalar):
  63. self._potential_energy = sympify(scalar)
  64. @abstractmethod
  65. def kinetic_energy(self, frame):
  66. pass
  67. @abstractmethod
  68. def linear_momentum(self, frame):
  69. pass
  70. @abstractmethod
  71. def angular_momentum(self, point, frame):
  72. pass
  73. @abstractmethod
  74. def parallel_axis(self, point, frame):
  75. pass