Beispiel #1
0
    def setUp(self):
        # create materials
        steel = Steel()

        # create 2d frame analysis object
        self.analysis = FrameAnalysis2D()

        section1 = Section(area=6e3, ixx=200e6)
        section2 = Section(area=4e3, ixx=50e6)

        # create nodes
        self.node_a = self.analysis.create_node(coords=[0])
        self.node_b = self.analysis.create_node(coords=[8000])
        self.node_c = self.analysis.create_node(coords=[13000])

        # create beam elements
        self.element_ab = self.analysis.create_element(
            el_type='EB2-2D',
            nodes=[self.node_a, self.node_b],
            material=steel,
            section=section1)
        self.element_bc = self.analysis.create_element(
            el_type='EB2-2D',
            nodes=[self.node_b, self.node_c],
            material=steel,
            section=section2)
Beispiel #2
0
    def test_example2_3(self):
        # create 2d frame analysis object
        analysis = FrameAnalysis2D()

        # create sections
        steel = Steel()
        section1 = Section(area=4000)
        section2 = Section(area=1000)

        # create nodes
        a = analysis.create_node(coords=[0, 0])
        b = analysis.create_node(coords=[2000, 2000])
        c = analysis.create_node(coords=[-4000, 2000])

        # create truss elements
        el1 = analysis.create_element(el_type='Bar2-2D',
                                      nodes=[c, a],
                                      material=steel,
                                      section=section1)
        el2 = analysis.create_element(el_type='Bar2-2D',
                                      nodes=[a, b],
                                      material=steel,
                                      section=section2)

        # add supports
        freedom_case = cases.FreedomCase()
        freedom_case.add_nodal_support(node=b, val=0, dof=0)
        freedom_case.add_nodal_support(node=b, val=0, dof=1)
        freedom_case.add_nodal_support(node=c, val=0, dof=0)
        freedom_case.add_nodal_support(node=c, val=0, dof=1)
        sup1 = freedom_case.add_nodal_support(node=a, val=0, dof=0)
        sup2 = freedom_case.add_nodal_support(node=a, val=-5, dof=1)

        # add loads
        load_case = cases.LoadCase()

        # add analysis case
        analysis_case = cases.AnalysisCase(freedom_case=freedom_case,
                                           load_case=load_case)

        # linear static solver
        LinearStatic(analysis=analysis, analysis_cases=[analysis_case]).solve()

        # check reactions
        self.assertEqual(np.around(sup1.get_reaction(analysis_case) / 1e3, 1),
                         181.0)
        self.assertEqual(np.around(sup2.get_reaction(analysis_case) / 1e3, 1),
                         -355.7)
Beispiel #3
0
from feastruct.solvers.linstatic import LinearStatic
from feastruct.solvers.feasolve import SolverSettings

# ------------
# preprocessor
# ------------

# lists
nodes = []  # list holding the node objects
elements = []  # list holding the element objects
freedom_cases = []  # list holding the freedom cases
load_cases = []  # list holding the load cases
analysis_cases = []  # list holding the analysis cases

# create 2d frame analysis object
analysis = FrameAnalysis2D()

# create materials and sections
steel = Steel()
section = Section(area=3230, ixx=23.6e6)

# create nodes
nodes.append(analysis.create_node(coords=[0, 0]))
nodes.append(analysis.create_node(coords=[1500, 0]))
nodes.append(analysis.create_node(coords=[3000, 1500]))

