Bar elements

A bar element represents one-dimensional axial deformation. Each node contributes one displacement degree of freedom, ux, with corresponding nodal force fx.

Use nusa.model.BarModel with nusa.element.Bar.

Element properties

A bar receives reusable material and section objects. Its formulation requires Young’s modulus E from the material and cross-sectional area A from the section:

material = Material(E=30e6)
section = Section(A=1.0)

e1 = Bar(
    (n1, n2),
    material=material,
    section=section,
)

The element result contains end forces together with the physical axial force and axial stress:

values = result.element_result(e1)
values["axial_force"]
values["axial_stress"]

NuSA uses positive axial force/stress for tension.

Example: three-bar assemblage

The example below assembles three axial bars with different material/section properties, applies a load at an internal node, and restrains the two ends.

 1# -*- coding: utf-8 -*-
 2# ***********************************
 3#  Author: Pedro Jorge De Los Santos
 4#  E-mail: delossantosmfq@gmail.com
 5#  License: MIT License
 6# ***********************************
 7
 8from nusa import Bar, BarModel, Material, Node, Section
 9
10
11def test1():
12    """Logan (2007), Example 3.1."""
13    model = BarModel("Bar Model")
14
15    n1 = Node((0.0, 0.0))
16    n2 = Node((30.0, 0.0))
17    n3 = Node((60.0, 0.0))
18    n4 = Node((90.0, 0.0))
19
20    material_30 = Material(E=30e6)
21    material_15 = Material(E=15e6)
22    section_1 = Section(A=1.0)
23    section_2 = Section(A=2.0)
24
25    e1 = Bar((n1, n2), material=material_30, section=section_1)
26    e2 = Bar((n2, n3), material=material_30, section=section_1)
27    e3 = Bar((n3, n4), material=material_15, section=section_2)
28
29    model.add_nodes([n1, n2, n3, n4])
30    model.add_elements([e1, e2, e3])
31    model.add_force(n2, (3000.0,))
32    model.add_constraint(n1, ux=0.0)
33    model.add_constraint(n4, ux=0.0)
34
35    result = model.solve()
36
37    print("Node | Displacement | Nodal force")
38    for node in model.nodes:
39        print(
40            f"{node.label}\t"
41            f"{result.displacement(node)['ux']:.6f}\t"
42            f"{result.nodal_force(node)['fx']}"
43        )
44
45    return result
46
47
48if __name__ == "__main__":
49    test1()

Important result queries

Displacement at a node:

result.displacement(n2)["ux"]

Generalized nodal force:

result.nodal_force(n2)["fx"]

Element axial response:

result.element_result(e1)["axial_force"]
result.element_result(e1)["axial_stress"]

For problems with prescribed nonzero axial displacement, use the same add_constraint(node, ux=value) interface used for zero supports.