OpenSees Tuturial
Steel Frame Modeling In this section of the OpenSees tutorial, we explore the procedure for modeling a steel frame. The beam and column specifications, loading conditions, and the overall structural layout are illustrated in Figure 1. As shown, the steel frame is subjected to a uniformly distributed load of 20 kN/m across the span of the […]

Steel Frame Modeling
In this section of the OpenSees tutorial, we explore the procedure for modeling a steel frame. The beam and column specifications, loading conditions, and the overall structural layout are illustrated in Figure 1. As shown, the steel frame is subjected to a uniformly distributed load of 20 kN/m across the span of the beam and two concentrated loads of 30 kN at each end of the beam. The material properties of the structural steel are as follows: modulus of elasticity E=2×1011 N/m2E = 2 \times 10^{11} \, \text{N/m}^2E=2×1011N/m2, yield strength Fy=345 MPaF_y = 345 \, \text{MPa}Fy=345MPa, and a strain hardening ratio of 1%.
Figure 1. Steel Frame Specifications
1. Overview of Modeling in OpenSees
In the finite element method, the system under investigation is discretized into smaller components known as finite elements. When a geometrical domain is meshed, it is effectively broken down into these discrete elements. Each element is connected to adjacent elements via “nodes.” A node is a spatial point defined by coordinates and associated with specific degrees of freedom (DOF), which in turn are subject to boundary conditions based on the role of the node within the structure. The OpenSees modeling approach is grounded in the principles of finite element analysis, which will be discussed further.
Figure 2. Meshed Element, Node, and Element Schematic
2. Initiating the Model
The first step in modeling with OpenSees is defining a global coordinate system and selecting a consistent unit system. These parameters remain constant throughout the modeling process and are defined according to the assumptions of the user. The output of the analysis is consequently based on these initial assumptions. In this tutorial, the SI unit system is adopted: force in newtons and length in meters. The global coordinate system follows that of Figure 1, with the positive y-axis directed upward and the positive x-axis directed to the right.
Next, we define the model dimensionality and the number of degrees of freedom per node using the model
command:
Python (OpenSeesPy):
model('basic', '-ndm', ndm, '-ndf', ndf)
TCL (OpenSees):
model BasicBuilder -ndm $ndm <-ndf $ndf>
In this command, ndm
defines the number of spatial dimensions (2D or 3D), and ndf
represents the number of DOFs at each node. For a 2D frame with 3 DOFs per node (2 translational and 1 rotational), the command is:
model('basic', '-ndm', 2, '-ndf', 3)
3. Defining Nodes
To define the nodes, their coordinates must be determined based on the frame’s geometry. As illustrated in Figure 1, four nodes are required. The frame has a height H=3 mH = 3 \, \text{m}H=3m and span L=6 mL = 6 \, \text{m}L=6m.
Python:
pythonCopyEditnode(1, 0, 0)
node(2, 0, H)
node(3, L, 0)
node(4, L, H)
4. Geometric Nonlinearity
Nonlinear effects in structural systems are typically categorized into geometric nonlinearity and material nonlinearity. Geometric nonlinearity is exemplified by the P–Δ effect, where the lateral displacement under axial loading induces additional bending moments, resulting in further displacements—a feedback phenomenon depicted in Figure 3.
Material nonlinearity, on the other hand, occurs when a material’s behavior deviates from linear elasticity after yielding. For steel, this entails a transition to a reduced stiffness regime.
To incorporate geometric nonlinearity, the geomTransf
command is used, and in this example, we adopt the P–Delta transformation:
pythonCopyEdittransfTag = 1
geomTransf('PDelta', transfTag)
Figure 3. P–Delta Effect on Column Behavior
5. Material Definition
This model uses a steel material modeled with the Steel02
uniaxial material in OpenSees. The material exhibits nonlinear behavior with strain hardening. The command syntax is:
Python:
pythonCopyEdituniaxialMaterial('Steel02', matTag, Fy, E0, b, R0, cR1, cR2)
With the following values:
pythonCopyEditsteelMatTag = 1
Fy = 345e6 # Yield strength in Pascals
Es = 2e11 # Elastic modulus in N/m^2
hardeningRatio = 0.01
R0 = 18
cR1 = 0.925
R2 = 0.15
uniaxialMaterial('Steel02', steelMatTag, Fy, Es, hardeningRatio, R0, cR1, R2)
Figure 4. Stress-Strain Relationship of Steel02 Material
6. Section Definition
To model the cross-sections of beams and columns, fiber sections are utilized. The patch
command defines individual rectangular components of the section.
Python:
pythonCopyEditsection('Fiber', secTag)
patch('quad', matTag, numSubdivIJ, numSubdivJK, *coordinates)
Before defining sections, local coordinate axes must be established based on element orientation, as depicted in Figure 5 and Figure 6. The local origin can be placed at the centroid for simplicity (Figure 7).
To define a W12x40 I-section:
pythonCopyEditcolSecTag = 1
d = 0.3023 # depth
bf = 0.2035 # flange width
tf = 0.0131 # flange thickness
tw = 0.0075 # web thickness
section('Fiber', colSecTag)
patch('quad', steelMatTag, numSubdivIJ, numSubdivJK,
d/2-tf, bf/2, d/2-tf, -bf/2, d/2, -bf/2, d/2, bf/2)
Repeat for the web and bottom flange as shown in Figure 9.
Define the beam section similarly:
pythonCopyEditbeamSecTag = 2
# same dimensions assumed for this example
7. Section Discretization
The section is discretized using two subdivision parameters in orthogonal directions:
pythonCopyEditnumSubdivij
numSubdivjk
These define how finely the section is meshed in each direction.
Figure 8 & 9. Section Geometry and Patch Node Coordinates
8. Element Definition
With the sections defined, assign them to elements using the forceBeamColumn
element type, which supports geometric and material nonlinearity.
Python:
pythonCopyEditelement('forceBeamColumn', eleTag, *eleNodes, transfTag, integrationTag)
Define the beam integration rule first:
pythonCopyEditnumIntgrPts = 5
beamIntegration('Lobatto', beamSecTag, beamSecTag, numIntgrPts)
beamIntegration('Lobatto', colSecTag, colSecTag, numIntgrPts)
Then, define the elements:
pythonCopyEditelement('forceBeamColumn', 1, 1, 2, transfTag, colSecTag)
element('forceBeamColumn', 2, 3, 4, transfTag, colSecTag)
element('forceBeamColumn', 3, 2, 4, transfTag, beamSecTag)
9. Boundary Conditions
In finite element analysis, boundary conditions constrain nodes to simulate support conditions. These constraints are applied to the degrees of freedom based on the structural role of each node. For 2D frames, each node typically has three DOFs (two translational, one rotational). Properly defined constraints are essential to ensure accurate results.
For example, fixed supports at nodes 1 and 3 would be defined by restricting all three DOFs at those nodes.
Leave a Comment: