def test_apply_loads_on_multi_degree_freedom_holonomic_system(): """Example based on: https://pydy.readthedocs.io/en/latest/examples/multidof-holonomic.html""" W = Body('W') #Wall B = Body('B') #Block P = Body('P') #Pendulum b = Body('b') #bob q1, q2 = dynamicsymbols('q1 q2') #generalized coordinates k, c, g, kT = symbols('k c g kT') #constants F, T = dynamicsymbols('F T') #Specified forces #Applying forces B.apply_force(F * W.x) W.apply_force(k * q1 * W.x, reaction_body=B) #Spring force W.apply_force(c * q1.diff() * W.x, reaction_body=B) #dampner P.apply_force(P.mass * g * W.y) b.apply_force(b.mass * g * W.y) #Applying torques P.apply_torque(kT * q2 * W.z, reaction_body=b) P.apply_torque(T * W.z) assert B.loads == [(B.masscenter, (F - k * q1 - c * q1.diff()) * W.x)] assert P.loads == [(P.masscenter, P.mass * g * W.y), (P.frame, (T + kT * q2) * W.z)] assert b.loads == [(b.masscenter, b.mass * g * W.y), (b.frame, -kT * q2 * W.z)] assert W.loads == [(W.masscenter, (c * q1.diff() + k * q1) * W.x)]
def test_body_add_torque(): body = Body('body') torque_vector = body.frame.x body.apply_torque(torque_vector) assert len(body.loads) == 1 assert body.loads[0] == (body.frame, torque_vector) raises(TypeError, lambda: body.apply_torque(0))
def test_remove_load(): P1 = Point('P1') P2 = Point('P2') B = Body('B') f1 = B.x f2 = B.y B.apply_force(f1, P1) B.apply_force(f2, P2) B.loads == [(P1, f1), (P2, f2)] B.remove_load(P2) B.loads == [(P1, f1)] B.apply_torque(f1.cross(f2)) B.loads == [(P1, f1), (B.frame, f1.cross(f2))] B.remove_load() B.loads == [(P1, f1)]
def test_apply_torque(): t = symbols('t') q = dynamicsymbols('q') B1 = Body('B1') B2 = Body('B2') N = ReferenceFrame('N') torque = t * q * N.x B1.apply_torque(torque, B2) #Applying equal and opposite torque assert B1.loads == [(B1.frame, torque)] assert B2.loads == [(B2.frame, -torque)] torque2 = t * N.y B1.apply_torque(torque2) assert B1.loads == [(B1.frame, torque + torque2)]