def test_beam3(self): solver.solve(self.beams[3]) #Test the solution self.assertEqual(-48.5, self.beams[3].interactions[0].magnitude) self.assertEqual(18, self.beams[3].interactions[4].magnitude) shear_moment = shearmomentgenerator.generate_numerical(self.beams[3], self.STEP_SIZE) #Test shear assert abs(shear_moment[0][0] - 0) < self.ALMOST assert abs(shear_moment[int(1/self.STEP_SIZE) -1][0] - 0) < self.ALMOST assert abs(shear_moment[int(1/self.STEP_SIZE) + 1][0] - 7) < self.ALMOST assert abs(shear_moment[int(2/self.STEP_SIZE) -1][0] - 7) < self.ALMOST assert abs(shear_moment[int(7/self.STEP_SIZE) +1][0] - (-18)) < self.ALMOST assert abs(shear_moment[int(8/self.STEP_SIZE) -1][0] - (-18)) < self.ALMOST assert abs(shear_moment[int(8/self.STEP_SIZE) +1][0] - (0)) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE) -1][0] - (0)) < self.ALMOST #Test moment assert abs(shear_moment[0][1] - 48.5) < self.ALMOST assert abs(shear_moment[int(1/self.STEP_SIZE) - 1][1] - 48.5) < self.ALMOST #Had to decrease criteria due to steep slope assert abs(shear_moment[int(8/self.STEP_SIZE) - 1][1] - 10) < 0.02 assert abs(shear_moment[int(8/self.STEP_SIZE) +1][1] - 0) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE) -1][1] - 0) < self.ALMOST
def generate_numerical(beam, step_size): """Numerically generates shear and moment points along the length of the beam by solving subbeams of increasing length. Step size must be specified. step sizes of 0.01 - 0.0001 for a l=10 beam yield reasonable solve times on modern CPUs. Returns the result as a list of 2-tuples in the format (shear, moment). One point for each step, from 0 to beam.length. """ #Verify that the beam is solved. for interaction in beam.interactions: if not interaction.known: raise Shear_Moment_Error( 'Cannot generate shear diagram for an unsolved beam.') shear_moment = [] for curr_size in np.arange(0, beam.length, step_size): sub_beam = gen_sub_beam(beam, curr_size) #The unknown shear and moment at the end of the cut subbeam. internal_shear = Force(curr_size, 0, False) internal_moment = Moment(curr_size, 0, False) sub_beam.add_interaction(internal_shear) sub_beam.add_interaction(internal_moment) solver.solve(sub_beam) shear_moment.append( (-internal_shear.magnitude, internal_moment.magnitude)) return shear_moment
def solve_clicked(): """Solve is clicked - solve the beam and update the tree.""" try: solver.solve(beam) except SolverError as e: QtGui.QMessageBox.warning(window, "Error", str(e)) return update_tree(beam)
def test_beam1(self): solver.solve(self.beams[1]) #Test solution self.assertEqual(-10, self.beams[1].interactions[0].magnitude) self.assertEqual(-95, self.beams[1].interactions[1].magnitude) shear_moment = shearmomentgenerator.generate_numerical(self.beams[1], self.STEP_SIZE) #Test shear for item in shear_moment: assert abs(item[0] - (-10)) < self.ALMOST #Test moment assert abs(shear_moment[0][1] - 95) < self.ALMOST assert abs(shear_moment[int(4/self.STEP_SIZE - 1)][1] - 55 ) < self.ALMOST assert abs(shear_moment[int(5.5/self.STEP_SIZE) - 1][1] - 0) < self.ALMOST
def test_beam0(self): solver.solve(self.beams[0]) #Test solution self.assertEqual(5, self.beams[0].interactions[0].magnitude) self.assertEqual(5, self.beams[0].interactions[2].magnitude) shear_moment = shearmomentgenerator.generate_numerical(self.beams[0], self.STEP_SIZE) #Test moment assert abs(shear_moment[0][1] - 0 ) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE/2)][1] - 25) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE/4)][1] - 25/2) < self.ALMOST #Test shear assert abs(shear_moment[1][0] - 5) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE/2) -1][0] - 5 ) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE/2) +2][0] - (-5)) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE) -1][0] - (-5)) < self.ALMOST
def test_beam2(self): solver.solve(self.beams[2]) #Test the solution self.assertEqual(7.5, self.beams[2].interactions[0].magnitude) self.assertEqual(32.5, self.beams[2].interactions[3].magnitude) shear_moment = shearmomentgenerator.generate_numerical(self.beams[2], self.STEP_SIZE) #Test shear assert abs(shear_moment[0][0] - 7.5) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE)][0] - (-2.5)) < self.ALMOST assert abs(shear_moment[int(15/self.STEP_SIZE) - 1][0] - (-2.5)) < self.ALMOST assert abs(shear_moment[int(15/self.STEP_SIZE) + 1][0] - (-22.5)) < self.ALMOST assert abs(shear_moment[int(20/self.STEP_SIZE) - 1][0] - (-22.5)) < self.ALMOST assert abs(shear_moment[int(20/self.STEP_SIZE) + 1][0] - (10)) < self.ALMOST #Test moment assert abs(shear_moment[0][1] - 0) < self.ALMOST assert abs(shear_moment[int(10/self.STEP_SIZE)][1] - 25) < self.ALMOST assert abs(shear_moment[int(15/self.STEP_SIZE)][1] - 12.5) < self.ALMOST assert abs(shear_moment[int(20/self.STEP_SIZE)][1] - (-100)) < self.ALMOST assert abs(shear_moment[int(30/self.STEP_SIZE) -1][1] - 0) < self.ALMOST
def do_solve(self, arguments): """Solve the current beam.""" solver.solve(self.beam) self.do_view(None)
def test_solver_error(self): self.beams[0].add_interaction(Force(3, 0, False)) with self.assertRaises(SolverError): solver.solve(self.beams[0])