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 requires Young’s modulus E and cross-sectional area A:

e1 = Bar((n1, n2), E=30e6, A=1.0)

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, Node
 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    e1 = Bar((n1, n2), E=30e6, A=1.0)
21    e2 = Bar((n2, n3), E=30e6, A=1.0)
22    e3 = Bar((n3, n4), E=15e6, A=2.0)
23
24    model.add_nodes([n1, n2, n3, n4])
25    model.add_elements([e1, e2, e3])
26    model.add_force(n2, (3000.0,))
27    model.add_constraint(n1, ux=0.0)
28    model.add_constraint(n4, ux=0.0)
29
30    result = model.solve()
31
32    print("Node | Displacement | Nodal force")
33    for node in model.nodes:
34        print(
35            f"{node.label}\t"
36            f"{result.displacement(node)['ux']:.6f}\t"
37            f"{result.nodal_force(node)['fx']}"
38        )
39
40    return result
41
42
43if __name__ == "__main__":
44    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.