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.