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.