def test_generate_template(): """ Test that model generator creates a template file """ clean() modelobj = mg.Model.make_template() model = modelobj.serialise(filename=TEST_FILENAME) assert os.path.isfile(TEST_FILENAME) args = StdRunArgs() args.no_plots = False standard_run(args=args, model=model)
def test_gravity_load1(modelobj): """ COMSOL """ modelobj.acceleration.direction = [0, 0, -50] modelobj.acceleration.turn_on = True model = modelobj.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [5.596076482184879E-1, 4.762117782171238E-1, -1.321409332803191E-4, -1.698801746334137E-1, 2.758114598130918E-1, 2.993944464887873E-2] comsol['node_c'] = [5.595556818966981E-1, 1.302412325985819E0, -1.972980221323205E0, -1.802565216028734E-1, 4.279096128123204E-1, 2.799362378051662E-1] comsol['node_d'] = [-8.401255071291417E-1, 1.302412325985816E0, -3.049493052832375E0, -2.269845812014872E-1, 4.279096128123197E-1, 2.799362378051689E-1] comsol['node_f'] = [1.843284520339020E0, 1.843181890812329E0, -1.972980221320200E0, -1.802565215961649E-1, 4.279096128122850E-1, 2.799362378154024E-1] for node_uid in ['node_b', 'node_c', 'node_d', 'node_f']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] assert u_framat == pytest.approx(u_comsol)
def _run_mapping_test(self, filename, beam_num=0, xyz_lims=(1, 1, 1)): model = import_model(filename) xlim, ylim, zlim = xyz_lims free_node_loads = [] for _ in range(self.num_load_points): x = xyz_lims[0] * random.random() y = xyz_lims[1] * random.random() z = xyz_lims[2] * random.random() free_node_loads.append(self.get_free_node_load_entry(x, y, z)) model['beamlines'][beam_num]['loads']['free_nodes'] = free_node_loads args = StdRunArgs() args.filename = filename results = standard_run(args, model=model) frame = results['frame'] sum_Fx = np.sum(frame.F[0::6]) sum_Fy = np.sum(frame.F[0::6]) sum_Fz = np.sum(frame.F[2::6]) assert sum_Fx == self.num_load_points * self.Fx assert sum_Fy == self.num_load_points * self.Fy assert sum_Fz == self.num_load_points * self.Fz
def test_cantilever_dist_load1(cantilever): """ COMSOL """ cantilever.beamlines['beam1'].add_const_distributed_load(from_node_uid="node_a", to_node_uid="node_b", load=[1, 1, 1, 0, 0, 0]) model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [5.000000000004979E-1, 1.249999999998921E-1, 1.250000000001275E-1, 8.641212599618681E-14, -1.666666666668539E-1, 1.666666666664287E-1] comsol['node_c'] = [3.333333333341506E-1, 1.249999999998916E-1, 1.250000000002308E-1, 1.119263615314014E-13, -1.666666666668533E-1, 1.666666666663053E-1] for node_uid in ['node_b', 'node_c']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] u_framat = round2zero(u_framat) u_comsol = round2zero(u_comsol) print() print(u_framat) print(u_comsol) assert u_framat == pytest.approx(u_comsol)
def test_structure_mass(cantilever): model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] mb = frame.mass_breakdown assert mb['total_mass'] == BEAM_MASS
def test_cantilever_point_load(): """ Cantilever beam with a point load Pz at its tip """ Pz = 1 # Tip point load E = 1 # Young's modulus Iy = 1 # 2nd moment of area about y-axis ### Iz should not change any results... Iz = 2 # 2nd moment of area about z-axis L = 1 # Beam length def deflection_uz_analytical(x): """ Analytical expression for the deflection curve Args: :x: x position """ # Iy = 1 ux = 0 uy = 0 uz = (Pz / (6 * E * Iy)) * (3 * L * x**2 - x**3) tx = 0 ty = -(Pz / (6 * E * Iy)) * (6 * L * x - 3 * x**2) tz = 0 return [ux, uy, uz, tx, ty, tz] modelobj = mg.Model.make_template() modelobj.profildata['dummy_profil'].Iz = Iz modelobj.profildata['dummy_profil'].Iy = Iy beamline_uid = modelobj.get_beamline_uids(beam_number=0) modelobj.beamlines[beamline_uid].add_concentrated_load( node_uid="node_b", load=[0, 0, Pz, 0, 0, 0]) modelobj.beamlines[beamline_uid].nelem = 10 model = modelobj.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] def_interpolator = frame.deformation.get_beamline_interpolator( 'cantilever', frame) # Test deformation at different positions along the beam line for x in np.linspace(0, 1, 20): def_FEM = def_interpolator(x) def_ANALYTICAL = deflection_uz_analytical(x) assert def_FEM == pytest.approx(def_ANALYTICAL)
def test_generate_spiral_beam(): """ Create a spiral beam """ modelobj = mg.Model.make_template() modelobj.remove_beamlines() # Generate node coordinates t = np.linspace(0, 20, num=200) x, y, z = helix(a=10, b=5, c=0.5, t=t) node_list = [] for x_coord, y_coord, z_coord in zip(x, y, z): node_list.append( mg.Node(coord=[x_coord, y_coord, z_coord], up=[0, 0, 1])) spiral_beam = mg.BeamLine() spiral_beam.append_nodes(node_list) # Get UID of first and last node node_uids = spiral_beam.get_node_uids() first_node_uid = node_uids[0] last_node_uid = node_uids[-1] # Add material spiral_beam.add_const_cross_section(first_node_uid, last_node_uid, "dummy_material", "dummy_profil") # Add boundary condition bc = mg.BoundaryConditions() bc.add_fix(node_uid=first_node_uid) modelobj.add_beamline(spiral_beam) modelobj.boundary_conditions = bc model = modelobj.serialise() args = StdRunArgs() args.no_plots = False standard_run(args=args, model=model)
def run_analysis(self): """Run a FramAT analysis""" self._apply_loads_to_framat_model() # ----- Run the FramAT analysis ----- results = standard_run(args=StdRunArgs( filename=self.own_files['model_file'], verbose=True)) self.last_solution = results # ----- Share loads ----- logger.info("Sharing loads...") frame = results['frame'] self.shared.structure.def_fields = frame.deformation.get_displacement_fields( frame, n_sup=1000)
def test_structure_additional_masses(cantilever): point_mass_a = 30 point_mass_b = 10 point_mass_c = 20 cantilever.beamlines['beam1'].add_point_mass(node_uid='node_a', mass=point_mass_a) cantilever.beamlines['beam1'].add_point_mass(node_uid='node_b', mass=point_mass_b) cantilever.beamlines['beam1'].add_point_mass(node_uid='node_c', mass=point_mass_c) model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] mb = frame.mass_breakdown assert mb['total_mass'] == pytest.approx(BEAM_MASS + point_mass_a + point_mass_b + point_mass_c)
def test_shapefunction_boundaries(cantilever): """ Shape function for left node 1 at left node etc... """ model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] element = frame.beamlines[0].elements[0] N_0 = element.shape_function_matrix(xi=0) N_1 = element.shape_function_matrix(xi=1) assert np.testing.assert_array_equal(N_0[0:6, 0:6], np.identity(6)) is None assert np.testing.assert_array_equal(N_0[0:6, 6:12], np.zeros( (6, 6))) is None assert np.testing.assert_array_equal(N_1[0:6, 0:6], np.zeros( (6, 6))) is None assert np.testing.assert_array_equal(N_1[0:6, 6:12], np.identity(6)) is None
def test_point_load1(modelobj): """ COMSOL """ modelobj.beamlines['beam1'].add_concentrated_load(node_uid="node_c", load=[0, 0, -1000, 0, 0, 0]) model = modelobj.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [1.066891478253068E-2, 9.543646272022848E-3, -1.983119895890568E-6, -3.001070495297579E-3, 5.585818521450960E-3, 7.594567199847793E-4] comsol['node_c'] = [1.066759658265234E-2, 2.903277892984416E-2, -4.186652047476606E-2, -3.054063508322713E-3, 9.176797196636636E-3, 6.219808329632239E-3] comsol['node_d'] = [-2.043144506550915E-2, 2.903277892984415E-2, -5.713683801638100E-2, -3.054063508323112E-3, 9.176797196636654E-3, 6.219808329632350E-3] comsol['node_f'] = [3.819798817231467E-2, 3.819496945534988E-2, -4.186652047446178E-2, -3.054063508318770E-3, 9.176797196697322E-3, 6.219808329766303E-3] for node_uid in ['node_b', 'node_c', 'node_d', 'node_f']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] assert u_framat == pytest.approx(u_comsol)
def test_cantilever_pointload2(cantilever): """ COMSOL """ cantilever.beamlines['beam1'].add_concentrated_load(node_uid="node_b", load=[0, 0, 1, 1, 1, 1]) model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [-8.651084788930832E-13, 5.000000000006578E-1, -1.666666666665981E-1, 1.000000000000388E0, 4.999999999998941E-1, 1.000000000001180E0] comsol['node_c'] = [-1.000000000002333E0, 5.000000000006555E-1, 8.333333333339423E-1, 1.000000000000613E0, 4.999999999998925E-1, 1.000000000001609E0] for node_uid in ['node_b', 'node_c']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] u_framat = round2zero(u_framat) u_comsol = round2zero(u_comsol) assert u_framat == pytest.approx(u_comsol)
def test_cantilever_pointload1(cantilever): """ COMSOL """ cantilever.beamlines['beam1'].add_concentrated_load(node_uid="node_b", load=[0, 0, 1, 0, 0, 0]) model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [0.000000000000000E0, 0.000000000000000E0, 3.333333333339483E-1, 2.986429541369149E-13, -5.000000000004997E-1, 0.000000000000000E0] comsol['node_c'] = [0.000000000000000E0, 0.000000000000000E0, 3.333333333339483E-1, 2.986429541369149E-13, -5.000000000004997E-1, 0.000000000000000E0] for node_uid in ['node_b', 'node_c']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] u_framat = round2zero(u_framat) u_comsol = round2zero(u_comsol) assert u_framat == pytest.approx(u_comsol)
def test_cantilever_pointload3(cantilever): """ COMSOL """ cantilever.beamlines['beam1'].add_concentrated_load(node_uid="node_c", load=[1, 1, 1, 1, 1, 1]) model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [1.000000000000718E0, 3.333333333333479E-1, -1.666666666662542E-1, 2.000000000001323E0, 4.999999999993773E-1, 4.999999999999319E-1] comsol['node_c'] = [3.333333333341866E-1, 1.333333333333342E0, 2.666666666668882E0, 3.500000000002027E0, 1.499999999999372E0, 9.999999999998267E-1] for node_uid in ['node_b', 'node_c']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] u_framat = round2zero(u_framat) u_comsol = round2zero(u_comsol) assert u_framat == pytest.approx(u_comsol)
def test_dist_load1(modelobj): """ COMSOL """ modelobj.beamlines['beam1'].add_const_distributed_load(from_node_uid="node_b", to_node_uid="node_c", load=[1000, 1000, 1000, 0, 0, 0]) model = modelobj.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [6.732757111460135E-2, 3.652905973076431E-2, 1.247202082849881E-5, -6.601864577506486E-3, 1.304871265636743E-2, 2.290343746451240E-3] comsol['node_c'] = [6.733550049414583E-2, 8.244665025538872E-2, -4.121655548443893E-2, -4.928517336182789E-3, 9.962799017880077E-3, 1.401955220574270E-2] comsol['node_d'] = [-2.762260534566513E-3, 8.244665025538851E-2, -6.585914216535620E-2, -4.928517336183659E-3, 9.962799017880062E-3, 1.401955220574240E-2] comsol['node_f'] = [9.722389754805007E-2, 9.723220226485939E-2, -4.121655548428723E-2, -4.928517335832289E-3, 9.962799017873893E-3, 1.401955220604765E-2] for node_uid in ['node_b', 'node_c', 'node_d', 'node_f']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] assert u_framat == pytest.approx(u_comsol)
def test_point_load2(modelobj): """ COMSOL """ modelobj.beamlines['beam1'].add_concentrated_load(node_uid="node_c", load=[0, 0, -1000, -200, -200, -200]) model = modelobj.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [1.002048959214114E-2, 9.123474179897293E-3, -1.964573487084554E-6, -2.915664469260097E-3, 5.285385109330331E-3, 6.809300927723490E-4] comsol['node_c'] = [1.001921245395625E-2, 2.658870914265197E-2, -3.939801207117682E-2, -2.984268337178663E-3, 8.508381816577183E-3, 5.571438689630761E-3] comsol['node_d'] = [-1.783798099419770E-2, 2.658870914265195E-2, -5.431935375707141E-2, -2.984268337179038E-3, 8.508381816577190E-3, 5.571438689630833E-3] comsol['node_f'] = [3.554435790346207E-2, 3.554151415469307E-2, -3.939801207089391E-2, -2.984268337174976E-3, 8.508381816633659E-3, 5.571438689755973E-3] for node_uid in ['node_b', 'node_c', 'node_d', 'node_f']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] assert u_framat == pytest.approx(u_comsol)
def test_cantilever_dist_load3(cantilever): """ COMSOL """ cantilever.beamlines['beam1'].add_const_distributed_load(from_node_uid="node_a", to_node_uid="node_b", load=[0, 0, 0, 0, 1, 1]) model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [-4.325195747555271E-13, 3.333333333336428E-1, -3.333333333336693E-1, -2.303925454661278E-13, 5.000000000004943E-1, 5.000000000005623E-1] comsol['node_c'] = [-5.000000000011393E-1, 3.333333333336411E-1, -3.333333333339448E-1, -2.978775793467516E-13, 5.000000000004926E-1, 5.000000000007775E-1] for node_uid in ['node_b', 'node_c']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] u_framat = round2zero(u_framat) u_comsol = round2zero(u_comsol) assert u_framat == pytest.approx(u_comsol)
def test_cantilever_dist_load2(cantilever): """ COMSOL """ cantilever.beamlines['beam1'].add_const_distributed_load(from_node_uid="node_a", to_node_uid="node_b", load=[0, 0, 0, 1, 0, 0]) model = cantilever.serialise() args = StdRunArgs() args.no_plots = False results = standard_run(args=args, model=model) frame = results['frame'] comsol = {} comsol['node_b'] = [0.000000000000000E0, 0.000000000000000E0, 1.151905288530186E-13, 5.000000000002529E-1, -1.727661140969786E-13, 0.000000000000000E0] comsol['node_c'] = [0.000000000000000E0, 0.000000000000000E0, 5.000000000004560E-1, 5.000000000003826E-1, -1.727501420150245E-13, 0.000000000000000E0] for node_uid in ['node_b', 'node_c']: tip_node_number = frame.finder.nodes.by_uid[node_uid].num u_framat = frame.deformation.by_node_num(tip_node_number) u_comsol = comsol[node_uid] u_framat = round2zero(u_framat) u_comsol = round2zero(u_comsol) assert u_framat == pytest.approx(u_comsol)