# create beam elements
for i in range(2):
    elements.append(
        analysis.create_element(el_type='EB2-2D',
                                nodes=[nodes[i], nodes[i + 1]],
Beispiel #4
0
    def test_example2_2(self):
        # create 2d frame analysis object
        analysis = FrameAnalysis2D()

        # create sections
        steel = Steel()
        section1 = Section(area=5000)
        section2 = Section(area=3000)

        # create nodes
        a = analysis.create_node(coords=[0, 0])
        b = analysis.create_node(coords=[3000, 3000])
        c = analysis.create_node(coords=[3000, -3000])
        d = analysis.create_node(coords=[-3000 / np.tan(np.pi / 6), 3000])
        e = analysis.create_node(coords=[-3000 / np.tan(np.pi / 6), -3000])

        # create truss elements
        el1 = analysis.create_element(el_type='Bar2-2D',
                                      nodes=[e, a],
                                      material=steel,
                                      section=section1)
        el2 = analysis.create_element(el_type='Bar2-2D',
                                      nodes=[d, a],
                                      material=steel,
                                      section=section1)
        el3 = analysis.create_element(el_type='Bar2-2D',
                                      nodes=[b, a],
                                      material=steel,
                                      section=section2)
        el4 = analysis.create_element(el_type='Bar2-2D',
                                      nodes=[c, a],
                                      material=steel,
                                      section=section2)

        # add supports
        freedom_case = cases.FreedomCase()
        freedom_case.add_nodal_support(node=b, val=0, dof=0)
        freedom_case.add_nodal_support(node=b, val=0, dof=1)
        freedom_case.add_nodal_support(node=c, val=0, dof=0)
        freedom_case.add_nodal_support(node=c, val=0, dof=1)
        freedom_case.add_nodal_support(node=d, val=0, dof=0)
        freedom_case.add_nodal_support(node=d, val=0, dof=1)
        freedom_case.add_nodal_support(node=e, val=0, dof=0)
        freedom_case.add_nodal_support(node=e, val=0, dof=1)

        # add loads
        load_case = cases.LoadCase()
        load_case.add_nodal_load(node=a, val=1000e3, dof=0)

        # add analysis case
        analysis_case = cases.AnalysisCase(freedom_case=freedom_case,
                                           load_case=load_case)

        # linear static solver
        LinearStatic(analysis=analysis, analysis_cases=[analysis_case]).solve()

        # check node displacement
        dofs = a.get_dofs(a.nfs)
        u = dofs[0].get_displacement(analysis_case)
        v = dofs[1].get_displacement(analysis_case)

        self.assertEqual(np.around(u, 2), 2.55)
        self.assertEqual(np.around(v, 2), 0)

        # check axial forces
        n1 = el1.get_afd(n=1, analysis_case=analysis_case)
        n2 = el2.get_afd(n=1, analysis_case=analysis_case)
        n3 = el3.get_afd(n=1, analysis_case=analysis_case)
        n4 = el4.get_afd(n=1, analysis_case=analysis_case)

        self.assertEqual(np.around(n1 / 1e3, 1), 368.8)
        self.assertEqual(np.around(n2 / 1e3, 1), 368.8)
        self.assertEqual(np.around(n3 / 1e3, 1), -255.5)
        self.assertEqual(np.around(n4 / 1e3, 1), -255.5)
Beispiel #5
0
    def test_example2_1(self):
        nodes = []  # list holding the node objects
        elements = []  # list holding the element objects

        # create 2d frame analysis object
        analysis = FrameAnalysis2D()

        # create sections
        steel = Steel()
        section1 = Section(area=6000)
        section2 = Section(area=8000)

        # create nodes
        nodes.append(analysis.create_node(coords=[0, 0]))
        nodes.append(analysis.create_node(coords=[6000, 4000]))
        nodes.append(analysis.create_node(coords=[9000, 0]))

        # create truss elements
        elements.append(
            analysis.create_element(el_type='Bar2-2D',
                                    nodes=[nodes[0], nodes[1]],
                                    material=steel,
                                    section=section1))
        elements.append(
            analysis.create_element(el_type='Bar2-2D',
                                    nodes=[nodes[1], nodes[2]],
                                    material=steel,
                                    section=section2))

        # add supports
        freedom_case = cases.FreedomCase()
        freedom_case.add_nodal_support(node=nodes[0], val=0, dof=0)
        freedom_case.add_nodal_support(node=nodes[0], val=0, dof=1)
        freedom_case.add_nodal_support(node=nodes[2], val=0, dof=0)
        freedom_case.add_nodal_support(node=nodes[2], val=0, dof=1)

        # add loads
        load_case = cases.LoadCase()
        load_case.add_nodal_load(node=nodes[1], val=500e3, dof=0)

        # add analysis case
        analysis_case = cases.AnalysisCase(freedom_case=freedom_case,
                                           load_case=load_case)

        # linear static solver
        LinearStatic(analysis=analysis, analysis_cases=[analysis_case]).solve()

        # check node displacement
        node1 = nodes[1]
        dofs = node1.get_dofs(node1.nfs)

        u = dofs[0].get_displacement(analysis_case)
        v = dofs[1].get_displacement(analysis_case)

        self.assertEqual(np.around(u, 2), 2.41)
        self.assertEqual(np.around(v, 2), 0.72)

        # check axial forces
        n1 = elements[0].get_afd(n=1, analysis_case=analysis_case)
        n2 = elements[1].get_afd(n=1, analysis_case=analysis_case)

        self.assertEqual(np.around(n1 / 1e3, 1), 400.6)
        self.assertEqual(np.around(n2 / 1e3, 1), -277.8)
Beispiel #6
0
def preprocessor(length, depth, panels, freq):
    w = 10  # load per unit length [N/mm]
    dx = length / panels  # length of a truss panel

    # create 2d frame analysis object
    analysis = FrameAnalysis2D()

    # create materials and sections
    steel = Steel()
    section_deck = Section(area=3230, ixx=23.6e6)  # 200UB25
    section_vertical = Section(area=3000, ixx=3.91e6)  # 100x9 SHS
    section_diagonal = Section(area=314)  # 20 dia rod
    section_tie = Section(area=1018)  # 36 dia rod

    # create deck nodes
    nodes_deck = []

    for i in range(panels + 1):
        nodes_deck.append(analysis.create_node(coords=[i * dx]))

    # create tie nodes - first node coincides with first deck node
    nodes_tie = [nodes_deck[0]]

    for i in range(panels - 1):
        # fit parabola
        x = (i + 1) * dx
        y = 4 * depth / length / length * x * x - 4 * depth / length * x

        nodes_tie.append(analysis.create_node(coords=[x, y]))

    # last node coincides with last deck node
    nodes_tie.append(nodes_deck[-1])

    # create deck (beam) elements
    elements_deck = []

    for i in range(panels):
        elements_deck.append(
            analysis.create_element(el_type='EB2-2D',
                                    nodes=[nodes_deck[i], nodes_deck[i + 1]],
                                    material=steel,
                                    section=section_deck))

    # create tie (bar) elements
    elements_tie = []

    for i in range(panels):
        elements_tie.append(
            analysis.create_element(el_type='Bar2-2D',
                                    nodes=[nodes_tie[i], nodes_tie[i + 1]],
                                    material=steel,
                                    section=section_tie))

    # create vertical (beam) elements
    elements_vertical = []

    for i in range(panels - 1):
        elements_vertical.append(
            analysis.create_element(
                el_type='EB2-2D',
                nodes=[nodes_deck[i + 1], nodes_tie[i + 1]],
                material=steel,
                section=section_vertical))

    # create diagonal (bar) elements
    elements_diaongal = []

    for i in range(panels - 2):
        elements_diaongal.append(
            analysis.create_element(
                el_type='Bar2-2D',
                nodes=[nodes_deck[i + 1], nodes_tie[i + 2]],
                material=steel,
                section=section_diagonal))

        elements_diaongal.append(
            analysis.create_element(
                el_type='Bar2-2D',
                nodes=[nodes_deck[i + 2], nodes_tie[i + 1]],
                material=steel,
                section=section_diagonal))

    # add supports
    freedom_case = cases.FreedomCase()
    freedom_case.add_nodal_support(node=nodes_deck[0], val=0, dof=0)
    freedom_case.add_nodal_support(node=nodes_deck[0], val=0, dof=1)
    freedom_case.add_nodal_support(node=nodes_deck[-1], val=0, dof=1)

    # add loads
    load_case = cases.LoadCase()

    # if frequency analysis, don't bother adding load
    if not freq:
        for i in range(panels - 1):
            load_case.add_nodal_load(node=nodes_deck[i + 1],
                                     val=-w * dx,
                                     dof=1)

    # add analysis case
    analysis_case = cases.AnalysisCase(freedom_case=freedom_case,
                                       load_case=load_case)

    return (analysis, analysis_case)
Beispiel #7
0
    def test_example3_2(self):
        nodes = []  # list holding the node objects
        elements = []  # list holding the element objects

        # create 2d frame analysis object
        analysis = FrameAnalysis2D()

        # create sections
        steel = Steel()
        section1 = Section(area=15e3)
        section2 = Section(area=18e3)
        section3 = Section(area=20e3)

        # create nodes
        nodes.append(analysis.create_node(coords=[0, 0]))
        nodes.append(
            analysis.create_node(coords=[4000 / np.tan(np.pi / 6), 4000]))
        nodes.append(
            analysis.create_node(coords=[4000 / np.tan(np.pi / 6) + 4000, 0]))

        # create truss elements
        elements.append(
            analysis.create_element(el_type='Bar2-2D',
                                    nodes=[nodes[0], nodes[1]],
                                    material=steel,
                                    section=section1))
        elements.append(
            analysis.create_element(el_type='Bar2-2D',
                                    nodes=[nodes[1], nodes[2]],
                                    material=steel,
                                    section=section3))
        elements.append(
            analysis.create_element(el_type='Bar2-2D',
                                    nodes=[nodes[0], nodes[2]],
                                    material=steel,
                                    section=section2))

        # add supports
        freedom_case = cases.FreedomCase()
        sup1 = freedom_case.add_nodal_support(node=nodes[0], val=0, dof=0)
        sup2 = freedom_case.add_nodal_support(node=nodes[0], val=0, dof=1)
        sup3 = freedom_case.add_nodal_support(node=nodes[2], val=0, dof=1)

        # add loads
        load_case = cases.LoadCase()
        load_case.add_nodal_load(node=nodes[1],
                                 val=500e3 * np.cos(2 * np.pi / 9),
                                 dof=0)
        load_case.add_nodal_load(node=nodes[1],
                                 val=500e3 * np.sin(2 * np.pi / 9),
                                 dof=1)

        # add analysis case
        analysis_case = cases.AnalysisCase(freedom_case=freedom_case,
                                           load_case=load_case)

        # linear static solver
        LinearStatic(analysis=analysis, analysis_cases=[analysis_case]).solve()

        # check node displacement
        node_a = nodes[1]
        node_b = nodes[2]
        dofs_a = node_a.get_dofs(node_a.nfs)
        dofs_b = node_b.get_dofs(node_b.nfs)

        u_a = dofs_a[0].get_displacement(analysis_case)
        v_a = dofs_a[1].get_displacement(analysis_case)
        u_b = dofs_b[0].get_displacement(analysis_case)

        self.assertEqual(np.around(u_a, 2), 0.87)
        self.assertEqual(np.around(v_a, 2), 1.24)
        self.assertEqual(np.around(u_b, 2), -0.19)

        # check axial forces
        n1 = elements[0].get_afd(n=1, analysis_case=analysis_case)
        n2 = elements[1].get_afd(n=1, analysis_case=analysis_case)
        n3 = elements[2].get_afd(n=1, analysis_case=analysis_case)

        self.assertEqual(np.around(n1 / 1e3, 1), 515.7)
        self.assertEqual(np.around(n2 / 1e3, 1), 89.9)
        self.assertEqual(np.around(n3 / 1e3, 1), -63.6)

        # check reactions
        rc_x = sup1.get_reaction(analysis_case=analysis_case)
        rc_y = sup2.get_reaction(analysis_case=analysis_case)
        rb_y = sup3.get_reaction(analysis_case=analysis_case)

        self.assertEqual(np.around(rc_x / 1e3, 1), -383.0)
        self.assertEqual(np.around(rc_y / 1e3, 1), -257.8)
        self.assertEqual(np.around(rb_y / 1e3, 1), -63.6)
Beispiel #8
0
    def test_example4_15(self):
        # create materials
        steel = Material(name='steel_imperial',
                         elastic_modulus=29e3,
                         poissons_ratio=0.3,
                         rho=0)

        # create 2d frame analysis object
        analysis = FrameAnalysis2D()
        analysis.post.n_subdiv = 3

        beam = Section(ixx=128.5)

        # create nodes
        n = 20  # number of beam segments (must be an even number to ensure point load in centre)
        L = 300  # length
        k_L = 15  # spring length
        k = 1.5  # foundation modulus
        dx = L / n
        spring = Section(area=k * dx * k_L / 29e3)
        beam_nodes = []
        spring_nodes = []

        # beam nodes
        for i in range(n + 1):
            beam_nodes.append(analysis.create_node(coords=[i * L / n]))

        # spring nodes
        for i in range(n - 1):
            spring_nodes.append(
                analysis.create_node(coords=[(i + 1) * L / n, -k_L]))

        # create elements
        beam_elements = []
        spring_elements = []

        # create beam elements
        for i in range(n):
            beam_elements.append(
                analysis.create_element(
                    el_type='EB2-2D',
                    nodes=[beam_nodes[i], beam_nodes[i + 1]],
                    material=steel,
                    section=beam))

        # create spring elements
        for i in range(n - 1):
            spring_elements.append(
                analysis.create_element(
                    el_type='Bar2-2D',
                    nodes=[beam_nodes[i + 1], spring_nodes[i]],
                    material=steel,
                    section=spring))

        # add supports
        freedom_case = cases.FreedomCase()
        spring_supports_x = []
        spring_supports_y = []

        # add end supports
        freedom_case.add_nodal_support(node=beam_nodes[0], val=0, dof=0)
        freedom_case.add_nodal_support(node=beam_nodes[0], val=0, dof=1)
        freedom_case.add_nodal_support(node=beam_nodes[-1], val=0, dof=1)

        # add spring support
        for spring_node in spring_nodes:
            spring_supports_x.append(
                freedom_case.add_nodal_support(node=spring_node, val=0, dof=0))
            spring_supports_y.append(
                freedom_case.add_nodal_support(node=spring_node, val=0, dof=1))

        # add loads
        load_case = cases.LoadCase()
        load_case.add_nodal_load(node=beam_nodes[int(n / 2)], val=-40, dof=1)

        # add analysis case
        analysis_case = cases.AnalysisCase(freedom_case=freedom_case,
                                           load_case=load_case)

        # linear static solver
        LinearStatic(analysis=analysis, analysis_cases=[analysis_case]).solve()

        # check node displacement
        dof = beam_nodes[int(n / 2)].get_dofs(
            [False, True, False, False, False, False])
        v_p = dof[0].get_displacement(analysis_case)

        self.assertEqual(np.around(v_p, 3), -0.238)

        # check bending moment forces
        m = beam_elements[int(n / 2)].get_bmd(n=2, analysis_case=analysis_case)
        self.assertEqual(np.around(m[0], 0), -547)