class TestScene: def setup_method(self): self.body = BodyT([1, 1, 1], [2, 2, 2], [1, 1, 1]) self.test_scene = Scene(self.body, self.Fx, self.Fy, 0, 0) self.g = 9.81 self.m = 1 self.circle = CircleT(1, 2, 1, 1) def Fx(self, t): return 5 if t < 5 else 0 def Fy(self, t): return -self.g * self.m if t < 3 else self.g * self.m def teardown_method(self): self.test_scene = None self.body = None self.m = None self.g = None def test_get_shape(self): assert self.test_scene.get_shape() == self.body def test_get_init_velo(self): x, y = self.test_scene.get_init_velo() assert x == 0 and y == 0 def test_set_shape(self): self.test_scene.set_shape(self.circle) assert self.test_scene.get_shape() == self.circle def test_set_init_velo(self): self.test_scene.set_init_velo(0, 1) x, y = self.test_scene.get_init_velo() assert x == 0 and y == 1 def test_sim(self): x, y = self.test_scene.sim(2, 2) a = [0.0, 2.0] b = [[1.0, 2., 0.0, 0.0], [4.333333335602872, -4.540000004452837, 3.333333333333334, -6.54]] temp1 = x temp2 = y for i in range(len(x)): temp1[i] -= a[i] assert abs(max(temp1)) / abs(max(a)) < 0.0001 for i in range(len(y)): for j in range(len(y[i])): temp2[i][j] -= b[i][j] for i in range(len(y)): assert abs(max(temp2[i])) / abs(max(b[i])) < 0.0001
def test_Scene_set_init_velo_1(): x = randrange(-10e6, 10e6) y = randrange(-10e6, 10e6) s = randrange(1, 10e6) m = randrange(1, 10e6) v_x = randrange(-10e6, 10e6) v_y = randrange(-10e6, 10e6) def F_x(t): return randrange(-50, 50) * t + randrange(-50, 50) def F_y(t): return randrange(-50, 50) * t + randrange(-50, 50) t = TriangleT(x, y, s, m) scene = Scene(t, F_x, F_y, v_x, v_y) new_v_x = randrange(-10e6, 10e6) new_v_y = randrange(-10e6, 10e6) scene.set_init_velo(new_v_x, new_v_y) assert scene.get_init_velo() == (new_v_x, new_v_y)
def test_Scene_sim_4(): x = randrange(-10e6, 10e6) y = randrange(-10e6, 10e6) s = randrange(1, 10e6) m = randrange(1, 10e6) v_x = randrange(-10e6, 10e6) v_y = randrange(-10e6, 10e6) t_final = randrange(1, 1000) nsteps = randrange(100, 100000) def F_x(t): if t > 100: return 0 else: return t**2 def F_y(t): if t < 40: return -9.81 * m else: return 9.81 * m t = TriangleT(x, y, s, m) scene = Scene(t, F_x, F_y, v_x, v_y) mass = scene.get_shape().mass() def ode(w, t): return w[2], w[3], F_x(t) / mass, F_y(t) / mass cm_x = scene.get_shape().cm_x() cm_y = scene.get_shape().cm_y() results = scene.sim(t_final, nsteps) t_result = results[0] w_result = results[1] v = scene.get_init_velo() t_calc = [i * t_final / (nsteps - 1) for i in range(nsteps)] w_calc = sp.odeint(ode, [cm_x, cm_y, v[0], v[1]], t_calc) w_success = True for i, j in zip(w_calc, w_result): for a, b in zip(i, j): if not math.isclose(a, b, rel_tol=0.0001): w_success = False assert t_result == t_calc and w_success
class TestSceneT(): def setup_method(self, method): self.circle1 = CircleT(1, 2, 4, 9) self.triangle1 = TriangleT(2, 7, 3, 4) self.scene1 = Scene(self.circle1, Fx, Fy, 0, 0) self.scene2 = Scene(self.triangle1, Fx, Fy, 0, 0) def teardown_method(self, method): self.circle1 = None self.triangle1 = None self.scene1 = None self.scene = None def test_get_shape(self): assert self.scene1.get_shape() == self.circle1 def test_get_shape2(self): assert self.scene2.get_shape() == self.triangle1 def test_get_unbal_forces(self): assert self.scene1.get_unbal_forces() == (Fx, Fy) def test_get_init_velo(self): assert self.scene1.get_init_velo() == (0, 0) def test_set_shape(self): self.scene1.set_shape(self.triangle1) assert self.scene1.get_shape() == self.triangle1 def test_set_unbal_forces(self): self.scene1.set_unbal_forces(Fx2, Fy2) assert self.scene1.get_unbal_forces() == (Fx2, Fy2) def test_set_init_velo(self): self.scene1.set_init_velo(2, 10) assert self.scene1.get_init_velo() == (2, 10) def test_sim(self): t, wsol = self.scene1.sim(5, 3) t_expec = [0, 2.5, 5] wsol_expec = [[1, 2, 0, 0], [1, -25.25, 0, -21.8], [1, -107, 0, -43.6]] for i in range(len(t)): if t_expec[i] == 0: assert t[i] == t_expec[i] else: assert (t[i] - t_expec[i]) / t_expec[i] < epsilon for j in range(len(wsol)): for i in range(len(wsol[j])): if wsol_expec[j][i] == 0: assert wsol[j][i] == wsol_expec[j][i] else: assert (wsol[j][i] - wsol_expec[j][i]) / wsol_expec[j][i] < epsilon def test_sim2(self): t, wsol = self.scene2.sim(4, 5) t_expec = [0.0, 1.0, 2.0, 3.0, 4.0] wsol_expec = [[2, 7, 0, 0], [2, -2.81, 0, -19.62], [2, -32.24, 0, -39.24], [2, -81.29, 0, -58.86], [2, -149.96, 0, -78.48]] for i in range(len(t)): if t_expec[i] == 0: assert t[i] == t_expec[i] else: assert (t[i] - t_expec[i]) / t_expec[i] < epsilon for j in range(len(wsol)): for i in range(len(wsol[j])): if wsol_expec[j][i] == 0: assert wsol[j][i] == wsol_expec[j][i] else: assert (wsol[j][i] - wsol_expec[j][i]) / wsol_expec[j][i] < epsilon
# cm should be (0, 0) b2 = BodyT([11, 9, 9, 11], [11, 11, 9, 9], [10, 10, 10, 10]) print(b2.cm_x(), b2.cm_y(), b2.mass(), b2.m_inert()) # cm for b2 should be shifted to 10, 10; b.m_inert() should be equal to b2.m_inert() lst = [c, t, b, b2] for s in lst: print(s.cm_x(), s.cm_y(), s.mass(), s.m_inert()) S = Scene(c, Fx, Fy, 0, 0) # exercise interface for Scene S.get_shape() S.get_unbal_forces() S.get_init_velo() # exercise setters for Scene S.set_shape(c) S.set_unbal_forces(Fx, Fy) S.set_init_velo(0, 0) t, wsol = S.sim(10, 100) for t1, w1 in zip(t, wsol): print("t=", t1, "rx=", w1[0], "ry=", w1[1], "vx=", w1[2], "vy=", w1[3]) # extract ry values print(wsol[0:, 1]) #plot(wsol, t)