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)
Exemple #2
0
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
Exemple #4
0
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)
Exemple #5
0
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)
Exemple #8
0
    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)
Exemple #9
0
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)
Exemple #10
0
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
Exemple #11
0
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)
Exemple #12
0
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)
Exemple #13
0
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)
Exemple #14
0
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)
Exemple #15
0
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)
Exemple #16
0
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)
Exemple #17
0
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)
Exemple #18
0
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)