Material and Geometric Nonlinear Analysis of Biot Truss
Material and Geometric Nonlinear Analysis of Biot Truss
A CALCPAD PROGRAM
─◊─◊──◊───◊────⧫────◊───◊──◊─◊─
by
12.2024
Page 1 / 8
Input data
𝑥⃗𝐽 = [0m 3m 9m], 𝑦⃗𝐽 = [0m 0m 0m], 𝑛𝐽 = len(𝑥⃗𝐽 ) = 3
Elements - [J1; J2]
1 2
transp(𝐸𝐽 ) = [ ] , 𝑛 = n𝑟𝑜𝑤𝑠 (𝐸𝐽 ) = 2, 𝐽1 (𝑒) = 𝐸𝐽 .𝑒,1 , 𝐽2 (𝑒) = 𝐸𝐽 .𝑒,2
2 3 𝐸
Element endpoint coordinates
𝑥1 (𝑒) = 𝑥⃗𝐽 .𝐽 , 𝑦1 (𝑒) = 𝑦⃗𝐽 .𝐽 , 𝑥2 (𝑒) = 𝑥⃗𝐽 .𝐽 , 𝑦2 (𝑒) = 𝑦⃗𝐽 .𝐽
1 (𝑒) 1 (𝑒) 2 (𝑒) 2 (𝑒)
2 2
Element lengths - 𝑙(𝑒) = √(𝑥2 (𝑒) − 𝑥1 (𝑒)) + (𝑦2 (𝑒) − 𝑦1 (𝑒))
𝑥2 (𝑒)−𝑥1 (𝑒) 𝑦2 (𝑒)−𝑦1 (𝑒)
Element directions - 𝑐(𝑒) = , 𝑠(𝑒) =
𝑙(𝑒) 𝑙(𝑒)
Transformation matrix
𝑡(𝑒) = [𝑐(𝑒); 𝑠(𝑒)| − 𝑠(𝑒); 𝑐(𝑒)], 𝑇(𝑒) = add(𝑡(𝑒); add(𝑡(𝑒); matrix(4; 4); 1; 1); 3; 3)
Supports - [joint; cx; cy]
1 1×1020 kN⁄m 1×1020 kN⁄m
𝑐𝐽 = [ ] , 𝑛 = n𝑟𝑜𝑤𝑠 (𝑐𝐽 ) = 2
3 1×1020 kN⁄m 1×1020 kN⁄m 𝑐
Material - steel
We assume bi-linear material model
Initial modulus of elasticity - 𝐸0 = 206GPa
Yield stress - 𝑓𝑦 = 500MPa
Ultimate tensile strength - 𝑓𝑢 = 600MPa
𝑓𝑦 500MPa
Yield strain - 𝜀𝑦 = 𝐸 = = 2.43‰
0 206GPa
𝑖𝑓𝜀 < 𝜀𝑦 : 𝐸0 · 𝜀
Idealized stress-strain curve - 𝜎(𝜀) = {
𝑒𝑙𝑠𝑒: 𝑓𝑦 + 𝐸1 · (𝜀 − 𝜀𝑦 )
Page 2 / 8
Cross section – circular with diameter 𝜱 = 𝟐𝟎mm
𝜋·𝛷2 3.14·(20mm)2
Area - 𝐴 = = = 3.14cm2
4 4
Stiffness
Initial - 𝐸𝐴0 = 𝐸0 · 𝐴 = 206GPa · 3.14cm2 = 64716.8kN,𝐸𝐴 = 𝐸𝐴0 = 64716.8kN
After yield - 𝐸𝐴1 = 𝐸1 · 𝐴 = 5.69GPa · 3.14cm2 = 1787.76kN
Load - [Joint, Fx, Fy]
𝐹𝐽 = [2 0kN −70kN], 𝑛𝐹 = n𝑟𝑜𝑤𝑠 (𝐹𝐽 ) = 1
Prestressing force - 𝑃 = 20kN
𝑃 20kN
Initial stress - 𝜎𝑃 = 𝐴 = 3.14cm2 = 63.662MPa
𝜎𝑃 63.662MPa
Initial strain - 𝜀𝑃 = = = 0.000309
𝐸0 206GPa
Page 3 / 8
Horizontal reactive force at the right end - 𝐹𝑥 (𝑒; 𝑧) = 𝑁(𝑒; 𝑧) · 𝑐𝑑 (𝑒; 𝑧)
Vertical reactive force at the right end - 𝐹𝑦 (𝑒; 𝑧) = 𝑁(𝑒; 𝑧) · 𝑠𝑑 (𝑒; 𝑧)
Partial derivatives of element end reactive forces
1 𝑧2 2 𝑧2 · (𝑙(𝑒) + 𝑧1 )
𝐹′𝑥1 (𝑒; 𝑧) = − , 𝐹′𝑥2 (𝑒; 𝑧) =
𝑙(𝑒) 𝑙′(𝑒; 𝑧)3 𝑙′(𝑒; 𝑧)3
1 (𝑙(𝑒) + 𝑧1 )2
𝐹′𝑦1 (𝑒; 𝑧) = 𝐹′𝑥2 (𝑒; 𝑧), 𝐹′𝑦2 (𝑒; 𝑧) = −
𝑙(𝑒) 𝑙′(𝑒; 𝑧)3
We are not going to linearize the above equations by Taylor series as per [1]. We will use
them further directly in their implicit form.
Relative displacements for element e - 𝑧𝑒 (𝑒) = 𝑡(𝑒) · (𝑧𝐽 (𝐽2 (𝑒)) − 𝑧𝐽 (𝐽1 (𝑒)))
Element reactive forces partial vector - 𝐹𝑒 (𝑒) = 𝑡(𝑒) · [𝐹𝑥 (𝑒; 𝑧𝑒 (𝑒)); 𝐹𝑦 (𝑒; 𝑧𝑒 (𝑒))]
Partial element Jacobi matrix
𝐽𝑒 (𝑒) = 𝑡(𝑒) · [𝐹′𝑥1 (𝑒; 𝑧𝑒 (𝑒)); 𝐹′𝑥2 (𝑒; 𝑧𝑒 (𝑒)) | 𝐹′𝑦1 (𝑒; 𝑧𝑒 (𝑒)); 𝐹′𝑦2 (𝑒; 𝑧𝑒 (𝑒))]
Target precision - 𝜀𝑚𝑎𝑥 = 10−12 = 1×10−12
Iteratively calculate the following equations of the Newton-Raphson’s method:
⃗⃗⃗⃗⃗)
norm𝑒 (𝛿𝑍
𝑍⃗0 = 𝑍⃗, ⃗⃗⃗⃗⃗
𝛿𝑍 = inverse (𝐽(𝑍⃗)) · 𝐹(𝑍⃗) , 𝑍⃗ = 𝑍⃗0 − ⃗⃗⃗⃗⃗
𝛿𝑍 , 𝜀= < 𝜀max
norm𝑒 (𝑍⃗)
Convergence reached at iteration - 𝑛 = 82. Relative error − 𝜀 = 9.1×10−13
Results
𝑧𝐽 (𝑗)
Joint displacements - 𝑍(𝑗) = round ( ) · 𝛿𝑧
𝛿𝑧
Page 4 / 8
Element axial forces - 𝑁𝑒 (𝑒) = 𝑁(𝑒; 𝑧𝑒 (𝑒))
Element Е1 - N1 = 𝑁𝑒 (1) = 185.85kN < 𝑁𝑢 = 188.5kN
Element Е2 - N2 = 𝑁𝑒 (2) = 181.27kN < 𝑁𝑢 = 188.5kN
Comparison to OpenSeesPy
The solution is performed by the following Python script:
import openseespy.opensees as ops
# Units of measurement
m = 1; N = 1; kN = 1000*N; Pa = N/m**2; MPa = Pa*1e6; GPa = Pa*1e9; cm = m/100
# Model properties
a = 3*m; b = 6*m # Joint spacing
E0 = 206*GPa # Initial modulus of elasticity
fy = 500*MPa # Yield stress
fu = 600*MPa # Ultimate tensile strength
εy = fy/E0 # Yield strain
εu = 0.02 # Ultimate strain
E1 = (fu - fy)/(εu - εy) # Residual modulus of elasticity
d = 2*cm # Cross section diameter
A = 3.14159265359*d**2/4 # Cross section area
F = 70*kN # Vertical load at the intermediate joint
P = 20*kN # Prestressing force
σp = P/A # Initial stress
# Model creation
ops.model('basic','-ndm',2,'-ndf',2)
ops.node(1,0,0); ops.fix(1,1,1)
ops.node(2,a,-1e-6*cm) # Small
ops.node(3,a+b,0); ops.fix(3,1,1)
ops.uniaxialMaterial('ElasticBilin',1,E0,E1,εy)
ops.uniaxialMaterial('InitStressMaterial',2,1,σp)
ops.element('corotTruss',1,1,2,A,2)
ops.element('corotTruss',2,2,3,A,2)
ops.timeSeries('Constant',1)
ops.pattern('Plain',1,1)
ops.load(2,0,-F)
# Running the analysis
ops.analysis('Static','-noWarnings')
ops.analyze(1)
Page 5 / 8
ops.reactions()
# Printing the results
print(f"Displacements: {["%.2fmm" % (f*1000) for f in ops.nodeDisp(2)]}")
print(f"Support reactions: {["%.2fkN" % (f/1000) \
for f in ops.nodeReaction(1)]}, {["%.2fkN" % (f/1000) \
for f in ops.nodeReaction(3)]}")
print(f"Element axial forces: {["%.2fkN" % (f/1000) \
for f in ops.basicForce(1)]}, {["%.2fkN" % (f/1000)
for f in ops.basicForce(2)]}")
Credits: The above code is based on a script, developed by Prof. Michael H. Scott, Oregon State University.
Results:
Displacements: ['-44.71mm', '-772.72mm']
Support reactions: ['-179.81kN', '47.01kN'], ['179.81kN', '22.99kN']
Element axial forces: ['185.85kN'], ['181.27kN']
Conclusion: Both solutions are identical up to five significant digits.
Comparison to linear-elastic material model and system behavior charts
Using the same algorithm in Calcpad, we also performed a solution with linear-elastic
material model, by entering sufficiently high values for the yield and tensile strengths. The
results are obtained as follows:
Results for linear elastic material model
𝑧𝐽 (𝑗)
Joint displacements - 𝑍(𝑗) = round ( ) · 𝛿𝑧
𝛿𝑧
Page 6 / 8
By applying material nonlinearity, we can activate “hidden” resistance resources that exist
in the structure. Yielding allows the structure to deflect further and work more efficiently,
due to the increased vertical projection of the internal axial forces in bars.
By gradually increasing the load at a certain step and recording the corresponding
displacements and forces, we can track the behavior of the system and display it graphically.
This was done for both models – linear and nonlinear material models, and the results are
displayed in the following diagrams:
Z, mm
560
F, kN
40 linear
460
nonlin
20 linear 360
nonlin.
0 260
0 200 400 600 800 1000 0 40 80 120 160 200 240 280 320 360
Z, mm P, kN
400 400
300 300
N, kN
N, kN
200 200
Until the steel yields the two graphs coincide completely. From then on, they diverge. The
displacements for the bi-linear material model grow faster, while the forces grow more
slowly. The first graph clearly shows zero initial stiffness (zero tangent slope). That is why
the system cannot be solved by linear analysis or assuming small displacements (1-st and 2-
nd order theories).
Page 7 / 8
References
[1] Levy, R., Spillers, W.R. Analysis of Geometrically nonlinear structures: Second Edition (2003)
Analysis of Geometrically nonlinear structures: Second Edition, p. 272. DOI: 10.1007/978-94-
017-0243-0
[2] McKenna, F., Fenves, G. L, and Scott, M. H. (2000) Open System for Earthquake Engi-
neering Simulation. University of California, Berkeley
http://opensees.berkeley.edu
[3] Mazzoni, S., McKenna, F., Scott, M. H., and Fenves, G. L. (2006) OpenSees Command
Language Manual. University of California, Berkeley
http://opensees.berkeley.edu/manuals/usermanual
[4] Minjie Zhu, Frank McKenna, Michael H. Scott, OpenSeesPy: Python library for the OpenSees fi-
nite element framework, SoftwareX, Volume 7, 2018, Pages 6-11, ISSN 2352-7110
https://doi.org/10.1016/j.softx.2017.10.009
Page 8 / 8