OpenSeesPy Documentation
OpenSeesPy Documentation
Release 3.5.1.3
Minjie Zhu
1 Developer 3
Bibliography 439
Index 441
i
ii
OpenSeesPy Documentation, Release 3.5.1.3
Note: OpenSees Cloud is a SaaS implementation of OpenSees using cloud computing. Analyses run in the cloud on
AWS while the front end integrates input, output, documentation, and a model viewer.
OpenSees Amazon Machine Image is a virtual machine that runs OpenSeesPy and OpenSeesMP with no additional
compilation or installation required at low cost.
Note: Questions including modeling issues and the use of OpenSeesPy, please post on OpenSeesPy Forum.
You are very welcome to contribute to OpenSeesPy with new command documents and examples by sending pull
requests through github pulls.
For errors in this document, submit on github issues.
# import OpenSeesPy
import openseespy.opensees as ops
# wipe model
ops.wipe()
# create model
ops.model('basic', '-ndm', 2, '-ndf', 3)
# print model
ops.printModel()
Contents 1
OpenSeesPy Documentation, Release 3.5.1.3
2 Contents
CHAPTER 1
Developer
Minjie Zhu
Research Associate
Civil and Construction Engineering
Oregon State University
1.1 Installation
1. PyPi (Windows)
2. PyPi (Linux)
3. PyPi (Mac)
PyPi (Windows)
Install Anaconda
• Install Anaconda
3
OpenSeesPy Documentation, Release 3.5.1.3
4 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
• To install
• To upgrade
• To import
PyPi (Linux)
Install Python
Install in terminal
• To install
• To upgrade
1.1. Installation 5
OpenSeesPy Documentation, Release 3.5.1.3
• To import
import openseespy.opensees as ops
PyPi (Mac)
Install Python
Install in terminal
• To install
python3.8 -m pip install openseespy
• To upgrade
python3.8 -m pip install --upgrade openseespy
• To import
import openseespy.opensees as ops
1. DesignSafe (Web-based)
2. Windows Subsystem for Linux (Windows)
DesignSafe (Web-based)
OpenSeesPy in DesignSafe
Tip:
6 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• Register an account for free and log in
1.1. Installation 7
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• Land on your own portal and go to workspace
8 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• In your workspace, select Jupyter, launch it, and start my server
1.1. Installation 9
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• Now you should be in the Jupyter Notebook
• Go to mydata and alwasy save your data under this folder
10 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• In the mydata folder, select New and then Python 3
Tip:
• The OpenSeesPy version on DesignSafe is not the latest.
• To update to the latest and import:
1.1. Installation 11
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• Now you can write OpenSeesPy script in Jupyter Notebook, run the script, and show results
• To show figure in the Notebook, you should include %matplotlib inline at the beginning
12 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Paraview in DesignSafe
Tip:
• Make sure the steps in OpenSeesPy in DesignSafe are completed.
Tip:
• Go to Workspace and select Visualizaion and Paraview.
Tip:
• In the Job Submission windows, you should select Working Directory, Maximum job runtime, Job
name, and Node Count, and click Run.
1.1. Installation 13
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• You can see the job status on the right
14 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• Wait until see this windows and connect to Paraview
1.1. Installation 15
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• Now open the pvd file in Paraview
16 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Tip:
• Initially, you see nothing
• Check the Pipeline Browser
• Click on the eye left to the file in Pipeline Browser
Tip:
• Change the Solid Color to other variables
• Change Surface to Surface With Edges
1.1. Installation 17
OpenSeesPy Documentation, Release 3.5.1.3
This is a real Linux subsystem for you to run OpenSeesPy Linux version on Windows.
Follow the instruction on here to install Windows Subsystem for Linux on Windows 10. There are a couple of Linux
distributions available and Ubuntu is recommended. Once the Linux is installed, it will show as an application in the
start menu.
18 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
• Run the subsystem from start menu and a terminal window will show.
~$ wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
~$ bash Anaconda3-2021.05-Linux-x86_64.sh
~$ /home/username/anaconda3/bin/jupyter-notebook
1.1. Installation 19
OpenSeesPy Documentation, Release 3.5.1.3
In Jupyter Notebook
20 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
• Run Anaconda with following command, where username is your username of your computer. Please use the
username shown in last step
~$ /home/username/anaconda3/bin/python3.8
1.1. Installation 21
OpenSeesPy Documentation, Release 3.5.1.3
• Run OpenSeesPy
First run Anaconda with
~$ /home/username/anaconda3/bin/python3.8
/home/username/anaconda3/bin/python3.8 script.py
1.2 Compilation
22 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
• Create Makefile.def
– Copy one of MAKES/Makefile.def.MacOS10.x to the root and rename to Makefile.def
– Change the path and variables for your system
• Compile
– Run make python -j from root
– The library file will be at SRC/interpreter/opensees.so
PhD Candidate
University of British Columbia
OpenSeesQt
A Qt build environment for OpenSees – Open System For Earthquake Engineering Simulation Pacific Earthquake
Engineering Research Center(http://opensees.berkeley.edu).
Qt is an open source, cross-platform development environment that is free for many uses. Please see the license.
1.2. Compilation 23
OpenSeesPy Documentation, Release 3.5.1.3
Dependency
The purpose of this project is to create a package that will allow aspiring developers to get started on writing code
without having to worry about the compilation environment. A program as large as OpenSees relies on many third-
party libraries, often referred to as dependencies. It can be a daunting task assembling, compiling, and linking these
libraries. Many times, these libraries depend on other libraries, and so on. The current list of dependencies includes:
• MUMPS (5.1.2)
• Scalapack (2.0.2.13)
• UMFPACK (5.7.7) contained in Suite-Sparse (5.3.0)
• SUPERLU (5.2.1)
• SUPERLUMT (3.0)
• SUPERLUDIST (5.1.0)
• Openblas (0.3.5)
• Parmetis (4.0.3)
• ARPACK (3.6.3)
• Libevent (2.1.8)
• GCC(8.2.0)
• TCL (8.6.9)** Tcl only
• Python(3.7.2)** OpenSeesPy only
Please ensure that your project complies with each library’s licensing requirements.
Another feature of this build platform is modularity. Developers can select from a list of build options that can be
turned on and off as required. The basic configuration builds the structural analysis core. Other build options include
parallel processing, reliability, and the particle finite element method (PFEM) modules. Python and Tcl interpreters
are additional build options. These options are located in single configuration file called qmake.conf. By default, the
environment is configured to build the core along with the parallel processing module. Other options can be turned on
by deleting the ‘#’symbol that precedes the option; this includes the option into the build environment.
Note: Note: This build environment comes with pre-compiled dependencies. Although this makes getting started
easier, the caveat is that your build environment (compiler version) must match that of the environment used to compile
the dependencies. The supported environments are listed below. There are no guarantees that it will work with other
build environments. In other words, make sure your compiler type and version (i.e., clang-1000.11.45.5) matches the
version below listed under the heading ‘Supported Build Environments’. Otherwise, bad things might happen. Also,
this project is still a work in progress. Currently, only building in OS X is supported. Windows support will be added
shortly. Moreover, not all build options are supported. For example, compiling with fortran is not supported.
Note: This project uses qmake and Qt Creator. qmake is a build tool for compiling and linking applications. Qt
Creator is a free IDE (interactive development environment) that bundles code writing/editing and application building
within one program. Qt Creator uses project (.pro) files. The project files contain all information required by qmake
to build an application.
24 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Getting started:
1. Download and install Qt open source from https://www.qt.io/download The version of the Qt library is not
important in this case since the library is not used in the OpenSees project (although I use Qt in other projects
and recommend it)
2. Download the OpenSeesQt source code into a folder of your choice (https://github.com/steva44/OpenSees/
archive/master.zip)
3. In the directory containing the code, double click on the ‘OpenSees.pro’ file. If compiling OpenSeesPy, open
the ‘OpenSeesPy.pro’ file. The .pro files are project files that will automatically open the project in Qt Creator.
4. Select a build configuration, for example ‘Desktop Qt 5.12.1 clang 64bit’. The project will automatically con-
figure itself. You only have to do this once.
5. The left-hand pane should now display the project directory structure. In the left-hand pane, under the heading
qmake, open the ‘qmake.conf’ file. Review and select additional build options, if any. Note that this is still a
work in progress and not all build options are supported.
6. Click on the ‘start’ button in the bottom lefthand corner of Qt Creator to compile. Clicking on the small computer
symbol above the start button allows for switching between the debug and release deploy configurations. The
release deployment results in faster program execution but it does not allow for debugging or stepping through
the code. The start button with the bug symbol opens the debugger.
7. Go and have a coffee, it will take a few minutes to finish compiling!
Building OpenSeesPy:
OpenSeesPy builds OpenSees as a library object that can be used within Python.
Steps: Follow steps 1-4 under the heading getting started above.
1. The left-hand pane should now display the project directory structure. In the left-hand pane, under the heading
qmake, open the ‘qmake.conf’ file. Under the heading #INTERPRETERS, uncomment the _PYTHON op-
tion by removing the ‘#’ symbol. Everything else should be configured automatically going forward. Python
automatically compiles with the reliability, parallel, and PFEM modules.
2. The last few lines at the end of the ‘OpenSeesPy.pro’ file contain the location of the Python framework. Update
this so that it matches the location of Python on your build system.
3. Click on the ‘start’ button in the bottom lefthand corner of Qt Creator to start compiling. Clicking on the
small computer symbol allows for switching between the debug and release deploy configurations. The release
deployment results in faster program execution but it does not allow for debugging or stepping through the code.
Build in release mode if using OpenSees as a library in a Python project.
4. Go and have a coffee, it will take a few minutes to finish compiling!
5. After successful compilation, the library will be in the ‘bin’ folder. The bin folder is located in the ‘build’ folder
which is created, by default, one directory higher than the OpenSeesQt source code. The name of the build
folder should look something like this: build-OpenSeesPy-Desktop_Qt_5_12_1_clang_64bit-Debug
6. OS X only
OS X automatically prepends a ‘lib’ to the library file. Remove this ‘lib’ and rename the file to be
‘opensees.dylib’ Next, a symbolic link is required for a Python project to import the library. To create a symbolic
link, cd the directory containing the OpenSees library in terminal and run the following command to create a
symbolic link:
ln -s opensees.dylib opensees.so
1.2. Compilation 25
OpenSeesPy Documentation, Release 3.5.1.3
There should now be a .so (shared object) file in addition to the .dylib file. Finally, copy both the .dylib and the .so
‘link’ into your python environment folder to import it into your project. Directions for using OpenSeesPy can be
found at the project website: https://openseespydoc.readthedocs.io/en/latest/index.html
OSX
Build Environment:
• OSX 10.14.3 (Mojave)
• Qt 5.12.1
• Qt Creator 4.8.1
Compiler:
• Apple LLVM version 10.0.0 (clang-1000.11.45.5)
• Target: x86_64-apple-darwin18.2.0
• Thread model: posix 64-BIT architecture
To find the version of clang on your computer, type the following in terminal:
clang --version
Note: This project comes with pre-built libraries for everything except Python. Therefore, you do not have to go
through the trouble of building any libraries unless you are using a special build system or you want to experiment.
The precompiled library files are located in the ‘OpenSeesLibs’ folder. In the event that you are feeling adventurous
and you want to compile the libraries on your own, instructions are given below for each library, for each operating
system. After successful compilation, note the installation directory. This directory contains the locations of the
‘include’ and ‘lib’ folders for that library. If replacing or adding new libraries, the file paths should be updated in
the ‘OpenSeesLibs.pri’ file. This is required so that the compiler knows where to find the header files and to link the
libraries to your project.
OSX
On OSX, the dependencies are built/installed with Homebrew. Homebrew is a free and open-source software pack-
age management system that simplifies the installation of software on Apple’s macOS operating system and Linux.
Homebrew maintains its own folder within /usr/local/ directory aptly named the 'Cellar':
/usr/local/Cellar/
Each dependency installed through Homebrew will have its own subfolder within the Cellar directory. Each subfolder
contains that dependencies 'include' and 'lib' folders.
MUMPS
MUltifrontal Massively Parallel sparse direct Solver, or MUMPS, is a sparse direct solver used for parallel solving of
a system of equations
Installing MUMPS via brew: Dominique Orban has written a Homebrew formula (http://brew.sh) for Mac OSX users.
Homebrew MUMPS is now available via the OpenBLAS tap. Build instructions are as follows:
In terminal, copy and paste each command individually and execute:
26 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
The options can be left blank, i.e., with default options so the last line will look like:
-Scalapack
OpenMPI
UMFPACK
UMFPACK is a set of routines for solving unsymmetric sparse linear systems of the form Ax=b, using the Unsym-
metric MultiFrontal method (Matrix A is not required to be symmetric). UMFPACK is part of suite-sparse library in
homebrew/science
In terminal, copy and paste each command individually and execute:
SUPERLU
SUPERLU is a general purpose library for the direct solution of large, sparse, nonsymmetric systems of linear equa-
tions. The library is written in C and is callable from either C or Fortran program. It uses MPI, OpenMP and CUDA
to support various forms of parallelism.
Installing SUPERLU via brew In terminal, copy and paste the following command and execute:
Should install by default with option --with-openmp enabled. Open MP is needed for parallel analysis.
SUPERLU requires the following dependencies that will automatically be installed:
1.2. Compilation 27
OpenSeesPy Documentation, Release 3.5.1.3
SUPERLUMT
SUPERLU but for for shared memory parallel machines. Provides Pthreads and OpenMP interfaces.
Installing SUPERLUMT via brew: In terminal, copy and paste the following command and execute:
SUPERLUDIST
SUPERLU but for for for distributed memory parallel machines. Supports manycore heterogeous node architecture:
MPI is used for interprocess communication, OpenMP is used for on-node threading, CUDA is used for computing on
GPUs.
Installing SUPERLUDIST via brew: In terminal, copy and paste the following command and execute:
LAPACK (SCALAPACK)
The Linear Algebra PACKage, or LAPACK, is written in Fortran 90 and provides routines for solving systems of
simultaneous linear equations, least-squares solutions of linear systems of equations, eigenvalue problems, and singu-
lar value problems.The associated matrix factorizations (LU, Cholesky, QR, SVD, Schur, generalized Schur) are also
provided, as are related computations such as reordering of the Schur factorizations and estimating condition numbers.
Dense and banded matrices are handled, but not general sparse matrices. In all areas, similar functionality is provided
for real and complex matrices, in both single and double precision.
LAPACK is given as a system library in OSX, you may have to update the locations of your system library in
‘OpenSeesLibs.pri’
BLAS
The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard building blocks for performing
basic vector and matrix operations.
BLAS is given as a system library in OSX, you may have to update the locations of your system library in
‘OpenSeesLibs.pri’
28 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
ARPACK
GCC
Many of the dependencies require fortran (there is still a lot of legacy fortran code floating around in the engineering
world). On OSX, I found the best solution is to use the pre-bundled fortran capabilities in the GNU compiler collection
or GCC. In addition to its fortran capabilities, GCC is a dependency for many other libraries.
Installing GCC via brew: In terminal, copy and paste the following command and execute:
PYTHON
MISC. NOTES
For the SUPERLU library. The file supermatrix.h throws an undefined error for the type int_t. It is actually defined
in the file slu_ddefs.h, but for some reason the compiler is not linking the two. Add the following line, copied from
slu_ddefs.h to supermatrix.h around line 17:
• Version ‘3.4.0.7‘<https://github.com/zhuminjie/OpenSeesPy/commit/169d1228baa23b5ea4f520fa3f6b6428dfb6d44e>_
– Update modalDamping command.
– Making rigid diaphragm work in X-Y plane for 2D models
– Making equalDOF use all DOFs if no DOFs are specified
– Reverted ViscousDamper and BilinearOilDamper
• Version ‘3.4.0.6‘<>_ * Add new pyversion command * Add new Series3D material wrapper * Add new
ten-node tetrahedron element * Rename getFixedNodes, getFixedDOFs, getConstrainedNodes,
getConstrainedDOFs, getRetainedNodes, getRetainedDOFs. * Add new ASDConcrete3D
Plastic-Damage model
• Version ‘3.4.0.5<https://github.com/zhuminjie/OpenSeesPy/tree/v3.4.0.5>‘_ (11/29/2022)
– update to commit.
– Fix ElasticBilin.
– Update SimpleFractureMaterial.
– Update ASDShellQ4 element.
– Update LineMesh so that last element nodes not flipped.
– Update BoucWenMaterial with parallel.
– Fix ElasticMaterial tangent.
– ZeroLength not require yaxis input for 2D and 3D models.
– Add a, b parameter in ENTMaterial.
– Add material testing command.
– Add HystereticSmooth and Hysteretic Asym materials.
– Update ElasticTimoshenkoBeam2D and ElasticTimoshenkoBeam3D
– Update PM4Sand and PM4Silt materials.
– Add ConcreteMcftNonlinear5 and ConcreteMcftNonlinear7 materials
– Add Elastic Isotropic thermal material
– Add Plate fiber thermal material
– Add J2PlasticityTermal material
– Add PlateRebarThermal material
– Add PlateFromPlaneStressThermal material
– Add beamWithHinges element
– Update Parallel and Series materials
– Update ElasticTubeSection3d
– Add HSSSectionIntegration
– Add FRCC material
– Add ElasticBDShearSection2d
– Add OpenSeesInfo variable
– Allow strings for section codes in SectionAggregator
– Add GNG Material
– Add Orthotropic material wrapper
– Update PFEM with SSI only structure
– Add getRVParamTag, getRVValue, gradPerformanceFunction for reliability
– Add '-ele' and '-node' to rayleigh command
30 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
32 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
34 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
The model or domain in OpenSees is a collection (an aggregation in object-oriented terms) of elements, nodes, single-
and multi-point constraints and load patterns. It is the aggregation of these components which define the type of model
that is being analyzed.
1. model command
2. element commands
3. node command
4. sp constraint commands
5. mp constraint commands
6. pressureConstraint command
7. timeSeries commands
8. pattern commands
9. mass command
10. region command
36 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
For example,
eleType = 'truss'
eleTag = 1
eleNodes = [iNode, jNode]
eleArgs = [A, matTag]
element(eleType, eleTag, *eleNodes, *eleArgs)
Zero-Length Element
1. zeroLength Element
2. zeroLengthND Element
3. zeroLengthSection Element
4. CoupledZeroLength Element
5. zeroLengthContact Element
6. zeroLengthContactNTS2D
7. zeroLengthInterface2D
8. zeroLengthImpact3D
zeroLength Element
element(’zeroLength’, eleTag, *eleNodes, ’-mat’, *matTags, ’-dir’, *dirs, <’-doRayleigh’, rFlag=0>, <’-
orient’, *vecx, *vecyp>)
This command is used to construct a zeroLength element object, which is defined by two nodes at the same
location. The nodes are connected by multiple UniaxialMaterial objects to represent the force-deformation
relationship for the element.
Note: If the optional orientation vectors are not specified, the local element axes coincide with the global axes.
Otherwise the local z-axis is defined by the cross product between the vectors x and yp vectors specified on the
command line.
See also:
Notes
zeroLengthND Element
38 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Note:
1. The zeroLengthND element only represents translational response between its nodes
2. If the NDMaterial object is of order two, the response lies in the element local x-y plane and the UniaxialMaterial
object may be used to represent the uncoupled behavior orthogonal to this plane, i.e. along the local z-axis.
3. If the NDMaterial object is of order three, the response is along each of the element local exes.
4. If the optional orientation vectors are not specified, the local element axes coincide with the global axes. Oth-
erwise the local z-axis is defined by the cross product between the vectors x and yp vectors specified on the
command line.
5. The valid queries to a zero-length element when creating an ElementRecorder object are ‘force’, ‘deformation’,
and ‘material matArg1 matArg2 . . . ’
See also:
Notes
zeroLengthSection Element
See also:
Notes
CoupledZeroLength Element
See also:
Notes
zeroLengthContact Element
40 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
zeroLengthContactNTS2D
Note:
1. The contact element is node-to-segment (NTS) contact. The relation follows Mohr-Coulomb frictional law:
𝑇 = 𝑁 × tan(𝜑), where 𝑇 is the tangential force, 𝑁 is normal force across the interface and 𝜑 is friction angle.
2. For 2D contact, slave nodes and master nodes must be 2 DOF and notice that the slave and master nodes must
be entered in counterclockwise order.
3. The resulting tangent from the contact element is non-symmetric. Switch to the non-symmetric matrix solver if
convergence problem is experienced.
4. As opposed to node-to-node contact, predefined normal vector for node-to-segment (NTS) element is not re-
quired because contact normal will be calculated automatically at each step.
5. contact element is implemented to handle large deformations.
See also:
Notes
zeroLengthInterface2D
Note:
1. The contact element is node-to-segment (NTS) contact. The relation follows Mohr-Coulomb frictional law:
𝑇 = 𝑁 × tan(𝜑), where 𝑇 is the tangential force, 𝑁 is normal force across the interface and 𝜑 is friction angle.
2. For 2D contact, slave nodes and master nodes must be 2 DOF and notice that the slave and master nodes must
be entered in counterclockwise order.
3. The resulting tangent from the contact element is non-symmetric. Switch to the non-symmetric matrix solver if
convergence problem is experienced.
4. As opposed to node-to-node contact, predefined normal vector for node-to-segment (NTS) element is not re-
quired because contact normal will be calculated automatically at each step.
5. contact element is implemented to handle large deformations.
See also:
Notes
zeroLengthImpact3D
element(’zeroLengthImpact3D’, eleTag, *eleNodes, direction, initGap, frictionRatio, Kt, Kn, Kn2, Delta_y,
cohesion)
This command constructs a node-to-node zero-length contact element in 3D space to simulate the im-
pact/pounding and friction phenomena.
42 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
initGap (float) Initial gap between master plane and slave plane
frictionRatio (float) Friction ratio in two tangential directions (parallel to
master and slave planes)
Kt (float) Penalty in two tangential directions
Kn (float) Penalty in normal direction (normal to master and
slave planes)
Kn2 (float) Penalty in normal direction after yielding based on
Hertz impact model
Delta_y (float) Yield deformation based on Hertz impact model
cohesion (float) Cohesion, if no cohesion, it is zero
Note:
1. This element has been developed on top of the “zeroLengthContact3D”. All the notes available in “zeroLength-
Contact3D” wiki page would apply to this element as well. It includes the definition of master and slave nodes,
the number of degrees of freedom in the domain, etc.
2. Regarding the number of degrees of freedom (DOF), the end nodes of this element should be defined in 3DOF
domain. For getting information on how to use 3DOF and 6DOF domain together, please refer to OpenSees
documentation and forums or see the zip file provided in the EXAMPLES section below.
3. This element adds the capabilities of “ImpactMaterial” to “zeroLengthContact3D.”
4. For simulating a surface-to-surface contact, the element can be defined for connecting the nodes on slave surface
to the nodes on master surface.
5. The element was found to be fast-converging and eliminating the need for extra elements and nodes in the
modeling process.
See also:
Notes
Truss Elements
1. Truss Element
2. Corotational Truss Element
Truss Element
This command is used to construct a truss element object. There are two ways to construct a truss element object:
Note:
1. The truss element DOES NOT include geometric nonlinearities, even when used with beam-columns utilizing
P-Delta or Corotational transformations.
2. When constructed with a UniaxialMaterial object, the truss element considers strain-rate effects, and is thus
suitable for use as a damping element.
3. The valid queries to a truss element when creating an ElementRecorder object are ‘axialForce,’ ‘forces,’ ‘lo-
calForce’, deformations,’ ‘material matArg1 matArg2. . . ,’ ‘section sectArg1 sectArg2. . . ’ There will be more
queries after the interface for the methods involved have been developed further.
See also:
Notes
This command is used to construct a corotational truss element object. There are two ways to construct a corotational
truss element object:
element(’corotTruss’, eleTag, *eleNodes, A, matTag, <’-rho’, rho>, <’-cMass’, cFlag>, <’-doRayleigh’,
rFlag>)
One way is to specify an area and a UniaxialMaterial identifier:
element(’corotTrussSection’, eleTag, *eleNodes, secTag, <’-rho’, rho>, <’-cMass’, cFlag>, <’-
doRayleigh’, rFlag>)
the other is to specify a Section identifier:
44 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Note:
1. When constructed with a UniaxialMaterial object, the corotational truss element considers strain-rate effects,
and is thus suitable for use as a damping element.
2. The valid queries to a truss element when creating an ElementRecorder object are ‘axialForce,’ ‘stiff,’ defor-
mations,’ ‘material matArg1 matArg2. . . ,’ ‘section sectArg1 sectArg2. . . ’ There will be more queries after the
interface for the methods involved have been developed further.
3. CorotTruss DOES NOT include Rayleigh damping by default.
See also:
Notes
Beam-Column Elements
This command is used to construct an elasticBeamColumn element object. The arguments for the construction of an
elastic beam-column element depend on the dimension of the problem, (ndm)
element(’elasticBeamColumn’, eleTag, *eleNodes, Area, E_mod, Iz, transfTag, <’-mass’, mass>, <’-
cMass’>, <’-release’, releaseCode>)
element(’elasticBeamColumn’, eleTag, *eleNodes, secTag, transfTag, <’-mass’, mass>, <’-cMass’>, <’-
release’, releaseCode>)
For a two-dimensional problem
element(’elasticBeamColumn’, eleTag, *eleNodes, Area, E_mod, G_mod, Jxx, Iy, Iz, transfTag, <’-mass’,
mass>, <’-cMass’>)
element(’elasticBeamColumn’, eleTag, *eleNodes, secTag, transfTag, <’-mass’, mass>, <’-cMass’> <’-
releasez’, releaseCode>, <’-releasey’, releaseCode>)
For a three-dimensional problem
See also:
Notes
This command is used to construct a ModElasticBeam2d element object. The arguments for the construction of an
elastic beam-column element with stiffness modifiers is applicable for 2-D problems. This element should be used for
modelling of a structural element with an equivalent combination of one elastic element with stiffness-proportional
damping, and two springs at its two ends with no stiffness proportional damping to represent a prismatic section. The
modelling technique is based on a number of analytical studies discussed in Zareian and Medina (2010) and Zareian
and Krawinkler (2009) and is utilized in order to solve problems related to numerical damping in dynamic analysis of
frame structures with concentrated plasticity springs.
element(’ModElasticBeam2d’, eleTag, *eleNodes, Area, E_mod, Iz, K11, K33, K44, transfTag, <’-mass’,
massDens>, <’-cMass’>)
46 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
This command is used to construct an ElasticTimoshenkoBeam element object. A Timoshenko beam is a frame
member that accounts for shear deformations. The arguments for the construction of an elastic Timoshenko beam
element depend on the dimension of the problem, ndm:
element(’ElasticTimoshenkoBeam’, eleTag, *eleNodes, E_mod, G_mod, Area, Iz, Avy, transfTag, <’-mass’,
massDens>, <’-cMass’>)
For a two-dimensional problem:
element(’ElasticTimoshenkoBeam’, eleTag, *eleNodes, E_mod, G_mod, Area, Iz, Jxx, Iy, Iz, Avy, Avz, trans-
fTag, <’-mass’, massDens>, <’-cMass’>)
For a three-dimensional problem:
See also:
Notes
This command is used to construct a forceBeamColumn element object, which is based on the non-iterative (or it-
erative) flexibility formulation. The locations and weights of the element integration points are based on so-called
plastic hinge integration, which allows the user to specify plastic hinge lenghts at the element ends. Two-point Gauss
integration is used on the element interior while two-point Gauss-Radau integration is applied over lengths of 4LpI
and 4LpJ at the element ends, viz. “modified Gauss-Radau plastic hinge integration”. A total of six integration points
are used in the element state determination (two for each hinge and two for the interior).
Users may be familiar with the beamWithHinges command format (see below); however, the format shown here allows
for the simple but important case of using a material nonlinear section model on the element interior. The previous
beamWithHinges command constrained the user to an elastic interior, which often led to unconservative estimates of
the element resisting force when plasticity spread beyond the plastic hinge regions in to the element interior.
The advantages of this new format over the previous beamWithHinges command are
• Plasticity can spread beyond the plastic hinge regions
• Hinges can form on the element interior, e.g., due to distributed member loads
To create a beam element with hinges, one has to use a forceBeamColumn element with following
beamIntegration().
Note:
• 'HingeRadau' – two-point Gauss-Radau applied to the hinge regions over 4LpI and 4LpJ (six element inte-
gration points)
• 'HingeRadauTwo' – two-point Gauss-Radau in the hinge regions applied over LpI and LpJ (six element
integration points)
• 'HingeMidpoint' – midpoint integration over the hinge regions (four element integration points)
• 'HingeEndpoint' – endpoint integration over the hinge regions (four element integration points)
See also:
For more information on the behavior, advantages, and disadvantages of these approaches to plastic hinge integration,
see
Scott, M.H. and G.L. Fenves. “Plastic Hinge Integration Methods for Force-Based Beam-Column Elements”, Journal
of Structural Engineering, 132(2):244-252, February 2006.
Scott, M.H. and K.L. Ryan. “Moment-Rotation Behavior of Force-Based Plastic Hinge Elements”, Earthquake Spec-
tra, 29(2):597-607, May 2013.
The primary advantages of HingeRadau are
• The user can specify a physically meaningful plastic hinge length
• The largest bending moment is captured at the element ends
• The exact numerical solution is recovered for a linear-elastic prismatic beam
• The characteristic length is equal to the user-specified plastic hinge length when deformations localize at the
element ends
while the primary disadvantages are
• The element post-yield response is too flexible for strain-hardening section response (consider using HingeR-
adauTwo)
• The user needs to know the plastic hinge length a priori (empirical equations are available)
48 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
dispBeamColumn
forceBeamColumn
nonlinearBeamColumn
See also:
Notes
50 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
Kolozvari K., Orakcal K., and Wallace J. W. (2015a). “New opensees models for simulating nonlin-
ear flexural and coupled shear-flexural behavior of RC walls and columns”, Computers and Structures,
Volume 196, February 2018, Pages 246-262, doi
and shear behavior of RC structural walls and columns under cyclic loading. The SFI_MVLEM element (Figure 1)
incorporates 2-D RC panel behavior described by the Fixed-Strut-Angle-Model (nDMaterial FSAM; Ulugtekin, 2010;
Orakcal et al., 2012), into a 2-D macroscopic fiber-based model (MVLEM). The interaction between axial and shear
behavior is captured at each RC panel (macro-fiber) level, which further incorporates interaction between shear and
flexural behavior at the SFI_MVLEM element level.
element(’SFI_MVLEM’, eleTag, *eleNodes, m, c, ’-thick’, *thick, ’-width’, *widths, ’-mat’, *mat_tags)
See also:
Notes
Kolozvari K., Orakcal K., and Wallace J. W. (2015a). “New opensees models for simulating nonlin-
ear flexural and coupled shear-flexural behavior of RC walls and columns”, Computers and Structures,
Volume 196, February 2018, Pages 246-262, doi
Kolozvari K., Orakcal K., and Wallace J. W. (2015a). ”Modeling of Cyclic Shear-Flexure Interaction
in Reinforced Concrete Structural Walls. I: Theory”, ASCE Journal of Structural Engineering, 141(5),
04014135 doi
Kolozvari K., Tran T., Orakcal K., and Wallace, J.W. (2015c). ”Modeling of Cyclic Shear-Flexure Inter-
action in Reinforced Concrete Structural Walls. II: Experimental Validation”, ASCE Journal of Structural
Engineering, 141(5), 04014136 doi
Kolozvari K., Orakcal K., and Wallace J. W. (2015c). “Shear-Flexure Interaction Modeling of reinforced
Concrete Structural Walls and Columns under Reversed Cyclic Loading”, Pacific Earthquake Engineering
Research Center, University of California, Berkeley, PEER Report No. 2015/12
Kolozvari K. (2013). “Analytical Modeling of Cyclic Shear-Flexure Interaction in Reinforced Concrete
Structural Walls”, PhD Dissertation, University of California, Los Angeles.
Joint Elements
1. BeamColumnJoint Element
2. ElasticTubularJoint Element
3. Joint2D Element
BeamColumnJoint Element
This command is used to construct a two-dimensional beam-column-joint element object. The element may be used
with both two-dimensional and three-dimensional structures; however, load is transferred only in the plane of the
element.
52 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
ElasticTubularJoint Element
This command is used to construct an ElasticTubularJoint element object, which models joint flexibility of tubular
joints in two dimensional analysis of any structure having tubular joints.
element(’ElasticTubularJoint’, eleTag, *eleNodes, Brace_Diameter, Brace_Angle, E, Chord_Diameter,
Chord_Thickness, Chord_Angle)
See also:
Notes
Joint2D Element
This command is used to construct a two-dimensional beam-column-joint element object. The two dimensional beam-
column joint is idealized as a parallelogram shaped shear panel with adjacent elements connected to its mid-points.
The midpoints of the parallelogram are referred to as external nodes. These nodes are the only analysis components
that connect the joint element to the surrounding structure.
element(’Joint2D’, eleTag, *eleNodes, <Mat1, Mat2, Mat3, Mat4>, MatC, LrgDspTag, <’-damage’, Dmg-
Tag>, <’-damage’, Dmg1 Dmg2 Dmg3 Dmg4 DmgC>)
54 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
Link Elements
This command is used to construct a twoNodeLink element object, which is defined by two nodes. The element can
have zero or non-zero length. This element can have 1 to 6 degrees of freedom, where only the transverse and rotational
degrees of freedom are coupled as long as the element has non-zero length. In addition, if the element length is larger
than zero, the user can optionally specify how the P-Delta moments around the local x- and y-axis are distributed
among a moment at node i, a moment at node j, and a shear couple. The sum of these three ratios is always equal to
1. In addition the shear center can be specified as a fraction of the element length from the iNode. The element does
not contribute to the Rayleigh damping by default. If the element has non-zero length, the local x-axis is determined
from the nodal geometry unless the optional x-axis vector is specified in which case the nodal geometry is ignored
and the user-defined orientation is utilized. It is important to recognize that if this element has zero length, it does not
consider the geometry as given by the nodal coordinates, but utilizes the user-defined orientation vectors to determine
the directions of the springs.
element(’twoNodeLink’, eleTag, *eleNodes, ’-mat’, *matTags, ’-dir’, *dir, <’-orient’, *vecx, *vecyp>, <’-
pDelta’, *pDeltaVals>, <’-shearDist’, *shearDist>, <’-doRayleigh’>, <’-mass’, m>)
See also:
Notes
Bearing Elements
56 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
11. LeadRubberX
12. HDR
13. RJ-Watson EQS Bearing Element
14. FPBearingPTV
This command is used to construct an elastomericBearing element object, which is defined by two nodes. The element
can have zero length or the appropriate bearing height. The bearing has unidirectional (2D) or coupled (3D) plasticity
properties for the shear deformations, and force-deformation behaviors defined by UniaxialMaterials in the remaining
two (2D) or four (3D) directions. By default (sDratio = 0.5) P-Delta moments are equally distributed to the two
end-nodes. To avoid the introduction of artificial viscous damping in the isolation system (sometimes referred to
as “damping leakage in the isolation system”), the bearing element does not contribute to the Rayleigh damping by
default. If the element has non-zero length, the local x-axis is determined from the nodal geometry unless the optional
x-axis vector is specified in which case the nodal geometry is ignored and the user-defined orientation is utilized.
element(’elastomericBearingPlasticity’, eleTag, *eleNodes, kInit, qd, alpha1, alpha2, mu, ’-P’, PMatTag,
’-Mz’, MzMatTag, <’-orient’, x1, x2, x3, y1, y2, y3>, <’-shearDist’, sDratio>, <’-doRayleigh’>,
<’-mass’, m>)
For a two-dimensional problem
element(’elastomericBearingPlasticity’, eleTag, *eleNodes, kInit, qd, alpha1, alpha2, mu, ’-P’, PMatTag,
’-T’, TMatTag, ’-My’, MyMatTag, ’-Mz’, MzMatTag, <’-orient’, <x1, x2, x3>, y1, y2, y3>, <’-
shearDist’, sDratio>, <’-doRayleigh’>, <’-mass’, m>)
For a three-dimensional problem
See also:
Notes
This command is used to construct an elastomericBearing element object, which is defined by two nodes. The element
can have zero length or the appropriate bearing height. The bearing has unidirectional (2D) or coupled (3D) plasticity
properties for the shear deformations, and force-deformation behaviors defined by UniaxialMaterials in the remaining
two (2D) or four (3D) directions. By default (sDratio = 0.5) P-Delta moments are equally distributed to the two
end-nodes. To avoid the introduction of artificial viscous damping in the isolation system (sometimes referred to
as “damping leakage in the isolation system”), the bearing element does not contribute to the Rayleigh damping by
default. If the element has non-zero length, the local x-axis is determined from the nodal geometry unless the optional
x-axis vector is specified in which case the nodal geometry is ignored and the user-defined orientation is utilized.
element(’ElastomericBearingBoucWen’, eleTag, *eleNodes, kInit, qd, alpha1, alpha2, mu, eta, beta,
gamma, ’-P’, PMatTag, ’-Mz’, MzMatTag, <’-orient’, *orientVals>, <’-shearDist’, shearDist>,
<’-doRayleigh’>, <’-mass’, mass>)
For a two-dimensional problem
element(’ElastomericBearingBoucWen’, eleTag, *eleNodes, kInit, qd, alpha1, alpha2, mu, eta, beta, gamma,
’-P’, PMatTag, ’-T’, TMatTag, ’-My’, MyMatTag, ’-Mz’, MzMatTag, <’-orient’, *orientVals>, <’-
shearDist’, shearDist>, <’-doRayleigh’>, <’-mass’, mass>)
For a three-dimensional problem
See also:
Notes
This command is used to construct a flatSliderBearing element object, which is defined by two nodes. The iNode rep-
resents the flat sliding surface and the jNode represents the slider. The element can have zero length or the appropriate
58 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
bearing height. The bearing has unidirectional (2D) or coupled (3D) friction properties for the shear deformations,
and force-deformation behaviors defined by UniaxialMaterials in the remaining two (2D) or four (3D) directions. To
capture the uplift behavior of the bearing, the user-specified UniaxialMaterial in the axial direction is modified for
no-tension behavior. By default (sDratio = 0.0) P-Delta moments are entirely transferred to the flat sliding surface (iN-
ode). It is important to note that rotations of the flat sliding surface (rotations at the iNode) affect the shear behavior
of the bearing. To avoid the introduction of artificial viscous damping in the isolation system (sometimes referred to
as “damping leakage in the isolation system”), the bearing element does not contribute to the Rayleigh damping by
default. If the element has non-zero length, the local x-axis is determined from the nodal geometry unless the optional
x-axis vector is specified in which case the nodal geometry is ignored and the user-defined orientation is utilized.
element(’flatSliderBearing’, eleTag, *eleNodes, frnMdlTag, kInit, ’-P’, PMatTag, ’-Mz’, MzMatTag, <’-
orient’, x1, x2, x3, y1, y2, y3>, <’-shearDist’, sDratio>, <’-doRayleigh’>, <’-mass’, m>, <’-
maxIter’, iter, tol>)
For a two-dimensional problem
element(’flatSliderBearing’, eleTag, *eleNodes, frnMdlTag, kInit, ’-P’, PMatTag, ’-T’, TMatTag, ’-My’, My-
MatTag, ’-Mz’, MzMatTag, <’-orient’, <x1, x2, x3>, y1, y2, y3>, <’-shearDist’, sDratio>, <’-
doRayleigh’>, <’-mass’, m>, <’-iter’, maxIter, tol>)
For a three-dimensional problem
See also:
Notes
This command is used to construct a singleFPBearing element object, which is defined by two nodes. The iNode
represents the concave sliding surface and the jNode represents the articulated slider. The element can have zero
length or the appropriate bearing height. The bearing has unidirectional (2D) or coupled (3D) friction properties (with
post-yield stiffening due to the concave sliding surface) for the shear deformations, and force-deformation behaviors
defined by UniaxialMaterials in the remaining two (2D) or four (3D) directions. To capture the uplift behavior of
the bearing, the user-specified UniaxialMaterial in the axial direction is modified for no-tension behavior. By default
(sDratio = 0.0) P-Delta moments are entirely transferred to the concave sliding surface (iNode). It is important to note
that rotations of the concave sliding surface (rotations at the iNode) affect the shear behavior of the bearing. To avoid
the introduction of artificial viscous damping in the isolation system (sometimes referred to as “damping leakage in
the isolation system”), the bearing element does not contribute to the Rayleigh damping by default. If the element has
non-zero length, the local x-axis is determined from the nodal geometry unless the optional x-axis vector is specified
in which case the nodal geometry is ignored and the user-defined orientation is utilized.
element(’singleFPBearing’, eleTag, *eleNodes, frnMdlTag, Reff, kInit, ’-P’, PMatTag, ’-Mz’, MzMatTag, <’-
orient’, x1, x2, x3, y1, y2, y3>, <’-shearDist’, sDratio>, <’-doRayleigh’>, <’-mass’, m>, <’-iter’,
maxIter, tol>)
For a two-dimensional problem
element(’singleFPBearing’, eleTag, *eleNodes, frnMdlTag, Reff, kInit, ’-P’, PMatTag, ’-T’, TMatTag, ’-My’,
MyMatTag, ’-Mz’, MzMatTag, <’-orient’, <x1, x2, x3>, y1, y2, y3>, <’-shearDist’, sDratio>, <’-
doRayleigh’>, <’-mass’, m>, <’-iter’, maxIter, tol>)
For a three-dimensional problem
See also:
Notes
This command is used to construct a Triple Friction Pendulum Bearing element object, which is defined by two nodes.
The element can have zero length or the appropriate bearing height. The bearing has unidirectional (2D) or coupled
(3D) friction properties (with post-yield stiffening due to the concave sliding surface) for the shear deformations,
and force-deformation behaviors defined by UniaxialMaterials in the remaining two (2D) or four (3D) directions. To
capture the uplift behavior of the bearing, the user-specified UniaxialMaterial in the axial direction is modified for
no-tension behavior. P-Delta moments are entirely transferred to the concave sliding surface (iNode). It is important
to note that rotations of the concave sliding surface (rotations at the iNode) affect the shear behavior of the bearing.
If the element has non-zero length, the local x-axis is determined from the nodal geometry unless the optional x-axis
vector is specified in which case the nodal geometry is ignored and the user-defined orientation is utilized.
60 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
element(’TFP’, eleTag, *eleNodes, R1, R2, R3, R4, Db1, Db2, Db3, Db4, d1, d2, d3, d4, mu1, mu2, mu3,
mu4, h1, h2, h3, h4, H0, colLoad, <K>)
See also:
Notes
See also:
Notes
MultipleShearSpring Element
This command is used to construct a multipleShearSpring (MSS) element object, which is defined by two nodes. This
element consists of a series of identical shear springs arranged radially to represent the isotropic behavior in the local
y-z plane.
element(’multipleShearSpring’, eleTag, *eleNodes, nSpring, ’-mat’, matTag, <’-lim’, lim>, <’-orient’, <x1,
x2, x3>, yp1, yp2, yp3>, <’-mass’, mass>)
62 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Note: If dsp is positive and the shear deformation of MSS exceeds dsp, this element calculates equivalent coefficient
to adjust force and stiffness of MSS. The adjusted MSS force and stiffness reproduce the behavior of the previously
defined uniaxial material under monotonic loading in every direction. If dsp is zero, the element does not calculate
the equivalent coefficient.
See also:
Notes
KikuchiBearing Element
This command is used to construct a KikuchiBearing element object, which is defined by two nodes. This element
consists of multiple shear spring model (MSS) and multiple normal spring model (MNS).
element(’KikuchiBearing’, eleTag, *eleNodes, ’-shape’, shape, ’-size’, size, totalRubber, <’-totalHeight’,
totalHeight>, ’-nMSS’, nMSS, ’-matMSS’, matMSSTag, <’-limDisp’, limDisp>, ’-nMNS’, nMNS,
’-matMNS’, matMNSTag, <’-lambda’, lambda>, <’-orient’, <x1, x2, x3>, yp1, yp2, yp3>, <’-
mass’, m>, <’-noPDInput’>, <’-noTilt’>, <’-adjustPDOutput’, ci, cj>, <’-doBalance’, limFo,
limFi, nIter>)
See also:
Notes
YamamotoBiaxialHDR Element
This command is used to construct a YamamotoBiaxialHDR element object, which is defined by two nodes. This
element can be used to represent the isotropic behavior of high-damping rubber bearing in the local y-z plane.
element(’YamamotoBiaxialHDR’, eleTag, *eleNodes, Tp, DDo, DDi, Hr, <’-coRS‘, cr, cs>, <’-orient‘,
*vecx, *vecyp>, <’-mass‘, m>)
64 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
ElastomericX
This command is used to construct an ElastomericX bearing element object in three-dimension. The 3D continuum
geometry of an elastomeric bearing is modeled as a 2-node, 12 DOF discrete element. This elements extends the
formulation of Elastomeric_Bearing_(Bouc-Wen)_Element element. However, instead of the user providing material
models as input arguments, it only requires geometric and material properties of an elastomeric bearing as arguments.
The material models in six direction are formulated within the element from input arguments. The time-dependent val-
ues of mechanical properties (e.g., shear stiffness, buckling load capacity) can also be recorded using the “parameters”
recorder.
element(’ElastomericX’, eleTag, *eleNodes, Fy, alpha, Gr, Kbulk, D1, D2, ts, tr, n, <<x1, x2, x3>, y1, y2,
y3>, <kc>, <PhiM>, <ac>, <sDratio>, <m>, <cd>, <tc>, <tag1>, <tag2>, <tag3>, <tag4>)
For 3D problem
Note: Because default values of heating parameters are in SI units, user must override the default heating parameters
values if using Imperial units
User should distinguish between yield strength of elastomeric bearing (𝐹𝑦 ) and characteristic strength (𝑄𝑑 ): 𝑄𝑑 =
𝐹𝑦 * (1 − 𝑎𝑙𝑝ℎ𝑎)
See also:
Notes
LeadRubberX
This command is used to construct a LeadRubberX bearing element object in three-dimension. The 3D continuum
geometry of a lead rubber bearing is modeled as a 2-node, 12 DOF discrete element. It extends the formulation of
ElastomericX by including strength degradation in lead rubber bearing due to heating of the lead-core. The Lead-
RubberX element requires only the geometric and material properties of an elastomeric bearing as arguments. The
material models in six direction are formulated within the element from input arguments. The time-dependent values
of mechanical properties (e.g., shear stiffness, buckling load capacity, temperature in the lead-core, yield strength) can
also be recorded using the “parameters” recorder.
element(’LeadRubberX’, eleTag, *eleNodes, Fy, alpha, Gr, Kbulk, D1, D2, ts, tr, n, <<x1, x2, x3>, y1, y2,
y3>, <kc>, <PhiM>, <ac>, <sDratio>, <m>, <cd>, <tc>, <qL>, <cL>, <kS>, <aS>, <tag1>,
<tag2>, <tag3>, <tag4>, <tag5>)
66 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Note: Because default values of heating parameters are in SI units, user must override the default heating parameters
values if using Imperial units
User should distinguish between yield strength of elastomeric bearing (𝐹𝑦 ) and characteristic strength (𝑄𝑑 ): 𝑄𝑑 =
𝐹𝑦 * (1 − 𝑎𝑙𝑝ℎ𝑎)
See also:
Notes
HDR
This command is used to construct an HDR bearing element object in three-dimension. The 3D continuum geometry
of an high damping rubber bearing is modeled as a 2-node, 12 DOF discrete element. This is the third element in the
series of elements developed for analysis of base-isolated structures under extreme loading (others being ElastomericX
and LeadRubberX). The major difference between HDR element with ElastomericX is the hysteresis model in shear.
The HDR element uses a model proposed by Grant et al. (2004) to capture the shear behavior of a high damping
rubber bearing. The time-dependent values of mechanical properties (e.g., vertical stiffness, buckling load capacity)
can also be recorded using the “parameters” recorder.
element(’HDR’, eleTag, *eleNodes, Gr, Kbulk, D1, D2, ts, tr, n, a1, a2, a3, b1, b2, b3, c1, c2, c3, c4, <<x1,
x2, x3>, y1, y2, y3>, <kc>, <PhiM>, <ac>, <sDratio>, <m>, <tc>)
For 3D problem
See also:
Notes
This command is used to construct a RJWatsonEqsBearing element object, which is defined by two nodes. The iNode
represents the masonry plate and the jNode represents the sliding surface plate. The element can have zero length or
the appropriate bearing height. The bearing has unidirectional (2D) or coupled (3D) friction properties (with post-
yield stiffening due to the mass-energy-regulator (MER) springs) for the shear deformations, and force-deformation
behaviors defined by UniaxialMaterials in the remaining two (2D) or four (3D) directions. To capture the uplift
behavior of the bearing, the user-specified UniaxialMaterial in the axial direction is modified for no-tension behavior.
By default (sDratio = 1.0) P-Delta moments are entirely transferred to the sliding surface (jNode). It is important to
note that rotations of the sliding surface (rotations at the jNode) affect the shear behavior of the bearing. To avoid the
introduction of artificial viscous damping in the isolation system (sometimes referred to as “damping leakage in the
isolation system”), the bearing element does not contribute to the Rayleigh damping by default. If the element has
non-zero length, the local x-axis is determined from the nodal geometry unless the optional x-axis vector is specified
in which case the nodal geometry is ignored and the user-defined orientation is utilized.
element(’RJWatsonEqsBearing’, eleTag, *eleNodes, frnMdlTag, kInit, ’-P’, PMatTag, ’-Vy’, VyMatTag, ’-
Mz’, MzMatTag, <’-orient’, x1, x2, x3, y1, y2, y3>, <’-shearDist’, sDratio>, <’-doRayleigh’>,
<’-mass’, m>, <’-iter’, maxIter, tol>)
For a two-dimensional problem
element(’RJWatsonEqsBearing’, eleTag, *eleNodes, frnMdlTag, kInit, ’-P’, PMatTag, ’-Vy’, VyMatTag, ’-
Vz’, VzMatTag, ’-T’, TMatTag, ’-My’, MyMatTag, ’-Mz’, MzMatTag, <’-orient’, <x1, x2, x3>, y1,
y2, y3>, <’-shearDist’, sDratio>, <’-doRayleigh’>, <’-mass’, m>, <’-iter’, maxIter, tol>)
68 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
FPBearingPTV
The FPBearingPTV command creates a single Friction Pendulum bearing element, which is capable of accounting for
the changes in the coefficient of friction at the sliding surface with instantaneous values of the sliding velocity, axial
pressure and temperature at the sliding surface. The constitutive modelling is similar to the existing singleFPBear-
ing element, otherwise. The FPBearingPTV element has been verified and validated in accordance with the ASME
guidelines, details of which are presented in Chapter 4 of Kumar et al. (2015a).
70 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
Quadrilateral Elements
1. Quad Element
2. Shell Element
3. ShellDKGQ
4. ShellDKGT
5. ShellNLDKGQ
6. ShellNLDKGT
7. ShellNL
8. Bbar Plane Strain Quadrilateral Element
9. Enhanced Strain Quadrilateral Element
10. SSPquad Element
11. MVLEM_3D - 3-D MVLEM Element for Flexure-Dominated RC Walls
12. SFI_MVLEM_3D - 3-D Shear-Flexure-Interaction Element for RC Walls
Quad Element
This command is used to construct a FourNodeQuad element object which uses a bilinear isoparametric formulation.
element(’quad’, eleTag, *eleNodes, thick, type, matTag, <pressure=0.0, rho=0.0, b1=0.0, b2=0.0>)
Note:
1. Consistent nodal loads are computed from the pressure and body forces.
2. The valid queries to a Quad element when creating an ElementRecorder object are ‘forces’, ‘stresses,’ and
‘material $matNum matArg1 matArg2 . . . ’ Where $matNum refers to the material object at the integration
point corresponding to the node numbers in the isoparametric domain.
See also:
Notes
Shell Element
This command is used to construct a ShellMITC4 element object, which uses a bilinear isoparametric formulation in
combination with a modified shear interpolation to improve thin-plate bending performance.
element(’ShellMITC4’, eleTag, *eleNodes, secTag)
Note:
1. The valid queries to a Quad element when creating an ElementRecorder object are ‘forces’, ‘stresses,’ and
‘material $matNum matArg1 matArg2 . . . ’ Where $matNum refers to the material object at the integration
point corresponding to the node numbers in the isoparametric domain.
2. It is a 3D element with 6 dofs and CAN NOT be used in 2D domain.
See also:
Notes
ShellDKGQ
This command is used to construct a ShellDKGQ element object, which is a quadrilateral shell element based on the
theory of generalized conforming element.
element(’ShellDKGQ’, eleTag, *eleNodes, secTag)
See also:
Notes
72 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
ShellDKGT
This command is used to construct a ShellDKGT element object, which is a triangular shell element based on the
theory of generalized conforming element.
element(’ShellDKGT’, eleTag, *eleNodes, secTag)
See also:
Notes
ShellNLDKGQ
This command is used to construct a ShellNLDKGQ element object accounting for the geometric nonlinearity of large
deformation using the updated Lagrangian formula, which is developed based on the ShellDKGQ element.
element(’ShellNLDKGQ’, eleTag, *eleNodes, secTag)
See also:
Notes
ShellNLDKGT
This command is used to construct a ShellNLDKGT element object accounting for the geometric nonlinearity of large
deformation using the updated Lagrangian formula, which is developed based on the ShellDKGT element.
element(’ShellNLDKGT’, eleTag, *eleNodes, secTag)
See also:
Notes
ShellNL
See also:
Notes
This command is used to construct a four-node quadrilateral element object, which uses a bilinear isoparametric
formulation along with a mixed volume/pressure B-bar assumption. This element is for plane strain problems only.
element(’bbarQuad’, eleTag, *eleNodes, thick, matTag)
Note:
1. PlainStrain only.
2. The valid queries to a Quad element when creating an ElementRecorder object are ‘forces’, ‘stresses,’ and
‘material $matNum matArg1 matArg2 . . . ’ Where $matNum refers to the material object at the integration
point corresponding to the node numbers in the isoparametric domain.
74 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
This command is used to construct a four-node quadrilateral element, which uses a bilinear isoparametric formulation
with enhanced strain modes.
element(’enhancedQuad’, eleTag, *eleNodes, thick, type, matTag)
See also:
Notes
SSPquad Element
The SSPquad element is a four-node quadrilateral element using physically stabilized single-point integration
(SSP –> Stabilized Single Point). The stabilization incorporates an assumed strain field in which the volu-
metric dilation and the shear strain associated with the the hourglass modes are zero, resulting in an element
which is free from volumetric and shear locking. The elimination of shear locking results in greater coarse
mesh accuracy in bending dominated problems, and the elimination of volumetric locking improves accuracy
in nearly-incompressible problems. Analysis times are generally faster than corresponding full integration el-
ements. The formulation for this element is identical to the solid phase portion of the SSPquadUP element as
described by McGann et al. (2012).
Note:
1. Valid queries to the SSPquad element when creating an ElementalRecorder object correspond to those for the
nDMaterial object assigned to the element (e.g., ‘stress’, ‘strain’). Material response is recorded at the single
integration point located in the center of the element.
2. The SSPquad element was designed with intentions of duplicating the functionality of the Quad Element. If
an example is found where the SSPquad element cannot do something that works for the Quad Element, e.g.,
material updating, please contact the developers listed below so the bug can be fixed.
See also:
Notes
The MVLEM_3D model (Figure 1a) is a three-dimensional four-node element with 24 DOFs for nonlinear analy-
sis of flexure-controlled non-rectangular reinforced concrete walls subjected to multidirectional loading. The model
is an extension of the two-dimensional, two-node Multiple-Vertical-Line-Element-Model (MVLEM). The baseline
MVLEM, which is essentially a line element for rectangular walls subjected to in-plane loading, is extended to a
three-dimensional model formulation by: 1) applying geometric transformation of the element in-plane degrees of
freedom that convert it into a four-node element formulation (Figure 1b), as well as by incorporating linear elastic
out-of-plane behavior based on the Kirchhoff plate theory (Figure 1c). The in-plane and the out-of-plane element
behaviors are uncoupled in the present model.
This element shall be used in Domain defined with -ndm 3 -ndf 6.
element(’MVLEM_3D’, eleTag, *eleNodes, m, ’-thick’, *thick, ’-width’, *widths, ’-rho’, *rho, ’-
matConcrete’, *matConcreteTags, ’-matSteel’, *matSteelTags, ’-matShear’, matShearTag, <’-
CoR’, c>, <’-ThickMod’, tMod>, <’-Poisson’, Nu>, <’-Density’, Dens>)
76 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
More information available HERE and in the following reference:
K. Kolozvari, K. Kalbasi, K. Orakcal & J. W. Wallace, “Three-Dimensional Model for Nonlinear Analysis of
Slender Flanged Reinforced Concrete Walls”, Engineering Structures, Volume 236, 1 June 2021, 112105.
The SFI-MVLEM-3D model (Figure 1a) is a three-dimensional four-node element with 24 DOFs that incorporates
axial-flexural-shear interaction and can be used for nonlinear analysis of non-rectangular reinforced concrete walls
subjected to multidirectional loading. The SFI-MVLEM-3D model is an extension of the two-dimensional, two-
node Shear-Flexure-Interaction Multiple-Vertical-Line-Element-Model (SFI-MVLEM). The baseline SFI-MVLEM,
which is essentially a line element for rectangular walls subjected to in-plane loading, is extended in this study to a
three-dimensional model formulation by applying geometric transformation of the element degrees of freedom that
converted it into a four-node element formulation (Figure 1b), as well as by incorporating linear elastic out-of-plane
behavior based on the Kirchhoff plate theory (Figure 1c). The in-plane and the out-of-plane element behaviors are
uncoupled in the present model.
This element shall be used in Domain defined with -ndm 3 -ndf 6.
See also:
More information available HERE and in the following reference:
78 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
K. Kolozvari, K. Kalbasi, K. Orakcal & J. W. Wallace, “Three-Dimensional Shear-Flexure Interaction Model for
Analysis of Non-Planar Reinforced Concrete Walls”, Journal of Building Engineering, Volume 44, December
2021, 102946.
Triangular Elements
1. Tri31 Element
Tri31 Element
This command is used to construct a constant strain triangular element (Tri31) which uses three nodes and one inte-
gration points.
element(’Tri31’, eleTag, *eleNodes, thick, type, matTag, <pressure, rho, b1, b2>)
Note:
1. Consistent nodal loads are computed from the pressure and body forces.
2. The valid queries to a Tri31 element when creating an ElementRecorder object are ‘forces’, ‘stresses,’ and
‘material $matNum matArg1 matArg2 . . . ’ Where $matNum refers to the material object at the integration
point corresponding to the node numbers in the domain.
See also:
Notes
Brick Elements
This element is used to construct an eight-node brick element object, which uses a trilinear isoparametric formulation.
element(’stdBrick’, eleTag, *eleNodes, matTag, <b1, b2, b3>)
Note:
1. The valid queries to a Brick element when creating an ElementRecorder object are ‘forces’, ‘stresses,’ (‘strains’
version > 2.2.0) and ‘material $matNum matArg1 matArg2 . . . ’ Where $matNum refers to the material object
at the integration point corresponding to the node numbers in the isoparametric domain.
2. This element can only be defined in -ndm 3 -ndf 3
See also:
Notes
This command is used to construct an eight-node mixed volume/pressure brick element object, which uses a trilinear
isoparametric formulation.
element(’bbarBrick’, eleTag, *eleNodes, matTag, <b1, b2, b3>)
Note:
1. Node numbering for this element is different from that for the eight-node brick (Brick8N) element.
2. The valid queries to a Quad element when creating an ElementRecorder object are ‘forces’, ‘stresses’, ‘strains’,
and ‘material $matNum matArg1 matArg2 . . . ’ Where $matNum refers to the material object at the integration
point corresponding to the node numbers in the isoparametric domain.
See also:
Notes
80 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Note: The valid queries to a 20NodeBrick element when creating an ElementRecorder object are ‘force,’ ‘stiffness,’
stress’, ‘gausspoint’ or ‘plastic’. The output is given as follows:
1. ‘stress’
the six stress components from each Gauss points are output by the order: sigma_xx, sigma_yy, sigma_zz,
sigma_xy, sigma_xz,sigma_yz
2. ‘gausspoint’
the coordinates of all Gauss points are printed out
3. ‘plastic’
the equivalent deviatoric plastic strain from each Gauss point is output in the same order as the coordinates are
printed
See also:
Notes
SSPbrick Element
The SSPbrick element is an eight-node hexahedral element using physically stabilized single-point integration (SSP –>
Stabilized Single Point). The stabilization incorporates an enhanced assumed strain field, resulting in an element which
is free from volumetric and shear locking. The elimination of shear locking results in greater coarse mesh accuracy in
bending dominated problems, and the elimination of volumetric locking improves accuracy in nearly-incompressible
problems. Analysis times are generally faster than corresponding full integration elements.
Note:
1. Valid queries to the SSPbrick element when creating an ElementalRecorder object correspond to those for the
nDMaterial object assigned to the element (e.g., ‘stress’, ‘strain’). Material response is recorded at the single
integration point located in the center of the element.
2. The SSPbrick element was designed with intentions of duplicating the functionality of the stdBrick Element. If
an example is found where the SSPbrick element cannot do something that works for the stdBrick Element, e.g.,
material updating, please contact the developers listed below so the bug can be fixed.
See also:
Notes
Tetrahedron Elements
1. FourNodeTetrahedron
FourNodeTetrahedron
This command is used to construct a standard four-node tetrahedron element objec with one-point Gauss integration.
element(’FourNodeTetrahedron’, eleTag, *eleNodes, matTag, <b1, b2, b3>)
See also:
Notes
FourNodeQuadUP is a four-node plane-strain element using bilinear isoparametric formulation. This element is im-
plemented for simulating dynamic response of solid-fluid fully coupled material, based on Biot’s theory of porous
medium. Each element node has 3 degrees-of-freedom (DOF): DOF 1 and 2 for solid displacement (u) and DOF 3 for
fluid pressure (p).
82 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
element(’quadUP’, eleTag, *eleNodes, thick, matTag, bulk, fmass, hPerm, vPerm, <b1=0, b2=0, t=0>)
See also:
Notes
BrickUP is an 8-node hexahedral linear isoparametric element. Each node has 4 degrees-of-freedom (DOF): DOFs 1
to 3 for solid displacement (u) and DOF 4 for fluid pressure (p). This element is implemented for simulating dynamic
response of solid-fluid fully coupled material, based on Biot’s theory of porous medium.
element(’brickUP’, eleTag, *eleNodes, matTag, bulk, fmass, permX, permY, permZ, <bX=0, bY=0, bZ=0>)
See also:
Notes
bbarQuadUP is a four-node plane-strain mixed volume/pressure element, which uses a tri-linear isoparametric for-
mulation. This element is implemented for simulating dynamic response of solid-fluid fully coupled material, based
on Biot’s theory of porous medium. Each element node has 3 degrees-of-freedom (DOF): DOF 1 and 2 for solid
displacement (u) and DOF 3 for fluid pressure (p).
element(’bbarQuadUP’, eleTag, *eleNodes, thick, matTag, bulk, fmass, hPerm, vPerm, <b1=0, b2=0, t=0>)
84 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
bbarBrickUP is a 8-node mixed volume/pressure element, which uses a tri-linear isoparametric formulation.
Each node has 4 degrees-of-freedom (DOF): DOFs 1 to 3 for solid displacement (u) and DOF 4 for fluid pressure (p).
This element is implemented for simulating dynamic response of solid-fluid fully coupled material, based on Biot’s
theory of porous medium.
element(’bbarBrickUP’, eleTag, *eleNodes, matTag, bulk, fmass, permX, permY, permZ, <bX=0, bY=0,
bZ=0>)
See also:
Notes
Nine_Four_Node_QuadUP is a 9-node quadrilateral plane-strain element. The four corner nodes have 3 degrees-of-
freedom (DOF) each: DOF 1 and 2 for solid displacement (u) and DOF 3 for fluid pressure (p). The other five nodes
have 2 DOFs each for solid displacement. This element is implemented for simulating dynamic response of solid-fluid
fully coupled material, based on Biot’s theory of porous medium.
element(’9_4_QuadUP’, eleTag, *eleNodes, thick, matTag, bulk, fmass, hPerm, vPerm, <b1=0, b2=0>)
86 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
See also:
Notes
See also:
Notes
1. SSPquadUP Element
2. SSPbrickUP Element
SSPquadUP Element
The SSPquadUP element is an extension of the SSPquad Element for use in dynamic plane strain
analysis of fluid saturated porous media. A mixed displacement-pressure (u-p) formulation is used,
based upon the work of Biot as extended by Zienkiewicz and Shiomi (1984).
The physical stabilization necessary to allow for reduced integration incorporates an assumed strain field in which the
volumetric dilation and the shear strain associated with the the hourglass modes are zero, resulting in an element which
is free from volumetric and shear locking. The elimination of shear locking results in greater coarse mesh accuracy in
bending dominated problems, and the elimination of volumetric locking improves accuracy in nearly-incompressible
problems. Analysis times are generally faster than corresponding full integration elements.
Equal-order interpolation is used for the displacement and pressure fields, thus, the SSPquadUP element does not
inherently pass the inf-sup condition, and is not fully acceptable in the incompressible-impermeable limit (the QuadUP
Element has the same issue). A stabilizing parameter is employed to permit the use of equal-order interpolation for
the SSPquadUP element. This parameter $alpha can be computed as
where h is the element size, c is the speed of elastic wave propagation in the solid phase, and den is the mass density
of the solid phase. The $alpha parameter should be a small number. With a properly defined $alpha parameter, the
SSPquadUP element can produce comparable results to a higher-order element such as the 9_4_QuadUP Element at a
significantly lower computational cost and with a greater ease in mesh generation.
The full formulation for the SSPquadUP element can be found in McGann et al. (2012) along with several example
applications.
Note:
1. The SSPquadUP element will only work in dynamic analysis.
2. For saturated soils, the mass density input into the associated nDMaterial object should be the saturated mass
density.
3. When modeling soil, the body forces input into the SSPquadUP element should be the components of the
gravitational vector, not the unit weight.
4. Fixing the pore pressure degree-of-freedom (dof 3) at a node is a drainage boundary condition at which zero
pore pressure will be maintained throughout the analysis. Leaving the third dof free allows pore pressures to
build at that node.
5. Valid queries to the SSPquadUP element when creating an ElementalRecorder object correspond to those for
the nDMaterial object assigned to the element (e.g., ‘stress’, ‘strain’). Material response is recorded at the single
integration point located in the center of the element.
88 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
6. The SSPquadUP element was designed with intentions of duplicating the functionality of the QuadUP Element.
If an example is found where the SSPquadUP element cannot do something that works for the QuadUP Element,
e.g., material updating, please contact the developers listed below so the bug can be fixed.
See also:
Notes
SSPbrickUP Element
The SSPbrickUP element is an extension of the SSPbrick Element for use in dynamic 3D analysis of fluid saturated
porous media. A mixed displacement-pressure (u-p) formulation is used, based upon the work of Biot as extended by
Zienkiewicz and Shiomi (1984).
The physical stabilization necessary to allow for reduced integration incorporates an enhanced assumed strain field,
resulting in an element which is free from volumetric and shear locking. The elimination of shear locking results in
greater coarse mesh accuracy in bending dominated problems, and the elimination of volumetric locking improves
accuracy in nearly-incompressible problems. Analysis times are generally faster than corresponding full integration
elements.
Equal-order interpolation is used for the displacement and pressure fields, thus, the SSPbrickUP element does not
inherently pass the inf-sup condition, and is not fully acceptable in the incompressible-impermeable limit (the brickUP
Element has the same issue). A stabilizing parameter is employed to permit the use of equal-order interpolation for
the SSPbrickUP element. This parameter $alpha can be computed as
where ℎ is the element size, and 𝐾𝑠 and 𝐺𝑠 are the bulk and shear moduli for the solid phase. The 𝛼 parameter should
be a small number. With a properly defined 𝛼 parameter, the SSPbrickUP element can produce comparable results
to a higher-order element such as the 20_8_BrickUP Element at a significantly lower computational cost and with a
greater ease in mesh generation.
Note:
1. The SSPbrickUP element will only work in dynamic analysis.
2. For saturated soils, the mass density input into the associated nDMaterial object should be the saturated mass
density.
3. When modeling soil, the body forces input into the SSPbrickUP element should be the components of the
gravitational vector, not the unit weight.
4. Fixing the pore pressure degree-of-freedom (dof 4) at a node is a drainage boundary condition at which zero
pore pressure will be maintained throughout the analysis. Leaving the fourth dof free allows pore pressures to
build at that node.
5. Valid queries to the SSPbrickUP element when creating an ElementalRecorder object correspond to those for
the nDMaterial object assigned to the element (e.g., ‘stress’, ‘strain’). Material response is recorded at the single
integration point located in the center of the element.
6. The SSPbrickUP element was designed with intentions of duplicating the functionality of the brickUP Element.
If an example is found where the SSPbrickUP element cannot do something that works for the brickUP Element,
e.g., material updating, please contact the developers listed below so the bug can be fixed.
See also:
Notes
Contact Elements
1. SimpleContact2D
2. SimpleContact3D
3. BeamContact2D
4. BeamContact3D
5. BeamEndContact3D
SimpleContact2D
The SimpleContact2D element is a two-dimensional node-to-segment contact element which defines a frictional con-
tact interface between two separate bodies. The master nodes are the nodes which define the endpoints of a line
segment on the first body, and the slave node is a node from the second body. The Lagrange multiplier node is
required to enforce the contact condition. This node should not be shared with any other element in the domain.
Information on the theory behind this element can be found in, e.g. Wriggers (2002).
Note:
90 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
1. The SimpleContact2D element has been written to work exclusively with the ContactMaterial2D nDMaterial
object.
2. The valid recorder queries for this element are:
1. force - returns the contact force acting on the slave node in vector form.
2. frictionforce - returns the frictional force acting on the slave node in vector form.
3. forcescalar - returns the scalar magnitudes of the normal and tangential contact forces.
4. The SimpleContact2D elements are set to consider frictional behavior as a default, but the frictional state
of the SimpleContact2D element can be changed from the input file using the setParameter command.
When updating, value of 0 corresponds to the frictionless condition, and a value of 1 signifies the inclusion
of friction. An example command for this update procedure is provided below
3. The SimpleContact2D element works well in static and pseudo-static analysis situations.
4. In transient analysis, the presence of the contact constraints can effect the stability of commonly-used time
integration methods in the HHT or Newmark family (e.g., Laursen, 2002). For this reason, use of alternative
time-integration methods which numerically damp spurious high frequency behavior may be required. The
TRBDF2 integrator is an effective method for this purpose. The Newmark integrator can also be effective with
proper selection of the gamma and beta coefficients. The trapezoidal rule, i.e., Newmark with gamma = 0.5 and
beta = 0.25, is particularly prone to instability related to the contact constraints and is not recommended.
See also:
Notes
SimpleContact3D
The SimpleContact3D element is a three-dimensional node-to-surface contact element which defines a frictional con-
tact interface between two separate bodies. The master nodes are the nodes which define a surface of a hexahedral
element on the first body, and the slave node is a node from the second body. The Lagrange multiplier node is required
to enforce the contact condition. This node should not be shared with any other element in the domain. Information
on the theory behind this element can be found in, e.g. Wriggers (2002).
Note:
1. The SimpleContact3D element has been written to work exclusively with the ContactMaterial3D nDMaterial
object.
See also:
Notes
BeamContact2D
The BeamContact2D element is a two-dimensional beam-to-node contact element which defines a frictional contact
interface between a beam element and a separate body. The master nodes (3 DOF) are the endpoints of the beam
92 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
element, and the slave node (2 DOF) is a node from a second body. The Lagrange multiplier node (2 DOF) is required
to enforce the contact condition. Each contact element should have a unique Lagrange multiplier node. The Lagrange
multiplier node should not be fixed, otherwise the contact condition will not work.
Under plane strain conditions in 2D, a beam element represents a unit thickness of a wall. The width is the dimension
of this wall in the 2D plane. This width should be built-in to the model to ensure proper enforcement of the con-
tact condition. The Excavation Supported by Cantilevered Sheet Pile Wall practical example provides some further
examples and discussion on the usage of this element.
Note:
1. The BeamContact2D element has been written to work exclusively with the ContactMaterial2D nDMaterial
object.
2. The valid recorder queries for this element are:
1. force - returns the contact force acting on the slave node in vector form.
2. frictionforce - returns the frictional force acting on the slave node in vector form.
3. forcescalar - returns the scalar magnitudes of the normal and tangential contact forces.
4. masterforce - returns the reactions (forces and moments) acting on the master nodes.
5. The BeamContact2D elements are set to consider frictional behavior as a default, but the frictional state of
the BeamContact2D element can be changed from the input file using the setParameter command. When
updating, value of 0 corresponds to the frictionless condition, and a value of 1 signifies the inclusion of
friction. An example command for this update procedure is provided below
3. The BeamContact2D element works well in static and pseudo-static analysis situations.
4. In transient analysis, the presence of the contact constraints can effect the stability of commonly-used time
integration methods in the HHT or Newmark family (e.g., Laursen, 2002). For this reason, use of alternative
time-integration methods which numerically damp spurious high frequency behavior may be required. The
TRBDF2 integrator is an effective method for this purpose. The Newmark integrator can also be effective with
proper selection of the gamma and beta coefficients. The trapezoidal rule, i.e., Newmark with gamma = 0.5 and
beta = 0.25, is particularly prone to instability related to the contact constraints and is not recommended.
See also:
Notes
BeamContact3D
The BeamContact3D element is a three-dimensional beam-to-node contact element which defines a frictional contact
interface between a beam element and a separate body. The master nodes (6 DOF) are the endpoints of the beam
element, and the slave node (3 DOF) is a node from a second body. The Lagrange multiplier node (3 DOF) is required
to enforce the contact condition. Each contact element should have a unique Lagrange multiplier node. The Lagrange
multiplier node should not be fixed, otherwise the contact condition will not work.
Note:
1. The BeamContact3D element has been written to work exclusively with the ContactMaterial3D nDMaterial
object.
2. The valid recorder queries for this element are:
1. force - returns the contact force acting on the slave node in vector form.
2. frictionforce - returns the frictional force acting on the slave node in vector form.
3. forcescalar - returns the scalar magnitudes of the single normal and two tangential contact forces.
4. masterforce - returns the reactions (forces only) acting on the master nodes.
5. mastermoment - returns the reactions (moments only) acting on the master nodes.
6. masterreaction - returns the full reactions (forces and moments) acting on the master nodes.
7. The BeamContact3D elements are set to consider frictional behavior as a default, but the frictional state of
the BeamContact3D element can be changed from the input file using the setParameter command. When
updating, value of 0 corresponds to the frictionless condition, and a value of 1 signifies the inclusion of
friction. An example command for this update procedure is provided below
3. The BeamContact3D element works well in static and pseudo-static analysis situations.
4. In transient analysis, the presence of the contact constraints can effect the stability of commonly-used time
integration methods in the HHT or Newmark family (e.g., Laursen, 2002). For this reason, use of alternative
time-integration methods which numerically damp spurious high frequency behavior may be required. The
94 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
TRBDF2 integrator is an effective method for this purpose. The Newmark integrator can also be effective with
proper selection of the gamma and beta coefficients. The trapezoidal rule, i.e., Newmark with gamma = 0.5 and
beta = 0.25, is particularly prone to instability related to the contact constraints and is not recommended.
See also:
Notes
BeamEndContact3D
The BeamEndContact3D element is a node-to-surface contact element which defines a normal contact interface be-
tween the end of a beam element and a separate body. The first master node ($iNode) is the beam node which is at the
end of the beam (i.e. only connected to a single beam element), the second node ($jNode) is the remaining node on
the beam element in question. The slave node is a node from a second body. The Lagrange multiplier node is required
to enforce the contact condition. This node should not be shared with any other element in the domain, and should be
created with the same number of DOF as the slave node.
The BeamEndContact3D element enforces a contact condition between a fictitious circular plane associated with a
beam element and a node from a second body. The normal direction of the contact plane coincides with the endpoint
tangent of the beam element at the master beam node ($iNode). The extents of this circular plane are defined by
the radius input parameter. The master beam node can only come into contact with a slave node which is within the
extents of the contact plane. There is a lag step associated with changing between the ‘in contact’ and ‘not in contact’
conditions.
This element was developed for use in establishing a contact condition for the tip of a pile modeled as using beam
elements and the underlying soil elements in three-dimensional analysis.
Note:
See also:
Notes
Cable Elements
1. CatenaryCableElement
CatenaryCableElement
This cable is a flexibility-based formulation of the catenary cable. An iterative scheme is used internally to compute
equilibrium. At each iteration, node i is considered fixed while node j is free. End-forces are applied at node-j and
its displacements computed. Corrections to these forces are applied iteratively using a Newton-Rhapson scheme (with
optional sub-stepping via $Nsubsteps) until nodal displacements are within the provided tolerance ($errortol). When
convergence is reached, a stiffness matrix is computed by inversion of the flexibility matrix and rigid-body mode
injection.
96 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
Note:
1. The stiffness of the cable comes from the large-deformation interaction between loading and cable shape. There-
fore, all cables must have distributed forces applied to them. See example. Should not work for only nodal
forces.
2. Valid queries to the CatenaryCable element when creating an ElementalRecorder object correspond to ‘forces’,
which output the end-forces of the element in global coordinates (3 for each node).
3. Only the lumped-mass formulation is currently available.
4. The element does up 100 internal iterations. If convergence is not achieved, will result in error and some
diagnostic information is printed out.
See also:
Notes
PFEM Elements
1. PFEMElementBubble
2. PFEMElementCompressible
PFEMElementBubble
element(’PFEMElementBubble’, eleTag, *eleNodes, rho, mu, b1, b2, <b3>, <thickness, kappa>)
Create a PFEM Bubble element, which is a fluid element for FSI analysis.
PFEMElementCompressible
Misc.
1. SurfaceLoad Element
2. VS3D4
3. AC3D8
4. ASI3D8
5. AV3D4
SurfaceLoad Element
The SurfaceLoad element is a four-node element which can be used to apply surface pressure loading to 3D brick
elements. The SurfaceLoad element applies energetically-conjugate forces corresponding to the input scalar pressure
to the nodes associated with the element. As these nodes are shared with a 3D brick element, the appropriate nodal
loads are therefore applied to the brick.
Note:
1. There are no valid ElementalRecorder queries for the SurfaceLoad element. Its sole purpose is to apply nodal
forces to the adjacent brick element.
2. The pressure loading from the SurfaceLoad element can be applied in a load pattern. See the analysis example
below.
See also:
Notes
98 Chapter 1. Developer
OpenSeesPy Documentation, Release 3.5.1.3
VS3D4
This command is used to construct a four-node 3D viscous-spring boundary quad element object based on a bilinear
isoparametric formulation.
element(’VS3D4’, eleTag, *eleNodes, E, G, rho, R, alphaN, alphaT)
Note: Reference: Liu J, Du Y, Du X, et al. 3D viscous-spring artificial boundary in time domain. Earthquake
Engineering and Engineering Vibration, 2006, 5(1):93-102
See also:
Notes
AC3D8
This command is used to construct an eight-node 3D brick acoustic element object based on a trilinear isoparametric
formulation.
element(’AC3D8’, eleTag, *eleNodes, matTag)
Note: Reference: ABAQUS theory manual. (2.9.1 Coupled acoustic-structural medium analysis)
See also:
Notes
ASI3D8
This command is used to construct an eight-node zero-thickness 3D brick acoustic-structure interface element object
based on a bilinear isoparametric formulation. The nodes in the acoustic domain share the same coordinates with the
nodes in the solid domain.
Note: Reference: ABAQUS theory manual. (2.9.1 Coupled acoustic-structural medium analysis)
See also:
Notes
AV3D4
This command is used to construct a four-node 3D acoustic viscous boundary quad element object based on a bilinear
isoparametric formulation.
element(’AV3D4’, eleTag, *eleNodes, matTag)
See also:
Notes
node(nodeTag, *crds, ’-ndf’, ndf, ’-mass’, *mass, ’-disp’, *disp, ’-vel’, *vel, ’-accel’, *accel)
Create a OpenSees node.
fix command
fix(nodeTag, *constrValues)
Create a homogeneous SP constriant.
For example,
# fully fixed
vals = [1,1,1]
fix(nodeTag, *vals)
fixX command
fixY command
fixZ command
equalDOF command
equalDOF_Mixed command
rigidDiaphragm command
perpDirn (int) direction perpendicular to the rigid plane (i.e. direction 3 corresponds to the 1-2
plane)
rNodeTag (int) integer tag identifying the retained (primary) node
cNodeTags (list integar tags identifying the constrained (secondary) nodes
(int))
rigidLink command
pressureConstraint(nodeTag, pNodeTag)
Create a pressure constraint for incompressible flow.
For example,
Constant TimeSeries
Linear TimeSeries
Trigonometric TimeSeries
timeSeries(’Trig’, tag, tStart, tEnd, period, ’-factor’, factor=1.0, ’-shift’, shift=0.0, ’-zeroShift’, ze-
roShift=0.0)
This command is used to construct a TimeSeries object in which the load factor is some trigonemtric function
of the time in the domain
{︃
𝑐𝐹 𝑎𝑐𝑡𝑜𝑟 * 𝑠𝑖𝑛( 2.0𝜋(𝑡−𝑡𝑆𝑡𝑎𝑟𝑡)
𝑝𝑒𝑟𝑖𝑜𝑑 + 𝜑), 𝑡𝑆𝑡𝑎𝑟𝑡 <= 𝑡 <= 𝑡𝐸𝑛𝑑
𝜆 = 𝑓 (𝑡) =
0.0, 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒
𝑝𝑒𝑟𝑖𝑜𝑑 𝑧𝑒𝑟𝑜𝑆ℎ𝑖𝑓 𝑡
𝜑 = 𝑠ℎ𝑖𝑓 𝑡 − * arcsin( )
2.0𝜋 𝑐𝐹 𝑎𝑐𝑡𝑜𝑟
Triangular TimeSeries
timeSeries(’Triangle’, tag, tStart, tEnd, period, ’-factor’, factor=1.0, ’-shift’, shift=0.0, ’-zeroShift’, ze-
roShift=0.0)
This command is used to construct a TimeSeries object in which the load factor is some triangular function of
the time in the domain.
⎧
⎪
⎪ 𝑠𝑙𝑜𝑝𝑒 * 𝑘 * 𝑝𝑒𝑟𝑖𝑜𝑑 + 𝑧𝑒𝑟𝑜𝑆ℎ𝑖𝑓 𝑡, 𝑘 < 0.25
⎪
⎨𝑐𝐹 𝑎𝑐𝑡𝑜𝑟 − 𝑠𝑙𝑜𝑝𝑒 * (𝑘 − 0.25) * 𝑝𝑒𝑟𝑖𝑜𝑑 + 𝑧𝑒𝑟𝑜𝑆ℎ𝑖𝑓 𝑡, 𝑘 < 0.75
𝜆 = 𝑓 (𝑡) =
⎪
⎪
⎪ −𝑐𝐹 𝑎𝑐𝑡𝑜𝑟 + 𝑠𝑙𝑜𝑝𝑒 * (𝑘 − 0.75) * 𝑝𝑒𝑟𝑖𝑜𝑑 + 𝑧𝑒𝑟𝑜𝑆ℎ𝑖𝑓 𝑡, 𝑘 < 1.0
0.0, 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒
⎩
𝑐𝐹 𝑎𝑐𝑡𝑜𝑟
𝑠𝑙𝑜𝑝𝑒 =
𝑝𝑒𝑟𝑖𝑜𝑑/4
𝑡 + 𝜑 − 𝑡𝑆𝑡𝑎𝑟𝑡 𝑡 + 𝜑 − 𝑡𝑆𝑡𝑎𝑟𝑡
𝑘= − 𝑓 𝑙𝑜𝑜𝑟( )
𝑝𝑒𝑟𝑖𝑜𝑑 𝑝𝑒𝑟𝑖𝑜𝑑
𝑧𝑒𝑟𝑜𝑆ℎ𝑖𝑓 𝑡
𝜑 = 𝑠ℎ𝑖𝑓 𝑡 −
𝑠𝑙𝑜𝑝𝑒
Rectangular TimeSeries
Pulse TimeSeries
timeSeries(’Pulse’, tag, tStart, tEnd, period, ’-width’, width=0.5, ’-shift’, shift=0.0, ’-factor’, factor=1.0,
’-zeroShift’, zeroShift=0.0)
This command is used to construct a TimeSeries object in which the load factor is some pulse function of the
time in the domain.
⎧
⎨𝑐𝐹 𝑎𝑐𝑡𝑜𝑟 + 𝑧𝑒𝑟𝑜𝑆ℎ𝑖𝑓 𝑡, 𝑘 < 𝑤𝑖𝑑𝑡ℎ
⎪
𝜆 = 𝑓 (𝑡) = 𝑧𝑒𝑟𝑜𝑠ℎ𝑖𝑓 𝑡, 𝑘<1
⎪
0.0, 𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒
⎩
Path TimeSeries
timeSeries(’Path’, tag, ’-dt’, dt=0.0, ’-values’, *values, ’-time’, *time, ’-filePath’, filePath=”, ’-fileTime’,
fileTime=”, ’-factor’, factor=1.0, ’-startTime’, startTime=0.0, ’-useLast’, ’-prependZero’)
The relationship between load factor and time is input by the user as a series of discrete points in the 2d space
(load factor, time). The input points can come from a file or from a list in the script. When the time specified
does not match any of the input points, linear interpolation is used between points. There are many ways to
specify the load path, for example, the load factors set with values or filePath, and the time set with dt,
time, or fileTime.
Plain Pattern
Note: the commands below to generate all the loads and sp constraints will be included in last called pattern command.
load command
load(nodeTag, *loadValues)
This command is used to construct a NodalLoad object and add it to the enclosing LoadPattern.
Note: The load values are reference loads values. It is the time series that provides the load factor. The load factor
times the reference values is the load that is actually applied to the node.
eleLoad command
eleLoad(’-ele’, *eleTags, ’-range’, eleTag1, eleTag2, ’-type’, ’-beamUniform’, Wy, <Wz>, Wx=0.0, ’-
beamPoint’, Py, <Pz>, xL, Px=0.0, ’-beamThermal’, *tempPts)
The eleLoad command is used to construct an ElementalLoad object and add it to the enclosing LoadPattern.
Note:
1. The load values are reference load values, it is the time series that provides the load factor. The load factor times
the reference values is the load that is actually applied to the element.
2. At the moment, eleLoads do not work with 3D beam-column elements if Corotational geometric transformation
is used.
sp command
Note: The dofValue is a reference value, it is the time series that provides the load factor. The load factor times the
reference value is the constraint that is actually applied to the node.
UniformExcitation Pattern
Note:
1. The responses obtained from the nodes for this type of excitation are RELATIVE values, and not the absolute
values obtained from a multi-support case.
2. must set one of the disp, vel or accel time series
pattern(’MultipleSupport’, patternTag)
The Multi-Support pattern allows similar or different prescribed ground motions to be input at various supports
in the structure. In OpenSees, the prescribed motion is applied using single-point constraints, the single-point
constraints taking their constraint value from user created ground motions.
Note:
1. The results for the responses at the nodes are the ABSOLUTE values, and not relative values as in the case of a
UniformExciatation.
2. The non-homogeneous single point constraints require an appropriate choice of constraint handler.
Note:
1. The displacements are the ones used in the ImposedMotions to set nodal response.
2. If only the acceleration TimeSeries is provided, numerical integration will be used to determine the velocities
and displacements.
3. For earthquake excitations it is important that the user provide the displacement time history, as the one gener-
ated using the trapezoidal method will not provide good results.
4. Any combination of the acceleration, velocity and displacement time-series can be specified.
Imposed Motion
mass(nodeTag, *massValues)
This command is used to set the mass at a node, replacing any previously defined mass at the node.
region(regTag, ’-ele’, *eles, ’-eleOnly’, *eles, ’-eleRange’, startEle, endEle, ’-eleOnlyRange’, startEle, en-
dEle, ’-node’, *nodes, ’-nodeOnly’, *nodes, ’-nodeRange’, startNode, endNode, ’-nodeOnlyRange’,
startNode, endNode, ’-rayleigh’, alphaM, betaK, betaKinit, betaKcomm)
The region command is used to label a group of nodes and elements. This command is also used to assign
rayleigh damping parameters to the nodes and elements in this region. The region is specified by either elements
or nodes, not both. If elements are defined, the region includes these elements and the all connected nodes, unless
the -eleOnly option is used in which case only elements are included. If nodes are specified, the region includes
these nodes and all elements of which all nodes are prescribed to be in the region, unless the -nodeOnly option
is used in which case only the nodes are included.
Note: The user cannot prescribe the region by BOTH elements and nodes.
block2D command
block3D command
Lobatto
Legendre
NewtonCotes
Radau
Trapezoidal
CompositeSimpson
UserDefined
Places N integration points along the element, which are defined in locs on the natural domain [0, 1]. The
weight of each integration point is defined in the wts also on the [0, 1] domain. The force-deformation response
at each integration point is defined by the secs. The locs, wts, and secs should be of length N. In general,
there is no accuracy for this approach to numerical integration.
FixedLocation
Note that NewtonCotes integration is recovered when the integration point locations are equally spaced.
Places N integration points along the element, whose locations are defined in locs. on the natural domain [0,
1]. The force-deformation response at each integration point is defined by the secs. Both the locs and secs
should be of length N. The order of accuracy for Fixed Location integration is N-1.
LowOrder
Places N integration points along the element, which are defined in locs. on the natural domain [0, 1]. The
force-deformation response at each integration point is defined by the secs. Both the locs and secs should
be of length N. The wts at user-selected integration points are specified on [0, 1], which can be of length Nc
equals 0 up to N. These specified weights are assigned to the first Nc entries in the locs and secs, respectively.
The order of accuracy for Low Order integration is N-Nc-1.
Note: Nc is determined from the length of the wts list. Accordingly, FixedLocation integration is recovered
when wts is an empty list and UserDefined integration is recovered when the wts and locs lists are of equal
length.
MidDistance
Places N integration points along the element, whose locations are defined in locs on the natural domain [0,
1]. The force-deformation response at each integration point is defined by the secs. Both the locs and secs
should be of length N. This integration rule can only integrate constant functions exactly since the sum of the
integration weights is one.
For the locs shown above, the associated integration weights will be [0.15, 0.2, 0.3, 0.2, 0.15].
Plastic Hinge Integration Methods. Plastic hinge integration methods confine material yielding to regions of the
element of specified length while the remainder of the element is linear elastic. A summary of plastic hinge integration
methods is found in (Scott and Fenves 2006).
1. UserHinge
2. HingeMidpoint
3. HingeRadau
4. HingeRadauTwo
5. HingeEndpoint
UserHinge
beamIntegration(’UserHinge’, tag, secETag, npL, *secsLTags, *locsL, *wtsL, npR, *secsRTags, *locsR,
*wtsR)
Create a UserHinge beamIntegration object.
tag = 1
secE = 5
npI = 2
secsI = [1,2]
locsI = [0.1,0.2]
wtsI = [0.1,0.05]
npJ = 2
secsJ = [3,4]
locsJ = [0.8,0.9]
wtsJ = [0.05,0.1]
beamIntegration('UserHinge',tag,secE,npI,*secsI,*locsI,*wtsI,npJ,*secsJ,*locsJ,
˓→*wtsJ)
HingeMidpoint
The plastic hinge length at end I (J) is equal to lpI (lpJ) and the associated force deformation response is
defined by the secI (secJ). The force deformation response of the element interior is defined by the secE.
Typically, the interior section is linear-elastic, but this is not necessary.
lpI = 0.1
lpJ = 0.2
beamIntegration('HingeMidpoint',tag,secI,lpI,secJ,lpJ,secE)
HingeRadau
HingeRadauTwo
HingeEndpoint
For example,
matType = 'Steel01'
matTag = 1
matArgs = [Fy, E0, b]
uniaxialMaterial(matType, matTag, *matArgs)
1. Steel01
2. Steel02
3. Steel4
4. Hysteretic
5. ReinforcingSteel
6. Dodd_Restrepo
7. RambergOsgoodSteel
8. SteelMPF
9. Steel01Thermal
Steel01
Note: If strain-hardening ratio is zero and you do not expect softening of your system use BandSPD solver.
Steel02
See also:
Steel02
Steel4
uniaxialMaterial(’Steel4’, matTag, Fy, E0, ’-asym’, ’-kin’, b_k, *params, b_kc, R_0c, r_1c, r_2c, ’-iso’,
b_i, rho_i, b_l, R_i, l_yp, b_ic, rho_ic, b_lc, R_ic, ’-ult’, f_u, R_u, f_uc, R_uc, ’-init’,
sig_init, ’-mem’, cycNum)
This command is used to construct a general uniaxial material with combined kinematic and isotropic hardening
and optional non-symmetric behavior.
See also:
Steel4
Hysteretic
uniaxialMaterial(’Hysteretic’, matTag, *p1, *p2, *p3=p2, *n1, *n2, *n3=n2, pinchX, pinchY, damage1,
damage2, beta=0.0)
This command is used to construct a uniaxial bilinear hysteretic material object with pinching of force and
deformation, damage due to ductility and energy, and degraded unloading stiffness based on ductility.
See also:
Hysteretic
ReinforcingSteel
uniaxialMaterial(’ReinforcingSteel’, matTag, fy, fu, Es, Esh, eps_sh, eps_ult, ’-GABuck’, lsr, beta, r,
gamma, ’-DMBuck’, lsr, alpha=1.0, ’-CMFatigue’, Cf, alpha, Cd, ’-IsoHard’, a1=4.3,
limit=1.0, ’-MPCurveParams’, R1=0.333, R2=18.0, R3=4.0)
This command is used to construct a ReinforcingSteel uniaxial material object. This object is intended to be
used in a reinforced concrete fiber section as the steel reinforcing material.
See also:
Notes
Dodd_Restrepo
uniaxialMaterial(’Dodd_Restrepo’, matTag, Fy, Fsu, ESH, ESU, Youngs, ESHI, FSHI, OmegaFac=1.0)
This command is used to construct a Dodd-Restrepo steel material
See also:
Notes
RambergOsgoodSteel
See also:
Notes
SteelMPF
uniaxialMaterial(’SteelMPF’, matTag, fyp, fyn, E0, bp, bn, *params, a1=0.0, a2=1.0, a3=0.0, a4=1.0)
This command is used to construct a uniaxialMaterial SteelMPF (Kolozvari et al., 2015), which represents the
well-known uniaxial constitutive nonlinear hysteretic material model for steel proposed by Menegotto and Pinto
(1973), and extended by Filippou et al. (1983) to include isotropic strain hardening effects.
See also:
Notes
Steel01Thermal
Concrete Materials
1. Concrete01
2. Concrete02
3. Concrete04
4. Concrete06
5. Concrete07
6. Concrete01WithSITC
7. ConfinedConcrete01
8. ConcreteD
9. FRPConfinedConcrete
10. FRPConfinedConcrete02
11. ConcreteCM
12. TDConcrete
13. TDConcreteEXP
14. TDConcreteMC10
15. TDConcreteMC10NL
Concrete01
Note:
1. Compressive concrete parameters should be input as negative values (if input as positive, they will be converted
to negative internally).
2. The initial slope for this model is (2*fpc/epsc0)
See also:
Notes
Concrete02
Note:
1. Compressive concrete parameters should be input as negative values (if input as positive, they will be converted
to negative internally).
2. The initial slope for this model is (2*fpc/epsc0)
See also:
Notes
Concrete04
Note:
1. Compressive concrete parameters should be input as negative values.
2. The envelope of the compressive stress-strain response is defined using the model proposed by Popovics (1973).
If the user defines 𝐸𝑐 = 57000*𝑠𝑞𝑟𝑡(|𝑓 𝑐𝑐|) (in psi)’ then the envelope curve is identical to proposed by Mander
et al. (1988).
3. Model Characteristic: For loading in compression, the envelope to the stress-strain curve follows the model
proposed by Popovics (1973) until the concrete crushing strength is achieved and also for strains beyond that
corresponding to the crushing strength. For unloading and reloading in compression, the Karsan-Jirsa model
(1969) is used to determine the slope of the curve. For tensile loading, an exponential curve is used to define the
envelope to the stress-strain curve. For unloading and reloading in tensile, the secant stiffness is used to define
the path.
See also:
Notes
Concrete06
Note:
1. Compressive concrete parameters should be input as negative values.
See also:
Notes
Concrete07
See also:
Notes
Concrete01WithSITC
Note:
1. Compressive concrete parameters should be input as negative values (if input as positive, they will be converted
to negative internally).
2. The initial slope for this model is (2*fpc/epsc0)
See also:
Notes
ConfinedConcrete01
See also:
Notes
ConcreteD
uniaxialMaterial(’ConcreteD’, matTag, fc, epsc, ft, epst, Ec, alphac, alphat, cesp=0.25, etap=1.15)
This command is used to construct a concrete material based on the Chinese design code.
Note:
1. Concrete compressive strength and the corresponding strain should be input as negative values.
2. The value fc/epsc and ft/epst should be smaller than Ec.
See also:
Notes
FRPConfinedConcrete
uniaxialMaterial(’FRPConfinedConcrete’, matTag, fpc1, fpc2, epsc0, D, c, Ej, Sj, tj, eju, S, fyl, fyh,
dlong, dtrans, Es, nu0, k, useBuck)
This command is used to construct a uniaxial Megalooikonomou-Monti-Santini concrete material object with
degraded linear unloading/reloading stiffness according to the work of Karsan-Jirsa and no tensile strength.
Note: #.IMPORTANT: The units of the input parameters should be in MPa, N, mm. #.Concrete compressive strengths
and the corresponding strain should be input as positive values. #.When rupture of FRP jacket occurs due to dilation
of concrete (lateral concrete strain exceeding reduced rupture strain of FRP jacket), the analysis is not terminated.
Only a message “FRP Rupture” is plotted on the screen. #.When $useBuck input parameter is on (equal to 1) and
the model’s longitudinal steel buckling conditions are fulfilled, a message “Initiation of Buckling of Long.Bar under
Compression” is plotted on the screen. #.When rupture of FRP jacket occurs due to its interaction with buckled
longitudinal compressive steel bars, the analysis is not terminated. Only a message “FRP Rupture due to Buckling of
Long.Bar under compression” is plotted on the screen.
See also:
Notes
FRPConfinedConcrete02
uniaxialMaterial(’FRPConfinedConcrete02’, matTag, fc0, Ec, ec0, <’-JacketC’, tfrp, Efrp, erup, R>,
<’-Ultimate’, fcu, ecu>, ft, Ets, Unit)
Figure 1 Hysteretic Stress-Strain Relation
This command is used to construct a uniaxial hysteretic stress-strain model for fiber-reinforced polymer (FRP)-
confined concrete. The envelope compressive stress-strain response is described by a parabolic first portion and
a linear second portion with smooth connection between them (Figure 1). The hysteretic rules of compression
are based on Lam and Teng’s (2009) model. The cyclic linear tension model of Yassin (1994) for unconfined
concrete (as adopted in Concrete02) is used with slight modifications to describe the tensile behavior of FRP-
confined concrete (Teng et al. 2015).
Note:
1. Compressive concrete parameters should be input as negative values.
2. The users are required to input either the FRP jacket properties in an FRP-confined circular column (<-JacketC>)
or directly input the ultimate point (𝜖cu, fcu) (<-Ultimate>). If <-JacketC> is used, the ultimate stress and strain
are automatically calculated based on Teng et al.’s (2009) model which is a refined version of Lam and Teng’s
(2003) stress-strain model for FRP-confined concrete in circular columns. If <-Ultimate> is used, the ultimate
stress and strain can be calculated by the users in advance based on other stress-strain models of FRP-confined
concrete and thus can be used for other cross section shapes (e.g., square, rectangular, or elliptical). If none
of them is specified, a stress-strain curve (parabola + horizontal linear curve) for unconfined concrete will be
defined (Figure 1). Both <-JacketC> and <-Ultimate> adopt the envelope compressive stress-strain curve with a
parabolic first portion and a linear second portion.
3. Unit indicator: $Unit = 1 for SI Metric Units (e.g., N, mm, MPa); $Unit = 0 for US Customary Units (e.g., kip,
in, sec, ksi).
Calibration:
1. The implemented new material has been calibrated using a simple-supported Force-Based Beam-Column
element subjected to axial load only (http://opensees.berkeley.edu/wiki/index.php/Calibration_of_Maxwell_
Material). The output stress-strain responses were compared with the desired curves defined by the input pa-
rameters.
Examples:
1. Example 1: Pin-ended FRP-confined reinforced concrete (RC) columns
Figure 2 Simulation of pin-ended FRP-confined RC column
1. The first example is a pin-ended FRP-confined circular RC column subjected to eccentric com-
pression (load eccentricity = 20 mm) at both ends tested by Bisby and Ranger (2010) (Figure 2).
Due to the symmetry in geometry and loading, only half of the column needs to be modelled. In
this case, three forceBeamColumn elements each with 5 integration points were used for the half
column. The FRPConfinedConcrete02 model was used to describe the stress-strain behavior of
FRP-confined concrete. Either <-JacketC> or <-Ultimate> can be used. If the former is used,
the properties of the FRP jacket need to be input; if the latter is used, the ultimate stress and
strain need to be calculated by the users and input directly. The eccentric loading is applied with
a combined axial load and bending moment at each end node. An increasing vertical displace-
ment is applied to the top node of the column model. The analysis terminated until the ultimate
axial strain of FRP-confined concrete was reached by the extreme compression concrete fiber at
the mid-height (equivalent to FRP rupture). SI Metric Unit (e.g., N, mm, MPa) is used in the
script of this example ($Unit = 1).
2. Figure 3 shows the comparison of axial load-lateral displacement curve between the test results
and the theoretical results. Figure 4 shows the variation of column slenderness ratio (l/D) on
the axial load-lateral displacement response of the column. Please refer to Lin (2016) for more
details about the modeling.
Figure 3 Experimental results vs theoretical results
2. Example 2: Cantilever column subjected to constant axial compression and cyclic lateral loading
Figure 5 Simulation of columns under cyclic latera loading
1. The second example is a cantilever FRP-confined circular RC column subjected to constant axial
compression and cyclic lateral loading (Column C5 tested by Saadatmanesh et al. 1997). The
US Customary Units (e.g., kip, in, sec, ksi) were used in this example. The twenty-five (25)-in.-
height region (potential plastic hinge region) above the footing of the column was wrapped with
an FRP jacket; the remaining portion of the column with a height of 71 in. was conventional
RC section without FRP jacketing. The column was modelled using two forceBeamColumn
elements to cater for the variation of section characteristic along the column height. A zero
length section element at the column-footing interface was used to simulate fixed-end rotations
due to the strain penetration of longitudinal steel bars (Figure 5) (Lin et al. 2012). The bond-slip
model of Zhao and Sritharan (2007) (Bond_SP01) was used to depict the bar stress-slip response.
In addition, another zero length section element was used at the column-footing interface to
consider the possible rotations of the footing (Teng et al. 2015). The rotation stiffness of the zero
length section element was adjusted to achieve close matching between the test response and the
predicted response during the initial stage of loading. This zero length section element was found
to have little effect on the ultimate displacement of the column (Teng et al. 2015). Moreover, the
inclination of axial load in the column test needs to be accounted for when comparing predicted
results with test results (Teng et al. 2015). Figure 6 shows the comparison of lateral load-lateral
displacement curve between the test results and the theoretical results.
References:
1. Bisby, L. and Ranger, M. (2010). “Axial-flexural interaction in circular FRP-confined reinforced concrete
columns”, Construction and Building Materials, Vol. 24, No. 9, pp. 1672-1681.
2. Lam, L. and Teng, J.G. (2003). “Design-oriented stress-strain model for FRP-confined concrete”, Construction
and Building Materials, Vol. 17, No. 6, pp. 471-489.
3. Lam, L. and Teng, J.G. (2009). “Stress-strain model for FRP-confined concrete under cyclic axial compression”,
Engineering Structures, Vol. 31, No. 2, pp. 308-321.
4. Lin, G. (2016). Seismic Performance of FRP-confined RC Columns: Stress-Strain Models and Numerical
Simulation, Ph.D. thesis, Department of Civil and Environmental Engineering, The Hong Kong Polytechnic
University, Hong Kong, China.
5. Lin, G. and Teng, J.G. (2015). “Numerical simulation of cyclic/seismic lateral response of square RC columns
confined with fibre-reinforced polymer jackets”, Proceedings, Second International Conference on Performance-
based and Life-cycle Structural Engineering (PLSE 2015), pp. 481-489 (http://plse2015.org/cms/USB/pdf/
full-paper_7408.pdf).
6. Lin, G., Teng, J.G. and Lam, L. (2012). “Numerical simulation of FRP-jacketed RC columns under cyclic
loading: modeling of the strain penetration effect”, First International Conference on Performance-based and
Life-cycle Structural Engineering (PLSE2012), December 5-7, Hong Kong, China.
7. Saadatmanesh, H., Ehsani, M. and Jin, L. (1997). “Seismic retrofitting of rectangular bridge columns with
composite straps”, Earthquake Spectra, Vol. 13, No. 2, pp. 281-304.
8. Teng, J.G., Lam, L., Lin, G., Lu, J.Y. and Xiao, Q.G. (2015). “Numerical Simulation of FRP-Jacketed RC
Columns Subjected to Cyclic and Seismic Loading”, Journal of Composites for Construction, ASCE, Vol. 20,
No. 1, pp. 04015021.
9. Yassin, M.H.M. (1994). Nonlinear Analysis of Prestressed Concrete Structures under Monotonic and Cyclic
Loads, Ph.D. thesis, University of California at Berkeley, California, USA.
10. Zhao, J. and Sritharan, S. (2007). “Modeling of strain penetration effects in fiber-based analysis of reinforced
concrete structuresconcrete structures”, ACI Structural Journal, Vol. 104, No. 2, pp. 133-141.
ConcreteCM
uniaxialMaterial(’ConcreteCM’, matTag, fpcc, epcc, Ec, rc, xcrn, ft, et, rt, xcrp, mon, ’-GapClose’,
GapClose=0)
This command is used to construct a uniaxialMaterial ConcreteCM (Kolozvari et al., 2015), which is a uniaxial
hysteretic constitutive model for concrete developed by Chang and Mander (1994).
See also:
Notes
TDConcrete
uniaxialMaterial(’TDConcrete’, matTag, fc, fct, Ec, beta, tD, epsshu, psish, Tcr, phiu, psicr1, psicr2,
tcast)
This command is used to construct a uniaxial time-dependent concrete material object with linear behavior in
compression, nonlinear behavior in tension (REF: Tamai et al., 1988) and creep and shrinkage according to ACI
209R-92.
Note:
1. Compressive concrete parameters should be input as negative values (if input as positive, they will be converted
to negative internally).
2. Shrinkage concrete parameters should be input as negative values (if input as positive, they will be converted to
negative internally).
See also:
Detailed descriptions of the model and its implementation can be found in the following: (1) Knaack, A.M., Kurama,
Y.C. 2018. Modeling Time-Dependent Deformations: Application for Reinforced Concrete Beams with Recycled
Concrete Aggregates. ACI Structural J. 115, 175-190. doi:10.14359/51701153 (2) Knaack, A.M., 2013. Sustain-
able concrete structures using recycled concrete aggregate: short-term and long-term behavior considering material
variability. PhD Dissertation, Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,
Notre Dame, Indiana, USA, 680 pp A manual describing the use of the model and sample files can be found at:
https://data.mendeley.com/datasets/z4gxnhchky/5
TDConcreteEXP
uniaxialMaterial(’TDConcreteEXP’, matTag, fc, fct, Ec, beta, tD, epsshu, psish, Tcr, epscru, sigCr,
psicr1, psicr2, tcast)
This command is used to construct a uniaxial time-dependent concrete material object with linear behavior in
compression, nonlinear behavior in tension (REF: Tamai et al., 1988) and creep and shrinkage according to ACI
209R-92.
Note:
1. Compressive concrete parameters should be input as negative values (if input as positive, they will be converted
to negative internally).
2. Shrinkage concrete parameters should be input as negative values (if input as positive, they will be converted to
negative internally).
See also:
Detailed descriptions of the model and its implementation can be found in the following: (1) Knaack, A.M., Kurama,
Y.C. 2018. Modeling Time-Dependent Deformations: Application for Reinforced Concrete Beams with Recycled
Concrete Aggregates. ACI Structural J. 115, 175-190. doi:10.14359/51701153 (2) Knaack, A.M., 2013. Sustain-
able concrete structures using recycled concrete aggregate: short-term and long-term behavior considering material
variability. PhD Dissertation, Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,
Notre Dame, Indiana, USA, 680 pp A manual describing the use of the model and sample files can be found at:
https://data.mendeley.com/datasets/z4gxnhchky/5
TDConcreteMC10
uniaxialMaterial(’TDConcreteMC10’, matTag, fc, fct, Ec, Ecm, beta, tD, epsba, epsbb, epsda, epsdb,
phiba, phibb, phida, phidb, tcast, cem)
This command is used to construct a uniaxial time-dependent concrete material object with linear behavior in
compression, nonlinear behavior in tension (REF: Tamai et al., 1988) and creep and shrinkage according to fib
Model Code 2010.
Note:
1. Compressive concrete parameters should be input as negative values (if input as positive, they will be converted
to negative internally).
2. Shrinkage concrete parameters should be input as negative values (if input as positive, they will be converted to
negative internally).
See also:
Detailed descriptions of the model and its implementation can be found in the following: (1) Knaack, A.M., Kurama,
Y.C. 2018. Modeling Time-Dependent Deformations: Application for Reinforced Concrete Beams with Recycled
Concrete Aggregates. ACI Structural J. 115, 175-190. doi:10.14359/51701153 (2) Knaack, A.M., 2013. Sustain-
able concrete structures using recycled concrete aggregate: short-term and long-term behavior considering material
variability. PhD Dissertation, Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,
Notre Dame, Indiana, USA, 680 pp A manual describing the use of the model and sample files can be found at:
https://data.mendeley.com/datasets/z4gxnhchky/5
TDConcreteMC10NL
uniaxialMaterial(’TDConcreteMC10NL’, matTag, fc, fcu, epscu, fct, Ec, Ecm, beta, tD, epsba, epsbb,
epsda, epsdb, phiba, phibb, phida, phidb, tcast, cem)
This command is used to construct a uniaxial time-dependent concrete material object with non-linear behavior
in compression (REF: Concrete02), nonlinear behavior in tension (REF: Tamai et al., 1988) and creep and
shrinkage according to fib Model Code 2010.
Note:
1. Compressive concrete parameters should be input as negative values (if input as positive, they will be converted
to negative internally).
2. Shrinkage concrete parameters should be input as negative values (if input as positive, they will be converted to
negative internally).
See also:
Detailed descriptions of the model and its implementation can be found in the following: (1) Knaack, A.M., Kurama,
Y.C. 2018. Modeling Time-Dependent Deformations: Application for Reinforced Concrete Beams with Recycled
Concrete Aggregates. ACI Structural J. 115, 175-190. doi:10.14359/51701153 (2) Knaack, A.M., 2013. Sustain-
able concrete structures using recycled concrete aggregate: short-term and long-term behavior considering material
variability. PhD Dissertation, Civil and Environmental Engineering and Earth Sciences, University of Notre Dame,
Notre Dame, Indiana, USA, 680 pp A manual describing the use of the model and sample files can be found at:
https://data.mendeley.com/datasets/z4gxnhchky/5
See also:
Notes
See also:
Notes
See also:
Notes
uniaxialMaterial(’ENT’, matTag, E)
This command is used to construct a uniaxial elastic-no tension material object.
See also:
Notes
Parallel Material
See also:
Notes
Series Material
See also:
Notes
PyTzQz uniaxial materials for p-y, t-z and q-z elements for modeling soil-structure interaction
through the piles in a structural foundation
1. PySimple1 Material
2. TzSimple1 Material
3. QzSimple1 Material
4. PyLiq1 Material
5. TzLiq1 Material
6. QzLiq1 Material
PySimple1 Material
See also:
Notes
TzSimple1 Material
Note:
1. The argument tult is the ultimate capacity of the t-z material. Note that t or tult are shear stresses [force
per unit area of pile surface] in common design equations, but are both loads for this uniaxialMaterial [i.e., shear
stress times the tributary area of the pile].
2. Nonzero c values are used to represent radiation damping effects
See also:
Notes
QzSimple1 Material
Note:
1. qult: Ultimate capacity of the q-z material. Note that q1 or qult are stresses [force per unit area of pile tip]
in common design equations, but are both loads for this uniaxialMaterial [i.e., stress times tip area].
2. Nonzero c values are used to represent radiation damping effects
3. Z50: Displacement at which 50% of qult is mobilized in monotonic loading. Note that Vijayvergiya’s rela-
tion (qzType=2) refers to a “critical” displacement (zcrit) at which qult is fully mobilized, and that the
corresponding z50 would be 0. 125zcrit.
4. optional args suction and c must either both be omitted or both provided.
See also:
Notes
PyLiq1 Material
This command constructs a uniaxial p-y material that incorporates liquefaction effects. This p y material is
used with a zeroLength element to connect a pile (beam-column element) to a 2 D plane-strain FE mesh or
displacement boundary condition. The p-y material obtains the average mean effective stress (which de-
creases with increasing excess pore pressure) either from two specified soil elements, or from a time series.
Currently, the implementation requires that the specified soil elements consist of FluidSolidPorousMateri-
als in FourNodeQuad elements, or PressureDependMultiYield or PressureDependMultiYield02 materials
in FourNodeQuadUP or NineFourQuadUP elements. There are two possible forms:
uniaxialMaterial(’PyLiq1’, matTag, soilType, pult, Y50, Cd, c, pRes, ele1, ele2)
uniaxialMaterial(’PyLiq1’, matTag, soilType, pult, Y50, Cd, c, pRes, ’-timeSeries’, timeSeriesTag)
Note:
1. The argument pult is the ultimate capacity of the p-y material. Note that p or pult are lateral stresses [force
per unit length of pile] in common design equations, but are both loads for this uniaxialMaterial [i.e., distributed
load times the tributary length of the pile].
2. Nonzero c values are used to represent radiation damping effects
3. To model the effects of liquefaction with PyLiq1, it is necessary to use the updateMaterialStage com-
mand. When material stage is 0 (which is the default value), the PyLiq1 behavior will be independent of any
pore pressure in the specified solidElem’s. When material stage is set to 1, the behviour of PyLiq1 will depend
on the mean effective stresses (and hence excess pore pressures) in the solidElem’s.
See also:
Notes
TzLiq1 Material
The command constructs a uniaxial t-z material that incorporates liquefaction effects. This t z material
is used with a zeroLength element to connect a pile (beam-column element) to a 2 D plane-strain FE
mesh. The t-z material obtains the average mean effective stress (which decreases with increasing excess
pore pressure) from two specified soil elements. Currently, the implementation requires that the specified
soil elements consist of FluidSolidPorousMaterials in FourNodeQuad elements. There are two possible
forms:
uniaxialMaterial(’TzLiq1’, matTag, tzType, tult, z50, c, ele1, ele2)
uniaxialMaterial(’TzLiq1’, matTag, tzType, tult, z50, c, ’-timeSeries’, timeSeriesTag)
Note:
1. The argument tult is the ultimate capacity of the t-z material. Note that t or tult are shear stresses [force
per unit area of pile surface] in common design equations, but are both loads for this uniaxialMaterial [i.e., shear
stress times the tributary area of the pile].
2. Nonzero c values are used to represent radiation damping effects
3. To model the effects of liquefaction with TzLiq1, it is necessary to use the updateMaterialStage com-
mand. When material stage is 0 (which is the default value), the TzLiq1 behavior will be independent of any
pore pressure in the specified solidElem’s. When material stage is set to 1, the behviour of TzLiq1 will depend
on the mean effective stresses (and hence excess pore pressures) in the solidElem’s.
See also:
Notes
QzLiq1 Material
The command constructs a uniaxial q-z material that incorporates liquefaction effects. This q-z material
is used with a zeroLength element to connect a pile (beam-column element) to a 2 D plane-strain FE
mesh. The q-z material obtains the average mean effective stress (which decreases with increasing excess
pore pressure) from two specified soil elements or from the mean effective stress provided explicitly as
a timeseries data. Currently, in order to compute the mean effective stress from connected elements, the
implementation requires that the specified soil elements consist of FluidSolidPorousMaterials in FourN-
odeQuad elements. There are two possible forms:
uniaxialMaterial(’QzLiq1’, matTag, soilType, qult, Z50, Cd, c, alpha, ele1, ele2)
uniaxialMaterial(’QzLiq1’, matTag, soilType, qult, Z50, Cd, c, alpha, ’-timeSeries’, timeSeriesTag)
Note:
1. qult: Ultimate capacity of the q-z material. Note that q or qult are stresses [force per unit area of pile tip] in
common design equations, but are both loads for this uniaxialMaterial [i.e., stress times tip area].
2. Z50: Displacement at which 50% of qult is mobilized in monotonic loading. Note that Vijayvergiya’s rela-
tion (qzType=2) refers to a “critical” displacement (zcrit) at which qult is fully mobilized, and that the
corresponding z50 would be 0. 125zcrit.
3. Nonzero c values are used to represent radiation damping effects
4. To model the effects of liquefaction with QzLiq1, it is necessary to use the updateMaterialStage com-
mand. When material stage is 0 (which is the default value), the QzLiq1 behavior will be independent of
any pore alphasure in the specified solidElem’s. When material stage is set to 1, the behviour of QzLiq1 will
depend on the mean effective stresses (and hence excess pore alphasures) in the solidElem’s.
See also:
Notes
1. Hardening Material
2. CastFuse Material
3. ViscousDamper Material
4. BilinearOilDamper Material
5. Modified Ibarra-Medina-Krawinkler Deterioration Model with Bilinear Hysteretic Response (Bilin Material)
Hardening Material
See also:
Notes
CastFuse Material
Gray et al. [1] showed that the monotonic backbone curve of a CSF-brace with known properties (n, bo, h, L, fy, E)
after yielding can be expressed as a close-form solution that is given by, 𝑃 = 𝑃𝑝 / cos(2𝑑/𝐿), in which 𝑑 is the axial
deformation of the brace at increment 𝑖 and 𝑃𝑝 is the yield strength of the CSF-brace and is given by the following
expression
𝑃𝑝 = 𝑛𝑏𝑜 ℎ2 𝑓𝑦 /4𝐿
The elastic stiffness of the CSF-brace is given by,
ViscousDamper Material
See also:
Notes
BilinearOilDamper Material
See also:
Notes
Modified Ibarra-Medina-Krawinkler Deterioration Model with Bilinear Hysteretic Response (Bilin Ma-
terial)
See also:
Notes
See also:
Notes
See also:
Notes
SAWS Material
uniaxialMaterial(’SAWS’, matTag, F0, FI, DU, S0, R1, R2, R3, R4, alpha, beta)
This file contains the class definition for SAWSMaterial. SAWSMaterial provides the implementation of a
one-dimensional hysteretic model develeped as part of the CUREe Caltech wood frame project.
See also:
Notes
BarSlip Material
uniaxialMaterial(’BarSlip’, matTag, fc, fy, Es, fu, Eh, db, ld, nb, depth, height, ancLratio=1.0, bsFlag,
type, damage=’Damage’, unit=’psi’)
This command is used to construct a uniaxial material that simulates the bar force versus slip response of a
reinforcing bar anchored in a beam-column joint. The model exhibits degradation under cyclic loading. Cyclic
degradation of strength and stiffness occurs in three ways: unloading stiffness degradation, reloading stiffness
degradation, strength degradation.
See also:
Notes
Bond SP01 - - Strain Penetration Model for Fully Anchored Steel Reinforcing Bars
See also:
Notes
Fatigue Material
See also:
Notes
Impact Material
See also:
Notes
Note:
1. This material is implemented as a compression-only gap material. Fult and gap should be input as negative
values.
2. Recomended Values:
• Kmax = 20300 kN/m of abutment width
• Kcur = Kmax
• Rf = 0.7
• Fult = -326 kN per meter of abutment width
• gap = -2.54 cm
See also:
Notes
uniaxialMaterial(’LimitState’, matTag, s1p, e1p, s2p, e2p, s3p, e3p, s1n, e1n, s2n, e2n, s3n, e3n, pinchX,
pinchY, damage1, damage2, beta, curveTag, curveType)
This command is used to construct a uniaxial hysteretic material object with pinching of force and deformation,
damage due to ductility and energy, and degraded unloading stiffness based on ductility. Failure of the material
is defined by the associated Limit Curve.
Note:
• negative backbone points should be entered as negative numeric values
See also:
Notes
MinMax Material
See also:
Notes
ElasticBilin Material
See also:
Notes
ElasticMultiLinear Material
elastic. This means that the material loads and unloads along the same curve, and no energy is dissipated. The
slope given by the last two specified points on the positive strain axis is extrapolated to infinite positive strain.
Similarly, the slope given by the last two specified points on the negative strain axis is extrapolated to infinite
negative strain. The number of provided strain points needs to be equal to the number of provided stress points.
See also:
Notes
MultiLinear
See also:
Notes
See also:
Notes
See also:
Notes
PathIndependent Material
Pinching4 Material
uniaxialMaterial(’Pinching4’, matTag, ePf1, ePd1, ePf2, ePd2, ePf3, ePd3, ePf4, ePd4, <eNf1, eNd1,
eNf2, eNd2, eNf3, eNd3, eNf4, eNd4>, rDispP, rForceP, uForceP, <rDispN, rForceN,
uForceN>, gK1, gK2, gK3, gK4, gKLim, gD1, gD2, gD3, gD4, gDLim, gF1, gF2, gF3,
gF4, gFLim, gE, dmgType)
This command is used to construct a uniaxial material that represents a ‘pinched’ load-deformation response
and exhibits degradation under cyclic loading. Cyclic degradation of strength and stiffness occurs in three ways:
unloading stiffness degradation, reloading stiffness degradation, strength degradation.
See also:
Notes
uniaxialMaterial(’ECC01’, matTag, sigt0, epst0, sigt1, epst1, epst2, sigc0, epsc0, epsc1, alphaT1, al-
phaT2, alphaC, alphaCU, betaT, betaC)
This command is used to construct a uniaxial Engineered Cementitious Composites (ECC)material object based
on the ECC material model of Han, et al. (see references). Reloading in tension and compression is linear.
See also:
Notes
SelfCentering Material
See also:
Notes
Viscous Material
Note:
See also:
Notes
BoucWen Material
uniaxialMaterial(’BoucWen’, matTag, alpha, ko, n, gamma, beta, Ao, deltaA, deltaNu, deltaEta)
This command is used to construct a uniaxial Bouc-Wen smooth hysteretic material object. This material model
is an extension of the original Bouc-Wen model that includes stiffness and strength degradation (Baber and
Noori (1985)).
See also:
Notes
BWBN Material
uniaxialMaterial(’BWBN’, matTag, alpha, ko, n, gamma, beta, Ao, q, zetas, p, Shi, deltaShi, lambda,
tol, maxIter)
This command is used to construct a uniaxial Bouc-Wen pinching hysteretic material object. This material
model is an extension of the original Bouc-Wen model that includes pinching (Baber and Noori (1986) and
Foliente (1995)).
See also:
Notes
KikuchiAikenHDR Material
uniaxialMaterial(’KikuchiAikenHDR’, matTag, tp, ar, hr, <’-coGHU’, cg, ch, cu>, <’-coMSS’, rs, rf>)
This command is used to construct a uniaxial KikuchiAikenHDR material object. This material model produces
nonlinear hysteretic curves of high damping rubber bearings (HDRs).
Note:
1) Following rubber types for tp are available:
• 'X0.6' Bridgestone X0.6, standard compressive stress, up to 400% shear strain
• 'X0.6-0MPa' Bridgestone X0.6, zero compressive stress, up to 400% shear strain
• 'X0.4' Bridgestone X0.4, standard compressive stress, up to 400% shear strain
• 'X0.4-0MPa' Bridgestone X0.4, zero compressive stress, up to 400% shear strain
• 'X0.3' Bridgestone X0.3, standard compressive stress, up to 400% shear strain
• 'X0.3-0MPa' Bridgestone X0.3, zero compressive stress, up to 400% shear strain
2) This material uses SI unit in calculation formula. ar and hr must be converted into [m^2] and [m], respectively.
3) rs and rf areavailable if this material is applied to multipleShearSpring (MSS) element. Recommended values
1 1
are rs = ∑︀𝑛−1 sin(𝜋*𝑖/𝑛) 2
and rf = ∑︀𝑛−1 sin(𝜋*𝑖/𝑛) , where n is the number of springs in the MSS. For example,
𝑖=0 𝑖=0
when n=8, rs =0.2500, rf =0.1989.
See also:
Notes
KikuchiAikenLRB Material
uniaxialMaterial(’KikuchiAikenLRB’, matTag, type, ar, hr, gr, ap, tp, alph, beta, <’-T’, temp>, <’-
coKQ’, rk, rq>, <’-coMSS’, rs, rf>)
This command is used to construct a uniaxial KikuchiAikenLRB material object. This material model produces
nonlinear hysteretic curves of lead-rubber bearings.
Note:
1) Following rubber types for type are available:
• 1 lead-rubber bearing, up to 400% shear strain [Kikuchi et al., 2010 & 2012]
2) This material uses SI unit in calculation formula. Input arguments must be converted into [m], [m^2], [N/m^2].
3) rs and rf are available if this material is applied to multipleShearSpring (MSS) element. Recommended
1
values are rs = ∑︀𝑛−1 sin(𝜋*𝑖/𝑛) 2
and rf = ∑︀ 𝑛−11sin(𝜋*𝑖/𝑛) , where n is the number of springs in the MSS.
𝑖=0 𝑖=0
For example, when n=8, rs = 0.2500 and rf = 0.1989.
See also:
Notes
AxialSp Material
Note:
1. Input parameters are required to satisfy followings.
fcy < 0.0 < fty
0.0 <= bty < bte <= 1.0
0.0 <= bcy <= 1.0
fcy <= fcr <= 0.0
See also:
Notes
AxialSpHD Material
uniaxialMaterial(’AxialSpHD’, matTag, sce, fty, fcy, <bte, bty, bth, bcy, fcr, ath>)
This command is used to construct a uniaxial AxialSpHD material object. This material model produces axial
stress-strain curve of elastomeric bearings including hardening behavior.
Note:
1. Input parameters are required to satisfy followings.
fcy < 0.0 < fty
0.0 <= bty < bth < bte <= 1.0
0.0 <= bcy <= 1.0
fcy <= fcr <= 0.0
1.0 <= ath
See also:
Notes
This command is used to construct a uniaxial material that simulates a pinched load-deformation response and exhibits
degradation under cyclic loading. This material works with the RotationShearCurve limit surface that can monitor a
key deformation and/or a key force in an associated frame element and trigger a degrading behavior in this material
when a limiting value of the deformation and/or force are reached. The material can be used in two modes: 1) direct in-
put mode, where pinching and damage parameters are directly input; and 2) calibrated mode for shear-critical concrete
columns, where only key column properties are input for model to fully define pinching and damage parameters.
uniaxialMaterial(’PinchingLimitStateMaterial’, matTag, nodeT, nodeB, driftAxis, Kelas, crvTyp, crv-
Tag, YpinchUPN, YpinchRPN, XpinchRPN, YpinchUNP, YpinchRNP, XpinchRNP,
dmgStrsLimE, dmgDispMax, dmgE1, dmgE2, dmgE3, dmgE4, dmgELim, dmgR1,
dmgR2, dmgR3, dmgR4, dmgRLim, dmgRCyc, dmgS1, dmgS2, dmgS3, dmgS4,
dmgSLim, dmgSCyc)
MODE 1: Direct Input
See also:
Notes
uniaxialMaterial(’CFSWSWP’, matTag, height, width, fut, tf, Ife, Ifi, ts, np, ds, Vs, sc, nc, type,
openingArea, openingLength)
This command is used to construct a uniaxialMaterial model that simulates the hysteresis response (Shear
strength-Lateral displacement) of a wood-sheathed cold-formed steel shear wall panel (CFS-SWP). The hystere-
sis model has smooth curves and takes into account the strength and stiffness degradation, as well as pinching
effect.
This uniaxialMaterial gives results in Newton and Meter units, for strength and displacement, respectively.
See also:
Notes
uniaxialMaterial(’CFSSSWP’, matTag, height, width, fuf, fyf, tf, Af, fus, fys, ts, np, ds, Vs, sc, dt,
openingArea, openingLength)
This command is used to construct a uniaxialMaterial model that simulates the hysteresis response (Shear
strength-lateral Displacement) of a Steel-Sheathed Cold-Formed Steel Shear Wall Panel (CFS-SWP). The hys-
teresis model has smooth curves and takes into account the strength and stiffness degradation, as well as pinching
effect.
This uniaxialMaterial gives results in Newton and Meter units, for strength and displacement, respectively.
See also:
Notes
Backbone Material
Hysteretic Backbone
12. LiquefiedSand
ArctangentBackbone
𝐹 (𝑥) = 𝐾1 𝑎𝑡𝑎𝑛(𝐾2 𝑥)
𝐾2 = 𝑡𝑎𝑛(𝛼)/𝛾
BilinearBackbone
ManderBackbone
MultilinearBackbone
TrilinearBackbone
MaterialBackbone
ReeseStiffClayBelowWS
Esi
𝐸𝑠𝑖 = 𝑘𝑠 𝑥
where ks is the k value for static load selected from the following table
The average shear strength should be computed from the shear strength of the soil to a depth of 5 pile diameters. It
should be defined as half the total maximum principal stress difference in an unconsolidated undrained triaxial test.
y50
𝑦50 = 𝜀50 𝑏
Use an appropriate value of 𝜀50 from results of laboratory tests or, in the absence of laboratory tests, from the following
table.
As
Choose the appropriate value of As from the following figure for the particular nondimensional depth.
Pc
Compute the ultimate soil resistance per unit length of pile, using the smaller of the values given by the equations
below
𝑝𝑐𝑡 = 2𝑐𝑎 𝑏 + 𝛾 ′ 𝑏𝑥 + 2.83𝑐𝑎 𝑥
𝑝𝑐𝑑 = 11𝑐𝑏
where
1. Obtain values for undrained soil shear strength 𝑐, soil submerged unit weight 𝛾 ′ , and pile diameter 𝑏 2. Compute
the average undrained soil shear strength 𝑐𝑎 over the depth 𝑥.
ReeseStiffClayAboveWS
pu
Obtain values for undrained shear strength 𝑐, soil unit weight 𝛾, and pile diameter 𝑏. Also obtain the values of 𝜀50
from stress-strain curves. If no stress-strain curves are available, use a value from 𝜀50 of 0.010 or 0.005 as given in the
following table, the larger value being more conservative.
Compute the ultimate soil resistance per unit length of shaft, 𝑝𝑢 , using the smaller of the values given by the following
equations
𝛾′ 𝐽
𝑝𝑢 = (3 + 𝑥 + 𝑥)𝑐𝑏𝑝𝑢 = 9𝑐𝑏
𝑐 𝑏
y50
Compute the deflection, 𝑦50 at one-half the ultimate soil resistance from the following equation
𝑦50 = 2.5𝜀50 𝑏
VuggyLimestone
CementedSoil
There are no available recommendations on developing p-y curves for soil with cohesion and friction angle that are
generally accepted. Generally, in design, the soil is classified in only two different types: cohesive or cohesionless. In
the practice, this simplification leads to a significantly conservative design in the case of cemented soil or silt, which
always neglects the soil resistance from the cohesion component (Juirnarongrit et al. 2005).
𝑝 = 𝐾𝑝𝑦 𝑧𝑦
𝑝 = 𝐶𝑦 1/𝑛
where
𝑝𝑀
𝐶= 1/𝑛
𝑦𝑀
𝑝𝑀
𝑛=
𝑚𝑦𝑀
𝑝𝑈 − 𝑝𝑀
𝑚=
𝑦𝑈 − 𝑦𝑀
WeakRock
For “weak rock” defined as rock with unconfined compressive strength between 0.5 MPa and 5 MPa, the shape of the
p-y curve, as shown in above Figure, can be described by the following equations. For the initial linear portion of the
curve
𝑝 = 𝐾𝑖𝑟 𝑦, for 𝑦 ≤ 𝑦𝐴
Kir
𝐾𝑖𝑟 is the initial slope of the curve, which is related to the initial elastic modulus of the rock mass as follows
where 𝐸𝑖𝑟 = rock mass initial elastic modulus and 𝑘𝑖𝑟 = dimensionless constant given by
(︂ )︂
400𝑥𝑟
𝑘𝑖𝑟 = 100 + , for 0 ≤ 𝑥𝑟 ≤ 3𝐵
3𝐵
𝑘𝑖𝑟 = 500, for 𝑥𝑟 ≥ 3𝐵
pur
in which 𝑞𝑢 = uniaxial compressive strength of intact rock, 𝛼𝑟 = strength reduction factor, and 𝑥𝑟 = depth below rock
surface. Selection of 𝛼𝑟 is based on the assumption that fracturing will occur at the surface of the rock under small
deflections, thus reducing the rock mass compressive strength. The value of 𝛼𝑟 is assumed to be one-third for RQD
of 100 and to increase linearly to unity at RQD of zero. The underlying assumption is that, if the rock mass is already
highly fractured, then no additional fracturing with accompanying strength loss will occur. However, this approach
appears to have a fundamental shortcoming in that it relies on the compressive strength of the intact rock and not the
strength of the rock mass. For a highly fractured rock mass (low RQD) with a high-intact rock strength, it seems that
the rock mass strength could be overestimated.
yrm
𝑦𝑟𝑚 = 𝑘𝑟𝑚 𝐵
where
𝑘𝑟𝑚 is a constant ranging from 0.0005 to 0.00005 that serves to establish the overall stiffness of the curve.
𝐵 is the shaft diameter.
LiquefiedSand
The typical p-y curve for liquefied sand is shown in the figure above. The pile lateral soil resistance, P, increases with
the pile deflection along a concave upward curve until the deflection reaches 150 mm. Note that 𝑃𝑢 is the ultimate
lateral resistance when the pile deflection (y value) is equal to or greater than 150 mm.
The following equations are proposed by Rollins et al. (2005) to estimate the mobilization of pile lateral soil resistance
(P) with deflection (y):
Note that A, B, and C in the equations above are the curve fitting parameters that depend on the depth (X). D is the
pile diameter. 𝑃𝑑 is the pile diameter correction factor and it is limited to the pile diameter between 0.3 m and 2.6 m.
For example,
matType = 'ElasticIsotropic'
matTag = 1
matArgs = [E, v]
nDMaterial(matType, matTag, *matArgs)
Standard Models
ElasticIsotropic
ElasticOrthotropic
nDMaterial(’ElasticOrthotropic’, matTag, Ex, Ey, Ez, nu_xy, nu_yz, nu_zx, Gxy, Gyz, Gzx, rho=0.0)
This command is used to construct an ElasticOrthotropic material object.
J2Plasticity
𝜎 = 𝐾 * 𝑡𝑟𝑎𝑐𝑒(𝜖𝑒 ) + (2 * 𝐺) * 𝑑𝑒𝑣(𝜖𝑒 )
Yield Function
√︀
𝜑(𝜎, 𝑞) = ||𝑑𝑒𝑣(𝜎)|| − ( 23 * 𝑞(𝑥𝑖 ))
Flow Rules
𝜕𝜑
𝜖˙𝑝 = 𝛾 *
𝜕𝜎
𝜕𝜑
𝜉˙ = −𝛾 *
𝜕𝑞
Linear Viscosity
𝜑
𝛾= (𝑖𝑓 𝜑 > 0)
𝜂
Backward Euler Integration Routine Yield condition enforced at time n+1
set 𝜂 = 0 for rate independent case
DruckerPrager
nDMaterial(’DruckerPrager’, matTag, K, G, sigmaY, rho, rhoBar, Kinf, Ko, delta1, delta2, H, theta, density,
atmPressure=101e3)
This command is used to construct an multi dimensional material object that has a Drucker-Prager yield cri-
terium.
PlaneStress
PlaneStrain
MultiaxialCyclicPlasticity
BoundingCamClay
PlateFiber
FSAM
nDMaterial(’FSAM’, matTag, rho, sXTag, sYTag, concTag, rouX, rouY, nu, alfadow)
This command is used to construct a nDMaterial FSAM (Fixed-Strut-Angle-Model, Figure 1, Kolozvari et
al., 2015), which is a plane-stress constitutive model for simulating the behavior of RC panel elements under
generalized, in-plane, reversed-cyclic loading conditions (Ulugtekin, 2010; Orakcal et al., 2012). In the FSAM
constitutive model, the strain fields acting on concrete and reinforcing steel components of a RC panel are
assumed to be equal to each other, implying perfect bond assumption between concrete and reinforcing steel
bars. While the reinforcing steel bars develop uniaxial stresses under strains in their longitudinal direction, the
behavior of concrete is defined using stress-strain relationships in biaxial directions, the orientation of which
is governed by the state of cracking in concrete. Although the concrete stress-strain relationship used in the
FSAM is fundamentally uniaxial in nature, it also incorporates biaxial softening effects including compression
softening and biaxial damage. For transfer of shear stresses across the cracks, a friction-based elasto-plastic
shear aggregate interlock model is adopted, together with a linear elastic model for representing dowel action
on the reinforcing steel bars (Kolozvari, 2013). Note that FSAM constitutive model is implemented to be used
with Shear-Flexure Interaction model for RC walls (SFI_MVLEM), but it could be also used elsewhere.
ManzariDafalias
nDMaterial(’ManzariDafalias’, matTag, G0, nu, e_init, Mc, c, lambda_c, e0, ksi, P_atm, m, h0, ch, nb, A0,
nd, z_max, cz, Den)
This command is used to construct a multi-dimensional Manzari-Dafalias(2004) material.
PM4Sand
nDMaterial(’PM4Sand’, matTag, D_r, G_o, h_po, Den, P_atm, h_o, e_max, e_min, n_b, n_d, A_do, z_max,
c_z, c_e, phi_cv, nu, g_degr, c_dr, c_kaf, Q_bolt, R_bolt, m_par, F_sed, p_sed)
This command is used to construct a 2-dimensional PM4Sand material.
PM4Silt
nDMaterial(’PM4Silt’, matTag, S_u, Su_Rat, G_o, h_po, Den <Su_factor, Patm, nu, nG, h0, eInit, lambda,
phicv, nb_wet, nb_dry, nd, Ado, ru_max, zmax, cz, ce, Cgd, ckaf, m_m, CG_consol>)
Code Developed by: Long Chen and pedro at U.Washington.
[Boulanger-Ziotopoulou2018]
This command is used to construct a 2-dimensional PM4Silt material.
Elastoplastic by
The program will use the default value of a secondary parameter if a negative input is assigned to that parameter, e.g.
Ado = -1. However, FirstCall is mandatory when switching from elastic to elastoplastic if negative inputs are assigned
to stress-dependent secondary parameters, e.g. Ado and zmax. FirstCall can be set as,
The user should check that the results are not sensitive to time step size.
StressDensityModel
nDMaterial(’stressDensity’, matTag, mDen, eNot, A, n, nu, a1, b1, a2, b2, a3, b3, fd, muNot, muCyc, sc, M,
patm, *ssls, hsl, p1)
This command is used to construct a multi-dimensional stress density material object for modeling sand be-
haviour following the work of Cubrinovski and Ishihara (1998a,b).
AcousticMedium
1. CycLiqCP
2. CycLiqCPSP
CycLiqCP
nDMaterial(’CycLiqCP’, matTag, G0, kappa, h, Mfc, dre1, Mdc, dre2, rdr, alpha, dir, ein, rho)
This command is used to construct a multi-dimensional material object that that follows the constitutive behavior
of a cyclic elastoplasticity model for large post- liquefaction deformation.
CycLiqCP material is a cyclic elastoplasticity model for large post-liquefaction deformation, and is implemented
using a cutting plane algorithm. The model is capable of reproducing small to large deformation in the pre- to
post-liquefaction regime. The elastic moduli of the model are pressure dependent. The plasticity in the model
is developed within the framework of bounding surface plasticity, with special consideration to the formulation
of reversible and irreversible dilatancy.
The model does not take into consideration of the state of sand, and requires different parameters for sand under
different densities and confining pressures. The surfaces (i.e. failure and maximum pre-stress) are considered as
circles in the pi plane.
The model has been validated against VELACS centrifuge model tests and has used on numerous simulations of
liquefaction related problems.
When this material is employed in regular solid elements (e.g., FourNodeQuad, Brick), it simulates drained soil
response. When solid-fluid coupled elements (u-p elements and SSP u-p elements) are used, the model is able to
simulate undrained and partially drained behavior of soil.
CycLiqCPSP
nDMaterial(’CycLiqCPSP’, matTag, G0, kappa, h, M, dre1, dre2, rdr, alpha, dir, lambdac, ksi, e0, np, nd,
ein, rho)
This command is used to construct a multi-dimensional material object that that follows the constitutive behavior
of a cyclic elastoplasticity model for large post- liquefaction deformation.
CycLiqCPSP material is a constitutive model for sand with special considerations for cyclic behaviour and
accumulation of large post-liquefaction shear deformation, and is implemented using a cutting plane algorithm.
The model: (1) achieves the simulation of post-liquefaction shear deformation based on its physics, allowing the
unified description of pre- and post-liquefaction behavior of sand; (2) directly links the cyclic mobility of sand
with reversible and irreversible dilatancy, enabling the unified description of monotonic and cyclic loading; (3)
introduces critical state soil mechanics concepts to achieve unified modelling of sand under different states.
The critical, maximum stress ratio and reversible dilatancy surfaces follow a rounded triangle in the pi plane similar
to the Matsuoka-Nakai criterion.
When this material is employed in regular solid elements (e.g., FourNodeQuad, Brick), it simulates drained soil
response. When solid-fluid coupled elements (u-p elements and SSP u-p elements) are used, the model is able to
simulate undrained and partially drained behavior of soil.
1. PlaneStressUserMaterial
2. PlateFromPlaneStress
3. PlateRebar
4. PlasticDamageConcretePlaneStress
PlaneStressUserMaterial
nDMaterial(’PlaneStressUserMaterial’, matTag, nstatevs, nprops, fc, ft, fcu, epsc0, epscu, epstu, stc)
This command is used to create the multi-dimensional concrete material model that is based on the damage
mechanism and smeared crack model.
PlateFromPlaneStress
matTag (int) new integer tag identifying material deriving from pre-defined PlaneStress
material
pre_def_matTag (int) integer tag identifying PlaneStress material
OutofPlaneModulus shear modulus for out of plane stresses
(float)
PlateRebar
matTag (int) new integer tag identifying material deriving from pre-defined uniaxial material
pre_def_matTag (int) integer tag identifying uniaxial material
sita (float) define the angle of reinforcement layer, 90 (longitudinal), 0 (tranverse)
PlasticDamageConcretePlaneStress
1. ContactMaterial2D
2. ContactMaterial3D
ContactMaterial2D
The ContactMaterial2D nDMaterial defines the constitutive behavior of a frictional interface between two bodies in
contact. The interface defined by this material object allows for sticking, frictional slip, and separation between the
two bodies in a two-dimensional analysis. A regularized Coulomb frictional law is assumed. Information on the theory
behind this material can be found in, e.g. Wriggers (2002).
Note:
1. The ContactMaterial2D nDMaterial has been written to work with the SimpleContact2D and BeamContact2D
element objects.
2. There are no valid recorder queries for this material other than those which are listed with those elements
References:
Wriggers, P. (2002). Computational Contact Mechanics. John Wilely & Sons, Ltd, West Sussex, England.
ContactMaterial3D
The ContactMaterial3D nDMaterial defines the constitutive behavior of a frictional interface between two bodies in
contact. The interface defined by this material object allows for sticking, frictional slip, and separation between the
two bodies in a three-dimensional analysis. A regularized Coulomb frictional law is assumed. Information on the
theory behind this material can be found in, e.g. Wriggers (2002).
Note:
1. The ContactMaterial3D nDMaterial has been written to work with the SimpleContact3D and BeamContact3D
element objects.
2. There are no valid recorder queries for this material other than those which are listed with those elements.
References:
Wriggers, P. (2002). Computational Contact Mechanics. John Wilely & Sons, Ltd, West Sussex, England.
1. InitialStateAnalysisWrapper
2. Initial Stress Material
3. Initial Strain Material
InitialStateAnalysisWrapper
Note:
1. There are no valid recorder queries for the InitialStateAnalysisWrapper.
2. The InitialStateAnalysis off command removes all previously defined recorders. Two sets of recorders are
needed if the results before and after this command are desired. See the example below for more.
3. The InitialStateAnalysisWrapper material is somewhat tricky to use in dynamic analysis. Sometimes setting
the displacement to zero appears to be interpreted as an initial displacement in subsequent steps, resulting in
undesirable vibrations.
See also:
Notes
See also:
Notes
1. PressureIndependMultiYield
2. PressureDependMultiYield
3. PressureDependMultiYield02
4. PressureDependMultiYield03
PressureIndependMultiYield
PressureDependMultiYield
PressureDependMultiYield02
PressureDependMultiYield03
1. FluidSolidPorousMaterial
FluidSolidPorousMaterial
For example,
secType = 'Elastic'
secTag = 1
secArgs = [E, A, Iz]
section(secType, secTag, *secArgs)
Elastic Section
Note: The elastic section can be used in the nonlinear beam column elements, which is useful in the initial stages of
developing a complex model.
Fiber Section
Note:
1. The commands below should be called after the section command to generate all the fibers in the section.
2. The patch and layer commands can be used to generate multiple fibers in a single command.
Fiber Command
Patch Command
patch(type, *args)
The patch command is used to generate a number of fibers over a cross-sectional area. Currently there are three
types of cross-section that fibers can be generated: quadrilateral, rectangular and circular.
matTag (int)material tag associated with this fiber (UniaxialMaterial tag for a FiberSection and NDMa-
terial tag for use in an NDFiberSection).
numSubdivIJ number of subdivisions (fibers) in the IJ direction.
(int)
numSubdivJK number of subdivisions (fibers) in the JK direction.
(int)
crdsI (list y & z-coordinates of vertex I (local coordinate system)
(float))
crdsJ (list y & z-coordinates of vertex J (local coordinate system)
(float))
crdsK (list y & z-coordinates of vertex K (local coordinate system)
(float))
crdsL (list y & z-coordinates of vertex L (local coordinate system)
(float))
matTag (int)material tag associated with this fiber (UniaxialMaterial tag for a FiberSection and NDMa-
terial tag for use in an NDFiberSection).
numSubdivY number of subdivisions (fibers) in local y direction.
(int)
numSubdivZ number of subdivisions (fibers) in local z direction.
(int)
crdsI (list y & z-coordinates of vertex I (local coordinate system)
(float))
crdsJ (list y & z-coordinates of vertex J (local coordinate system)
(float))
matTag (int) material tag associated with this fiber (UniaxialMaterial tag for a FiberSection and ND-
Material tag for use in an NDFiberSection).
numSubdivCirc number of subdivisions (fibers) in the circumferential direction (number of wedges)
(int)
numSubdivRad number of subdivisions (fibers) in the radial direction (number of rings)
(int)
center (list y & z-coordinates of the center of the circle
(float))
rad (list (float)) internal & external radius
ang (list (float)) starting & ending-coordinates angles (degrees)
Layer Command
layer(type, *args)
The layer command is used to generate a number of fibers along a line or a circular arc.
matTag (int) material tag associated with this fiber (UniaxialMaterial tag for a FiberSection and NDMa-
terial tag for use in an NDFiberSection).
numFiber number of fibers along line
(int)
areaFiber area of each fiber
(float)
start (list y & z-coordinates of first fiber in line (local coordinate system)
(float))
end (list y & z-coordinates of last fiber in line (local coordinate system)
(float))
layer(’circ’, matTag,numFiber,areaFiber,*center,radius,*ang=[0.0,360.0-360/numFiber])
This command is used to construct a line of fibers along a circular arc
matTag (int) material tag associated with this fiber (UniaxialMaterial tag for a FiberSection and NDMa-
terial tag for use in an NDFiberSection).
numFiber number of fibers along line
(int)
areaFiber area of each fiber
(float)
center (list y & z-coordinates of center of circular arc
(float))
radius radius of circlular arc
(float)
ang (list starting and ending angle (optional)
(float))
Note:
1. The commands below should be called after the section command to generate all the fibers in the section.
2. The patch and layer commands can be used to generate multiple fibers in a single command.
NDFiber Section
section(’NDFiber’, secTag)
This command allows the user to construct an NDFiberSection object. Each NDFiberSection object is composed
of NDFibers, with each fiber containing an NDMaterial, an area, and a location (y,z). The NDFiberSection works
for 2D and 3D frame elements and it queries the NDMaterial of each fiber for its axial and shear stresses. In 2D,
stress components 11 and 12 are obtained from each fiber in order to provide stress resultants for axial force,
bending moment, and shear [P, Mz, Vy]. Stress components 11, 12, and 13 lead to all six stress resultants
in 3D [P, Mz, Vy, My, Vz, T].
The NDFiberSection works with any NDMaterial via wrapper classes that perform static condensation of the
stress vector down to the 11, 12, and 13 components, or via specific NDMaterial subclasses that implement the
appropriate fiber stress conditions.
Note:
1. The commands below should be called after the section command to generate all the fibers in the section.
2. The patch and layer commands can be used to generate multiple fibers in a single command.
1. fiber()
2. patch()
3. layer()
Note: The section dimensions d, tw, bf, and tf can be found in the AISC steel manual.
RC Section
of a rectangular reinforced concrete section with core and confined regions of concrete and single top and bottom
layers of reinforcement appropriate for plane frame analysis.
Note: For more general reinforced concrete section definitions, use the Fiber Section command.
RCCircular Section
Parallel Section
Section Aggregator
Uniaxial Section
Bidirectional Section
Isolator2spring Section
section(’Isolator2spring’, matTag, tol, k1, Fyo, k2o, kvo, hb, PE, Po=0.0)
This command is used to construct an Isolator2spring section object, which represents the buckling behavior of
an elastomeric bearing for two-dimensional analysis in the lateral and vertical plane. An Isolator2spring section
represents the resultant force-deformation behavior of the bearing, and should be used with a zeroLengthSection
element. The bearing should be constrained against rotation.
LayeredShell
For example,
frnType = 'Coulomb'
frnTag = 1
frnArgs = [mu]
frictionModel(frnType, frnTag, *frnArgs)
Coulomb
REFERENCE:
Constantinou, M.C., Tsopelas, P., Kasalanati, A., and Wolff, E.D. (1999). “Property modification factors for seismic
isolation bearings”. Report MCEER-99-0012, Multidisciplinary Center for Earthquake Engineering Research, State
University of New York.
frictionModel(’VelNormalFrcDep’, frnTag, aSlow, nSlow, aFast, nFast, alpha0, alpha1, alpha2, maxMu-
Fact)
This command is used to construct a VelNormalFrcDep friction model object.
For example,
transfType = 'Linear'
transfTag = 1
transfArgs = []
geomTransf(transfType, transfTag, *transfArgs)
Linear Transformation
PDelta Transformation
Corotational Transformation
Note: Currently the transformation does not deal with element loads and will ignore any that are applied to the
element.
In OpenSees, an analysis is an object which is composed by the aggregation of component objects. It is the component
objects which define the type of analysis that is performed on the model. The component classes, as shown in the
figure below, consist of the following:
1. ConstraintHandler – determines how the constraint equations are enforced in the analysis – how it handles the
boundary conditions/imposed displacements
2. DOF_Numberer – determines the mapping between equation numbers and degrees-of-freedom
3. Integrator – determines the predictive step for time t+dt
4. SolutionAlgorithm – determines the sequence of steps taken to solve the non-linear equation at the current time
step
5. SystemOfEqn/Solver – within the solution algorithm, it specifies how to store and solve the system of equations
in the analysis
6. Convergence Test – determines when convergence has been achieved.
Analysis commands
1. constraints commands
2. numberer commands
3. system commands
4. test commands
5. algorithm commands
6. integrator commands
7. analysis command
8. eigen command
9. analyze command
constraints(constraintType, *constraintArgs)
This command is used to construct the ConstraintHandler object. The ConstraintHandler object determines how
the constraint equations are enforced in the analysis. Constraint equations enforce a specified value for a DOF,
or a relationship between DOFs.
Plain Constraints
constraints(’Plain’)
This command is used to construct a Plain constraint handler. A plain constraint handler can only enforce
homogeneous single point constraints (fix command) and multi-point constraints constructed where the con-
straint matrix is equal to the identity (equalDOF command). The following is the command to construct a plain
constraint handler:
Note: As mentioned, this constraint handler can only enforce homogeneous single point constraints (fix command)
and multi-pont constraints where the constraint matrix is equal to the identity (equalDOF command).
Lagrange Multipliers
Note: The Lagrange multiplier method introduces new unknowns to the system of equations. The diagonal part of the
system corresponding to these new unknowns is 0.0. This ensure that the system IS NOT symmetric positive definite.
Penalty Method
Note: The degree to which the constraints are enforced is dependent on the penalty values chosen. Problems can
arise if these values are too small (constraint not enforced strongly enough) or too large (problems associated with
conditioning of the system of equations).
Transformation Method
constraints(’Transformation’)
This command is used to construct a transformation constraint handler, which enforces the constraints using the
transformation method. The following is the command to construct a transformation constraint handler
Note:
• The single-point constraints when using the transformation method are done directly. The matrix equation is
not manipulated to enforce them, rather the trial displacements are set directly at the nodes at the start of each
analysis step.
• Great care must be taken when multiple constraints are being enforced as the transformation method does not
follow constraints:
1. If a node is fixed, constrain it with the fix command and not equalDOF or other type of constraint.
2. If multiple nodes are constrained, make sure that the retained node is not constrained in any other con-
straint.
And remember if a node is constrained to multiple nodes in your model it probably means you have messed up.
numberer(numbererType, *numbererArgs)
This command is used to construct the DOF_Numberer object. The DOF_Numberer object determines the
mapping between equation numbers and degrees-of-freedom – how degrees-of-freedom are numbered.
Plain Numberer
numberer(’Plain’)
This command is used to construct a Plain degree-of-freedom numbering object to provide the mapping between
the degrees-of-freedom at the nodes and the equation numbers. A Plain numberer just takes whatever order the
domain gives it nodes and numbers them, this ordering is both dependent on node numbering and size of the
model.
Note: For very small problems and for the sparse matrix solvers which provide their own numbering scheme, order
is not really important so plain numberer is just fine. For large models and analysis using solver types other than the
sparse solvers, the order will have a major impact on performance of the solver and the plain handler is a poor choice.
RCM Numberer
numberer(’RCM’)
This command is used to construct an RCM degree-of-freedom numbering object to provide the mapping be-
tween the degrees-of-freedom at the nodes and the equation numbers. An RCM numberer uses the reverse
Cuthill-McKee scheme to order the matrix equations.
AMD Numberer
numberer(’AMD’)
This command is used to construct an AMD degree-of-freedom numbering object to provide the mapping be-
tween the degrees-of-freedom at the nodes and the equation numbers. An AMD numberer uses the approximate
minimum degree scheme to order the matrix equations.
numberer(’ParallelPlain’)
This command is used to construct a parallel version of Plain degree-of-freedom numbering object to provide
the mapping between the degrees-of-freedom at the nodes and the equation numbers. A Plain numberer just
takes whatever order the domain gives it nodes and numbers them, this ordering is both dependent on node
numbering and size of the model.
Use this command only for parallel model.
Warning: Don’t use this command if model is not parallel, for example, parametric study.
numberer(’ParallelRCM’)
This command is used to construct a parallel version of RCM degree-of-freedom numbering object to provide
the mapping between the degrees-of-freedom at the nodes and the equation numbers. A Plain numberer just
takes whatever order the domain gives it nodes and numbers them, this ordering is both dependent on node
numbering and size of the model.
Warning: Don’t use this command if model is not parallel, for example, parametric study.
system(systemType, *systemArgs)
This command is used to construct the LinearSOE and LinearSolver objects to store and solve the system of
equations in the analysis.
BandGeneral SOE
system(’BandGen’)
This command is used to construct a BandGeneralSOE linear system of equation object. As the name implies,
this class is used for matrix systems which have a banded profile. The matrix is stored as shown below in a
1dimensional array of size equal to the bandwidth times the number of unknowns. When a solution is required,
the Lapack routines DGBSV and SGBTRS are used.
BandSPD SOE
system(’BandSPD’)
This command is used to construct a BandSPDSOE linear system of equation object. As the name implies, this
class is used for symmetric positive definite matrix systems which have a banded profile. The matrix is stored as
shown below in a 1 dimensional array of size equal to the (bandwidth/2) times the number of unknowns. When
a solution is required, the Lapack routines DPBSV and DPBTRS are used.
ProfileSPD SOE
system(’ProfileSPD’)
This command is used to construct a profileSPDSOE linear system of equation object. As the name implies,
this class is used for symmetric positive definite matrix systems. The matrix is stored as shown below in a
1 dimensional array with only those values below the first non-zero row in any column being stored. This is
sometimes also referred to as a skyline storage scheme.
SuperLU SOE
system(’SuperLU’)
This command is used to construct a SparseGEN linear system of equation object. As the name implies, this
class is used for sparse matrix systems. The solution of the sparse matrix is carried out using SuperLU.
UmfPack SOE
system(’UmfPack’)
This command is used to construct a sparse system of equations which uses the UmfPack solver.
FullGeneral SOE
system(’FullGeneral’)
This command is used to construct a Full General linear system of equation object. As the name implies, the
class utilizes NO space saving techniques to cut down on the amount of memory used. If the matrix is of size,
nxn, then storage for an nxn array is sought from memory when the program runs. When a solution is required,
the Lapack routines DGESV and DGETRS are used.
Note: This type of system should almost never be used! This is because it requires a lot more memory than every
other solver and takes more time in the actal solving operation than any other solver. It is required if the user is
interested in looking at the global system matrix.
SparseSYM SOE
system(’SparseSYM’)
This command is used to construct a sparse symmetric system of equations which uses a row-oriented solution
method in the solution phase.
MUMPS Solver
Warning: Don’t use this command if model is not parallel, for example, parametric study.
test(testType, *testArgs)
This command is used to construct the LinearSOE and LinearSolver objects to store and solve the test of equa-
tions in the analysis.
NormUnbalance
When using the Penalty method additional large forces to enforce the penalty functions exist on the right hand
side, making convergence using this test usually impossible (even though solution might have converged).
NormDispIncr
When using the Lagrange method to enforce the constraints, the Lagrange multipliers appear in the solution
vector.
energyIncr
• When using the Penalty method additional large forces to enforce the penalty functions exist on the right
hand side, making convergence using this test usually impossible (even though solution might have con-
verged).
• When using the Lagrange method to enforce the constraints, the Lagrange multipliers appear in the solution
vector.
RelativeNormUnbalance
• When using the Penalty method additional large forces to enforce the penalty functions exist on the right
hand side, making convergence using this test usually impossible (even though solution might have con-
verged).
RelativeNormDispIncr
RelativeTotalNormDispIncr
RelativeEnergyIncr
FixedNumIter
NormDispAndUnbalance
NormDispOrUnbalance
algorithm(algoType, *algoArgs)
This command is used to construct a SolutionAlgorithm object, which determines the sequence of steps taken
to solve the non-linear equation.
Linear Algorithm
Note: As the tangent matrix typically will not change during the analysis in case of an elastic system it is highly
advantageous to use the -factorOnce option. Do not use this option if you have a nonlinear system and you want the
tangent used to be actual tangent at time of the analysis step.
Newton Algorithm
Krylov-Newton Algorithm
SecantNewton Algorithm
RaphsonNewton Algorithm
PeriodicNewton Algorithm
BFGS Algorithm
Broyden Algorithm
integrator(intType, *intArgs)
This command is used to construct the Integrator object. The Integrator object determines the meaning of the
terms in the system of equation object Ax=B.
The Integrator object is used for the following:
1. LoadControl
2. DisplacementControl
3. Parallel DisplacementControl
4. Minimum Unbalanced Displacement Norm
5. Arc-Length Control
LoadControl
1. The change in applied loads that this causes depends on the active load pattern (those load pattern not
set constant) and the loads in the load pattern. If the only active load acting on the Domain are in load
pattern with a Linear time series with a factor of 1.0, this integrator is the same as the classical load control
method.
2. The optional arguments are supplied to speed up the step size in cases where convergence is too fast and
slow down the step size in cases where convergence is too slow.
DisplacementControl
Parallel DisplacementControl
Warning: Don’t use this command if model is not parallel, for example, parametric study.
dlambda1 First load increment (pseudo-time step) at the first iteration in the next invocation of the
(float) analysis command.
Jd (int) Factor relating first load increment at subsequent time steps. (optional)
minLambda Min load increment. (optional)
(float)
maxLambda Max load increment. (optional)
(float)
Arc-Length Control
integrator(’ArcLength’, s, alpha)
Create a ArcLength integrator. In an analysis step with ArcLength we seek to determine the time step that will
result in our constraint equation being satisfied.
1. Central Difference
2. Newmark Method
3. Hilber-Hughes-Taylor Method
Central Difference
integrator(’CentralDifference’)
Create a centralDifference integrator.
1. The calculation of 𝑈𝑡 +∆𝑡, is based on using the equilibrium equation at time t. For this reason the method
is called an explicit integration method.
2. If there is no rayleigh damping and the C matrix is 0, for a diagonal mass matrix a diagonal solver may
and should be used.
Δ𝑡 1
3. For stability, 𝑇𝑛 < 𝜋
Newmark Method
1. If the accelerations are chosen as the unknowns and 𝛽 is chosen as 0, the formulation results in the fast but
conditionally stable explicit Central Difference method. Otherwise the method is implicit and requires an
iterative solution process.
2. Two common sets of choices are
1. Average Acceleration Method (𝛾 = 21 , 𝛽 = 14 )
2. Linear Acceleration Method (𝛾 = 12 , 𝛽 = 16 )
1 1
3. 𝛾 > 2 results in numerical damping proportional to 𝛾 − 2
1
4. The method is second order accurate if and only if 𝛾 = 2
𝛾 1
5. The method is unconditionally stable for 𝛽 >= 2 >= 4
Hilber-Hughes-Taylor Method
and second order accuracy (which is not possible with the regular Newmark object). Depending on choices of
input parameters, the method can be unconditionally stable.
1. Like Mewmark and all the implicit schemes, the unconditional stability of this method applies to linear
problems. There are no results showing stability of this method over the wide range of nonlinear problems
that potentially exist. Experience indicates that the time step for implicit schemes in nonlinear situations
can be much greater than those for explicit schemes.
2. 𝛼 = 1.0 corresponds to the Newmark method.
3. 𝛼 should be between 0.67 and 1.0. The smaller the 𝛼 the greater the numerical damping.
4. 𝛾 and 𝛽 are optional. The default values ensure the method is second order accurate and unconditionally
stable when 𝛼 is 23 <= 𝛼 <= 1.0. The defaults are:
(2−𝛼)2
𝛽= 4
and
3
𝛾= 2 −𝛼
1. Like Newmark and all the implicit schemes, the unconditional stability of this method applies to linear
problems. There are no results showing stability of this method over the wide range of nonlinear problems
that potentially exist. Experience indicates that the time step for implicit schemes in nonlinear situations
can be much greater than those for explicit schemes.
2. 𝛼𝑀 = 1.0, 𝛼𝐹 = 1.0 produces the Newmark Method.
3. 𝛼𝑀 = 1.0 corresponds to the integrator.HHT() method.
1
4. The method is second-order accurate provided 𝛾 = 2 + 𝛼𝑀 − 𝛼𝐹
5. The method is unconditionally stable provided 𝛼𝑀 >= 𝛼𝐹 >= 21 , 𝛽 >= 1
4 + 12 (𝛾𝑀 − 𝛾𝐹 )
6. 𝛾 and 𝛽 are optional. The default values ensure the method is unconditionally stable, second order accurate
and high frequency dissipation is maximized.
The defaults are:
1
𝛾= 2 + 𝛼𝑀 − 𝛼𝐹
and
𝛽 = 14 (1 + 𝛼𝑀 − 𝛼𝐹 )2
TRBDF2
integrator(’TRBDF2’)
Create a TRBDF2 integrator. The TRBDF2 integrator is a composite scheme that alternates between
the Trapezoidal scheme and a 3 point backward Euler scheme. It does this in an attempt to conserve
energy and momentum, something Newmark does not always do.
As opposed to dividing the time-step in 2 as outlined in the Bathe2007, we just switch alternate between the 2
integration strategies,i.e. the time step in our implementation is double that described in the Bathe2007.
Explicit Difference
integrator(’ExplicitDifference’)
Create a ExplicitDifference integrator.
1. When using Rayleigh damping, the damping ratio of high vibration modes is overrated, and the critical
time step size will be much smaller. Hence Modal damping is more suitable for this method.
2. There should be no zero element on the diagonal of the mass matrix when using this method.
3. Diagonal solver should be used when lumped mass matrix is used because the equations are uncoupled.
(︁√︀ )︁
4. For stability, ∆𝑡 ≤ 𝜁 2 + 1 − 𝜁 𝜔2
analysis(analysisType)
This command is used to construct the Analysis object, which defines what type of analysis is to be performed.
• determine the predictive step for time t+dt
• specify the tangent matrix and residual vector at any iteration
• determine the corrective step based on the displacement increment dU
Note: If the component objects are not defined before hand, the command automatically creates default component
objects and issues warning messages to this effect. The number of warning messages depends on the number of
component objects that are undefined.
eigen(solver=’-genBandArpack’, numEigenvalues)
Eigen value analysis. Return a list of eigen values.
Note:
1. The eigenvectors are stored at the nodes and can be printed out using a Node Recorder, the nodeEigenvector
command, or the Print command.
2. The default eigensolver is able to solve only for N-1 eigenvalues, where N is the number of inertial DOFs. When
running into this limitation the -fullGenLapack solver can be used instead of the default Arpack solver.
3. The -fullGenLapack option is VERY SLOW for moderate to large models
This command is used to compute the modal properties of a model after an eigen command.
This command computes the following modal properties:
• 𝑚𝑡 : A vector with the total mass of the structure for each DOF, considering both free and fixed DOFs.
• 𝑚𝑓 : The total mass of the structure, but considering only the masses at free DOFs.
• 𝐶𝑜𝑀 : The center of mass.
• 𝑔𝑚 : The generalized mass matrix.
• 𝑀 𝑃 𝐹 : The modal participation factors.
{
# list of one int value
"domainSize": [ndm],
# list of total mass values, [MX] for 1D, [MX, MY, RMZ] for 2D,
# [MX, MY, MZ, MRX, RMY, RMZ] for 3D
"totalMass": [mass],
# list of total mass values for free DOFs, [MX] for 1D,
# [MX, MY, RMZ] for 2D, [MX, MY, MZ, MRX, RMY, RMZ] for 3D
"totalFreeMass": [mass],
#
# modal participation factors for all modes
#
(continues on next page)
#
# modal participation masses for all modes
#
#
# modal participation masses (cumulative) for all modes
#
#
# modal participation mass ratios (%) for all modes
#
#
# modal participation mass ratios (%) (cumulative) for all modes
#
Note:
• This command can be used only if a previous call to eigen command has been performed.
• This command has only optional arguments, and they can be given in any order. Note, however, that the only
requirement is that the reportFileName must follow the '-file' option if used.
• The modal properties are computed and stored in the Domain object, so that they can be accessed later in the
responseSpectrumAnalysis Command.
• This command directly accesses the mass matrix of the model, so it accounts for both nodal masses and element’s
(distributed) masses. And the element mass matrix can be either lumped or consistent.
• The global mass matrix is then stored into a temporary sparse matrix storage, so it can be used for both small
and large models.
• This command can be used for both 2D problems (-ndm = 2, -ndf = 2 or 3) and 3D problems (-ndm = 3, -ndf =
3, 4 or 6). In both cases the algorithm computes rotational masses. If a node has rotational DOFs, the rotational
masses account for both the direct rotational masses (i.e. those input by the user at rotational DOFs) and the
effect of translational masses gyrating about the center of mass. If a node has no rotational DOF, only the latter
is considered.
• Only the values in 𝑔𝑚 and 𝑀 𝑃 𝐹 depend on the normalization of the eigenvectors. This normalization depends
on the solver used in the eigen command. The default '-genBandArpack' uses a mass-normalization, so that
the 𝑔𝑚 is the identity. On the contrary, the '-fullGenLapack' uses a displacement-normalization, so that
the largest component of the eigenvector is 1. If you use the '-genBandArpack', but want a displacement-
normalization of the eigenvectors, use the '-unorm' option.
Theory
The eigenvalues 𝜆 and the eigenvectors Φ can be obtained after solving the generalized eigenvalue problem for two
symmetric matrices 𝐾 (stiffness) and 𝑀 (mass) given by:
(𝐾 − 𝜆𝑀 ) Φ = 0
The global mass matrix 𝑀 is given by the assembly of 𝑛 elemental and nodal mass matrices 𝑚𝑒 :
𝑛
⋀︁
𝑀= 𝑚𝑒
𝑖=1
𝑀 is not necessarily diagonal, because some elemental matrices 𝑚𝑒 may be consistent. However, the computation of
𝐶𝑜𝑀 , 𝑚𝑡 and 𝑚𝑓 requires a lumped version of 𝑀 . The global lumped mass matrix 𝐿𝑀 can be computed by the
assembly of a diagonalized version of the elemental mass matrices 𝑚𝑒 :
𝑛
⋀︁
𝐿𝑀 = 𝑑𝑖𝑎𝑔 (𝑚𝑒 )
𝑖=1
𝑑𝑖𝑎𝑔 (𝑚𝑒 ) cannot be computed just by summing the summing the components of each row (in beams or solid with
higher order interpolation, this would produces negative terms on the diagonal mass matrix that would be unphysical).
Instead we use the HRZ algorithm [HintonEtAl1976], named after the authors Hinton, Rock and Zienkiewicz: “The
procedure of lumping recommended in view of the infinite possibilities offered by condition (5) is to compute the
diagonal terms of the consistent mass matrix and then scale these terms so as to preserve the total mass of the
element”.
The procedure is as follows:
• compute 𝐷𝑀 , a vector containing the sum of each row of 𝑚𝑒 .
• compute 𝑆𝑀 , a vector of size=ndf, obtained summing the components in 𝐷𝑀 pertaining to the same DOF (i
to ndf). This procedures allows to obtain the total elemental mass for each DOF.
• compute 𝐷𝐶, a vector containing only the diagonal terms in the consistent mass matrix 𝑚𝑒 .
• compute 𝑆𝐶, a vector of size=ndf, obtained summing the components in 𝐷𝐶 pertaining to the same DOF (i to
ndf).
• now we can obtain the scale factors for each dof 𝑖 as: 𝑆𝑀𝑖 /𝑆𝐶𝑖 .
• scale each diagonal term of the consistent mass matrix 𝐷𝐶𝑗 using the scale factor of the respective DOF
𝑆𝑀𝑖 /𝑆𝐶𝑖 :
𝑑𝑖𝑎𝑔 (𝑚𝑒 )𝑗 = 𝐷𝐶𝑗 · 𝑆𝑀𝑖 /𝑆𝐶𝑖 .
The center of mass 𝐶𝑜𝑀 and the total masses 𝑚𝑡 and 𝑚𝑓 of the structure, for each node 𝑛 with position 𝑋𝑛 and
each DOF 𝑖, can now be easily computed from 𝐿𝑀 :
𝑁 ∑︁
𝑛𝑜𝑑𝑒𝑠
𝑚𝑡𝑖 = 𝐿𝑀𝑛𝑖
𝑛=1
𝑁 ∑︁
𝑛𝑜𝑑𝑒𝑠
𝑚𝑓𝑖 = 𝐿𝑀𝑛𝑖 (if 𝑖 = 𝑓 𝑟𝑒𝑒)
𝑛=1
∑︀𝑁 𝑛𝑜𝑑𝑒𝑠
𝑛=1 𝑋𝑛𝑖 · 𝐿𝑀𝑛𝑖
𝐶𝑜𝑀𝑖 = (if 𝑖 = 𝑓 𝑟𝑒𝑒)
𝑚𝑓𝑖
If the default solver is used in the eigen command (-genBandArpack), and the option -unorm is not used, the
eigenvectors are mass-normalized and 𝑔𝑚 will be an identity matrix, i.e. a diagonal matrix whose diagonal entries
are = 1, and whose size is 𝑛𝑚 × 𝑛𝑚 (where 𝑛𝑚 is the number of requested eigenvalues).
The modal participation factor matrix 𝑀 𝑃 𝐹 is a 𝑛𝑚 × 𝑛𝑑𝑓 matrix (where ndf = 3 in 2D and 6 in 3D), where each
row contains the modal participation factors for each DOF. The modal participation factor for a certain mode 𝑖 and
DOF 𝑗 indicates how strongly the motion (or rotation) associated to that DOF is represented in the eigenvector 𝑖
Φ𝑇𝑖 𝑀 𝑇𝑗
𝑀 𝑃 𝐹𝑖𝑗 =
𝑔𝑚𝑖𝑖
where 𝑇𝑗 defines the magnitude of the rigid body response to imposed rigid body motion (displacement or
infinitesimal rotation) in the DOF 𝑗. Each 𝑛𝑑𝑓 × 1 block 𝑇𝑛𝑗 corresponds to the node 𝑛 and it is defined as (for the
3D/6DOFs case):
⎛ ⎞⎧ ⎫
1 0 0 0 𝑑𝑧 −𝑑𝑧 ⎪ ⎪ 𝑒1 ⎪
⎪
⎜0 1 0 −𝑑𝑧 0 𝑑 𝑥 ⎟⎪
⎟ ⎪
⎪ 𝑒2 ⎪
⎪
⎪
⎜ ⎪ ⎪
⎜0 0 1 𝑑𝑦 −𝑑𝑥 0 ⎟
⎨
𝑒3
⎬
𝑇𝑛𝑗 = ⎜⎜ ⎟
⎜0 0 0 1 0 0 ⎟⎟⎪⎪ 𝑒4 ⎪
⎪ ⎪
⎝0 0 0 0 1 0 ⎠⎪ ⎪ 𝑒5 ⎪
⎪
⎪
⎪
⎩ ⎪
0 0 0 0 0 1 𝑒6
⎭
where 𝑒𝑗 is 1, and all other 𝑒𝑝 (with 𝑝 ̸= 𝑗) are 0. 𝑑𝑥 , 𝑑𝑦 and 𝑑𝑧 are the distances of the node 𝑛 coordinates
𝑋𝑛 = (𝑥, 𝑦, 𝑧) from the center of mass 𝐶𝑜𝑀 = (𝑥0 , 𝑦0 , 𝑧0 ). Therefore, the modal participation factors accounts for
the masses directly input at translational and rotational DOFs, and also the rotational masses given by the
translational masses gyrating about the center of mass. Note, in fact, that even if the user does not input any rotational
mass, or even if the user uses 3D solid elements with no rotational DOF, the modal participation factors associated to
the rotational DOFs may be ̸= 0.
The modal participation mass matrix 𝑀 𝑃 𝑀 is a 𝑛𝑚 × 𝑛𝑑𝑓 matrix (where ndf = 3 in 2D and 6 in 3D), where each
row contains the modal participation masses for each DOF. The modal participation mass for a certain mode 𝑖 and
DOF 𝑗 is defined as
(︀ 𝑇 )︀2
Φ 𝑖 𝑀 𝑇𝑗
𝑀 𝑃 𝑀𝑖𝑗 =
𝑔𝑚𝑖𝑖
If the modal participation masses for each mode in a particular DOF are summed, it should give the total mass of the
structure for that DOF, exlcluding the masses at fixed DOFs.
Example
The following example shows how to:
• Use the modalProperties command
• Print the results on the console ('-print')
• Generate a report file in the current directory ('-file', 'ModalReport.txt')
• Use a displacement-normalization for the eigenvectors
For a complete example that runs an eigenvalue analysis, extracts the modal properties and runs a response spec-
trum analysis, see the documentation of the responseSpectrumAnalysis Command
ReportFile
The generated report file looks like this:
* 1. DOMAIN SIZE:
# This is the size of the problem: 2 for 2D problems, 3 for 3D problems.
3
* 2. EIGENVALUE ANALYSIS:
# MODE LAMBDA OMEGA FREQUENCY PERIOD
# ------------- ------------- ------------- ------------- -------------
1 7578.8 87.0563 13.8554 0.0721738
2 8484.47 92.1112 14.6599 0.0682131
3 10518.5 102.56 16.3229 0.0612636
4 85779 292.881 46.6134 0.0214531
5 89260.1 298.764 47.5498 0.0210306
6 101089 317.945 50.6025 0.0197619
(continues on next page)
* 5. CENTER OF MASS:
# The center of mass of the structure, calculated from free masses.
# X Y Z
# ------------- ------------- -------------
2 1.5 4.5
1 1.20368 0 0 0 0.661418
˓→ 0
2 0 -1.20172 0 0.637456 0
˓→ 0
3 0 0 0 0 0
˓→ -2.39705
4 0.430981 0 0 0 -1.8352
˓→ 0
5 0 -0.41375 0 -1.83591 0
˓→ 0
6 0 0 0 0 0
˓→ 0.780575
7 0 0 -1.17082 0 0
˓→ 0
1 1418.18 0 0 0 428.21
˓→ 0 (continues on next page)
1 1418.18 0 0 0 428.21
˓→ 0
2 1418.18 1430.41 0 402.49 428.21
˓→ 0
3 1418.18 1430.41 0 402.49 428.21
˓→ 9041.23
4 1600 1430.41 0 402.49 3724.99
˓→ 9041.23
5 1600 1599.99 0 3741.36 3724.99
˓→ 9041.23
6 1600 1599.99 0 3741.36 3724.99
˓→ 9999.99
7 1600 1599.99 1515.54 3741.36 3724.99
˓→ 9999.99
1 88.636 0 0 0 4.2821
˓→ 0
2 0 89.4005 0 5.59014 0
˓→ 0
3 0 0 0 0 0
˓→ 90.4123
4 11.3638 0 0 0 32.9678
˓→ 0
5 0 10.5988 0 46.3732 0
˓→ 0
6 0 0 0 0 0
˓→ 9.58755
7 0 0 94.7214 0 0
˓→ 0
1 88.636 0 0 0 4.2821
˓→ 0
2 88.636 89.4005 0 5.59014 4.2821
˓→ 0
3 88.636 89.4005 0 5.59014 4.2821
˓→ 90.4123
4 99.9997 89.4005 0 5.59014 37.2499
˓→ 90.4123
5 99.9997 99.9993 0 51.9633 37.2499
˓→ 90.4123
6 99.9997 99.9993 0 51.9633 37.2499
˓→ 99.9999
7 99.9997 99.9993 94.7214 51.9633 37.2499
˓→ 99.9999
The command can be called in two different ways, depending on how you store the Tn/Sa (response spectrum
function) values.
They can be either stored in a timeSeries . . .
. . . or in two lists
Note:
• This command can be used only if a previous call to eigen command and modalProperties Command has been
performed.
• It computes only the modal displacements, any modal combination is up to the user.
• The scale factor ('-scale', scale) for the output modal displacements is not used now, and it’s there for
future implementations. When your model is linear elastic there is no need to use this option. It will be useful in
future when we will allow using this command on a nonlinear model as a linear perturbation about a certain
nonlinear state. In that case, the scale factor can be set to a very small number, so that the computed modal
displacements will be very small (linear perturbation) and will not alter the nonlinear state of your model. Then
the inverse of the scale factor can be used to post-multiply any result for post-processing.
Theory
Once the eigenvalue problem (eigen command) has been solved, and once the modal properties (modalProperties
Command) have been computed, the modal displacements 𝑈 for mode 𝑖 at node 𝑛 and DOF 𝑗 is given by
𝑛
Φ𝑛𝑖𝑗 · 𝑀 𝑃 𝐹𝑖𝑗 · 𝑅𝑆𝑓 (𝑇𝑖 )
𝑈𝑖𝑗 =
𝜆𝑖
where:
• 𝜆𝑖 is the eigenvalue
• Φ𝑛𝑖𝑗 is the eigenvector
• 𝑀 𝑃 𝐹𝑖𝑗 is the modal participation factor
• 𝑅𝑆𝑓 (𝑇𝑖 ) is the response spectrum function value at period 𝑇𝑖
2𝜋
• and 𝑇𝑖 is the period √
𝜆𝑖
2. Using lists
The following example show a simple 1-bay 2-story building with rigid diaphragms. Units are Newton and meters.
It shows how to:
• call the responseSpectrumAnalysis Command to compute the modal displacements and section forces * in a first
example the responseSpectrumAnalysis Command is called for all modes. Results are obtained from a recorder
after the analysis. * in a second example the responseSpectrumAnalysis Command is called in a for-loop mode-
by-mode. Results are obtained within the for-loop usin the eleResponse command
• do a CQC modal combination
responseSpectrumAnalysisExample.py
Get outputs from OpenSees. These commands don’t change internal states of OpenSees.
1. basicDeformation command
2. basicForce command
3. basicStiffness command
4. eleDynamicalForce command
5. eleForce command
6. eleNodes command
7. eleResponse command
8. getEleTags command
9. getLoadFactor command
10. getNodeTags command
11. getTime command
12. nodeAccel command
13. nodeBounds command
14. nodeCoord command
15. nodeDisp command
16. nodeEigenvector command
17. nodeDOFs command
18. nodeMass command
19. nodePressure command
20. nodeReaction command
21. nodeResponse command
22. nodeVel command
23. nodeUnbalance command
24. numFact command
basicDeformation(eleTag)
Returns the deformation of the basic system for a beam-column element.
basicForce(eleTag)
Returns the forces of the basic system for a beam-column element.
basicStiffness(eleTag)
Returns the stiffness of the basic system for a beam-column element. A list of values in row order will be
returned.
eleDynamicalForce(eleTag, dof=-1)
Returns the elemental dynamic force.
eleForce(eleTag, dof=-1)
Returns the elemental resisting force.
eleNodes(eleTag)
Get nodes in an element
eleResponse(eleTag, *args)
This command is used to obtain the same element quantities as those obtained from the element recorder at a
particular time step.
getEleTags(’-mesh’, mtag)
Get all elements in the domain or in a mesh.
getLoadFactor(patternTag)
Returns the load factor 𝜆 for the pattern
getNodeTags(’-mesh’, mtag)
Get all nodes in the domain or in a mesh.
getTime()
Returns the current time in the domain.
nodeAccel(nodeTag, dof=-1)
Returns the current acceleration at a specified node.
nodeBounds()
Get the boundary of all nodes. Return a list of boundary values.
nodeCoord(nodeTag, dim=-1)
Returns the coordinates of a specified node.
nodeDisp(nodeTag, dof=-1)
Returns the current displacement at a specified node.
nodeDOFs(nodeTag)
Returns the DOF numbering of a node.
nodeMass(nodeTag, dof=-1)
Returns the mass at a specified node.
nodePressure(nodeTag)
Returns the fluid pressures at a specified node if this is a fluid node.
nodeReaction(nodeTag, dof=-1)
Returns the reactions at a specified node. Must call reactions() command before this command.
nodeVel(nodeTag, dof=-1)
Returns the current velocity at a specified node.
nodeUnbalance(nodeTag, dof=-1)
Returns the unbalanced force at a specified node.
numFact()
Return the number of factorizations.
numIter()
Return the number of iterations.
filename (str) name of file to which output is sent, by default, print to the screen. (optional)
'-ret' (str) return the A matrix as a list. (optional)
filename (str) name of file to which output is sent, by default, print to the screen. (optional)
'-ret' (str) return the B vector as a list. (optional)
filename name of file to which output is sent, by default, print to the screen. (optional)
(str)
'-JSON' (str) print to a JSON file. (optional)
'-node' (str) print node information. (optional)
flag (int) integer flag to be sent to the print() method, depending on the node and element type
(optional)
nodes (list a list of nodes tags to be printed, default is to print all, (optional)
(int))
eles (list (int)) a list of element tags to be printed, default is to print all, (optional)
Note: This command was called print in Tcl. Since print is a built-in function in Python, it is renamed to
printModel.
record()
This command is used to cause all the recorders to do a record on the current state of the model.
Note: A record is issued after every successfull static or transient analysis step. Sometimes the user may need the
record to be issued on more occasions than this, for example if the user is just looking to record the eigenvectors after
an eigen command or for example the user wishes to include the state of the model at time 0.0 before any analysis has
been completed.
recorder(recorderType, *recorderArgs)
This command is used to generate a recorder object which is to monitor what is happening during the analysis
and generate output for the user.
Return:
• >0 an integer tag that can be used as a handle on the recorder for the remove recorder commmand.
• -1 recorder command failed if integer -1 returned.
recorder(’Node’, ’-file’, filename, ’-xml’, filename, ’-binary’, filename, ’-tcp’, inetAddress, port, ’-
precision’, nSD=6, ’-timeSeries’, tsTag, ’-time’, ’-dT’, deltaT=0.0, ’-closeOnWrite’, ’-node’,
*nodeTags=[], ’-nodeRange’, startNode, endNode, ’-region’, regionTag, ’-dof’, *dofs=[], resp-
Type)
The Node recorder type records the response of a number of nodes at every converged step.
Note: Only one of '-file', '-xml', '-binary', '-tcp' will be used. If multiple specified last option is
used.
filenamename of file to which output is sent. file output is either in xml format ('-xml' option), textual
(str) ('-file' option) or binary ('-binary' option) which must pre-exist.
nSD number of significant digits (optional)
(int)
'-time' using this option places domain time in first entry of each data line, default is to have time
(str) ommitted, (optional)
using this option will instruct the recorder to invoke a close on the data handler after every
'-closeOnWrite'
(str) timestep. If this is a file it will close the file on every step and then re-open it for the next step.
Note, this greatly slows the execution time, but is useful if you need to monitor the data during
the analysis. (optional)
deltaT time interval for recording. will record when next step is deltaT greater than last recorder step.
(float) (optional, default: records at every time step)
tsTag the tag of a previously constructed TimeSeries, results from node at each time step are added to
(int) load factor from series (optional)
eleTags list of tags of elements whose response is being recorded (optional)
(list
(int))
startEletag for start node whose response is being recorded (optional)
(int)
endEle tag for end node whose response is being recorded (optional)
(int)
a region tag; to specify all nodes in the previously defined region. (optional)
regionTag
(int)
args arguments which are passed to the setResponse() element method, all arguments must be in string
(list) format even for double and integer numbers because internally the setResponse() element method
only accepts strings.
Note: The setResponse() element method is dependent on the element type, and is described with the element()
Command.
filenamename of file to which output is sent. file output is either in xml format ('-xml' option), textual
(str) ('-file' option) or binary ('-binary' option) which must pre-exist.
nSD number of significant digits (optional)
(int)
'-time' using this option places domain time in first entry of each data line, default is to have time
(str) ommitted, (optional)
using this option will instruct the recorder to invoke a close on the data handler after every
'-closeOnWrite'
(str) timestep. If this is a file it will close the file on every step and then re-open it for the next step.
Note, this greatly slows the execution time, but is useful if you need to monitor the data during
the analysis. (optional)
deltaT time interval for recording. will record when next step is deltaT greater than last recorder step.
(float) (optional, default: records at every time step)
tsTag the tag of a previously constructed TimeSeries, results from node at each time step are added to
(int) load factor from series (optional)
eleTags list of tags of elements whose response is being recorded (optional)
(list
(int))
startEletag for start node whose response is being recorded (optional)
(int)
endEle tag for end node whose response is being recorded (optional)
(int)
a region tag; to specify all nodes in the previously defined region. (optional)
regionTag
(int)
args arguments which are passed to the setResponse() element method
(list)
Note: The setResponse() element method is dependent on the element type, and is described with the element()
Command.
The progressive collapse algorithm is thus implemented within OpenSeesPy for an automatic removal of elements
which have “numerically” collapse during an ongoing dynamic simulation. Main elements of the progressive collapse
routine are illustrated in Figures 1 and 2. The implementation is supported in Python as a relatively new OpenSees
module. Following each converged step of the dynamic analysis, the algorithm is called to check each element respec-
tively for possible violation given a user-defined removal criteria. The routine calls for the activation of the element
removal sequence before accessing the main analysis module on the subsequent analysis step. Activation of the el-
ement removal algorithm includes updating nodal masses, checking if the removal of the collapsed element results
in leaving behind dangling nodes or floating elements, which must be removed as well and removing all associated
element and nodal forces, imposed displacements, and constraints.
Furthermore, the aforementioned infill wall element and its removal criteria are defined for force- and
displacement-based distributed plasticity fiber elements and lumped plasticity beam–column elements with fiber-
discretized plastic hinges. Current version of OpenSeesPy considers only the removal of the infill wall
model described in (https://opensees.berkeley.edu/wiki/index.php/Infill_Wall_Model_and_Element_Removal#New_
Command_in_ OpenSees_Interpreter). Implementation of the removal of the elements representing the aforemen-
tioned infill wall analytical model in the progressive collapse algorithm is performed through defining a removal
criterion for the beam-column elements of this model. This criterion is based on the interaction between the in-plane
(IP) and out-of-plane (OOP) displacements. IP displacement is the relative horizontal displacement between the top
and bottom nodes of the diagonal element. OOP displacement is that of the middle node (where the OOP mass is
attached) with respectto the chord which connects the top and bottom nodes. The user is free to choose any interaction
relationship between IP and OOP displacements. In the example highlighted above, the interaction between in-plane
and out-of-plane is taken into consideration with regards to the displacement interaction between the two mechanisms,
where the IP and OOP displacement capacities are obtained using the FEMA 356 formulation for collapse prevention
level. During the nonlinear time history simulation, when the mentioned combination of displacements from the anal-
ysis exceeds the interaction curve, the two beam-column elements and the middle node, representing the unreinforced
masonry infill wall, are removed.
For the example illustrated in the next Figure, the existing Python command and its arguments in the OpenSeesPy
interpreter with respect to the infill wall removal is described such that:
˓→nodemid, nodetop)
˓→nodemid, nodetop)
Note: it might seem that node inputs are unnecessary. However, when there are shear springs in the model, nodetop
and nodebot should be the nodes of the springs which connect to the beams, since the shear spring deformation
contributes to the IP displacement of the infill wall. These nodes are not the nodes of the diagonal element. Therefore,
it is necessary to input these nodes.
References
1. Talaat, M. and Mosalam, K.M. (2008), “Computational Modeling of Progressive Collapse in Reinforced Concrete
Frame Structures”, Pacific Earthquake Engineering Research Center, PEER 2007/10. 2. Talaat, M. and Mosalam,
K.M. (2009), “Modeling Progressive Collapse in Reinforced Concrete Buildings Using Direct Element Removal”,
Earthquake Engineering and Structural Dynamics, 38(5): 609-634. 3. Talaat, M. and Mosalam, K.M. (2009), Chap-
ter20: How to Simulate Column Collapse and Removal in As- built and Retrofitted Building Structures?, in Seismic
Risk Assessment and Retrofitting - with special emphasis on existing low-rise structures, Ilki, A, Karadogan, F, Pala,
S & Yuksel, E (Eds), ISBN 978-90-481-2680-4, Springer. 4. Talaat, M. and Mosalam, K.M. (2006), “Progressive
Collapse Modeling of Reinforced Concrete Framed Structures Containing Masonry Infill Walls”, Proceedings of the
2nd NEES/E-Defense Workshop on Collapse Simulation of Reinforced Concrete Building Structures, Kobe, Japan. 5.
Talaat, M. and Mosalam, K.M. (2007), “Towards Modeling Progressive Collapse in Reinforced Concrete Buildings”,
Proceedings of SEI-ASCE 2007 Structures Congress, Long Beach, California, USA. 6. Mosalam, K.M., Talaat, M.,
and Park, S. (2008), “Modeling Progressive Collapse in Reinforced Concrete Framed Structures”, Proceedings of the
14th World Conference on Earthquake Engineering, Beijing, China, October 12-17, Paper S15-018. 7. Mosalam,
K.M., Park, S., Günay, M.S. (2009), “Evaluation of an Element Removal Algorithm for Reinforced Concrete Struc-
tures Using Shake Table Experiments,” Proceedings of the 2nd International Conference on Computational Methods
in structural Dynamics and Earthquake Engineering (COMPDYN 2009), Island of Rhodes, Greece, June 22-24.
sectionStiffness(eleTag, secNum)
Returns the section stiffness matrix for a beam-column element. A list of values in the row order will be returned.
sectionFlexibility(eleTag, secNum)
Returns the section flexibility matrix for a beam-column element. A list of values in the row order will be
returned.
sectionLocation(eleTag, secNum)
Returns the locations of integration points of a section for a beam-column element.
sectionWeight(eleTag, secNum)
Returns the weights of integration points of a section for a beam-column element.
systemSize()
Return the size of the system.
testIter()
Returns the number of iterations the convergence test took in the last analysis step
testNorm()
Returns the norms from the convergence test for the last analysis step.
Note: The size of norms will be equal to the max number of iterations specified. The first testIter of these will
be non-zero, the remaining ones will be zero.
version()
Return the current OpenSees version.
These commands are used to monitor and change the state of the model.
1. convertBinaryToText command
2. convertTextToBinary command
3. database command
4. InitialStateAnalysis command
5. loadConst command
6. modalDamping command
7. reactions command
8. remove command
9. reset command
10. restore command
11. save command
12. sdfResponse command
13. setTime command
14. setNodeCoord command
15. setNodeDisp command
16. setNodeVel command
17. setNodeAccel command
18. setPrecision command
19. setElementRayleighDampingFactors command
20. start command
21. stop command
22. stripXML command
23. updateElementDomain command
24. updateMaterialStage
25. wipe command
26. wipeAnalysis command
27. setNumthread command
28. getNumthread command
convertBinaryToText(inputfile, outputfile)
Convert binary file to text file
convertTextToBinary(inputfile, outputfile)
Convert text file to binary file
database(type, dbName)
Create a database.
InitialStateAnalysis(flag)
Set the initial state analysis to 'on' or 'off'
loadConst(’-time’, pseudoTime)
This command is used to set the loads constant in the domain and to also set the time in the domain. When
setting the loads constant, the procedure will invoke setLoadConst() on all LoadPattern objects which exist in
the domain at the time the command is called.
Note: Load Patterns added afer this command is invoked are not set to constant.
modalDamping(factor)
Set modal damping factor. The eigen() must be called before.
reactions(’-dynamic’, ’-rayleigh’)
Calculate the reactions. Call this command before the nodeReaction().
remove(type, tag)
This commmand is used to remove components from the model.
remove(’recorders’)
Remove all recorder objects.
remove(’sp’, nodeTag, dofTag, patternTag)
Remove a sp object based on node
reset()
This command is used to set the state of the domain to its original state.
Note: It iterates over all components of the domain telling them to set their state back to the initial state. This is
not always the same as going back to the state of the model after initial model generation, e.g. if elements have been
removed.
restore(commitTag)
Restore data from database, which should be created through database().
save(commitTag)
Save current state to database, which should be created through database().
m (float) mass
zeta (float) damping ratio
k (float) stiffness
Fy (float) yielding strength
alpha (float) strain-hardening ratio
dtF (float) time step for input data
filename (str) input data file, one force per line
dt (float) time step for analysis
uresidual (float) residual displacement at the end of previous analysis (optional, default=0)
umaxprev (float) previous displacement (optional, default=0)
setTime(pseudoTime)
This command is used to set the time in the Domain.
setPrecision(precision)
Set the precision for screen output.
start()
Start the timer
stop()
Stop the timer and print timing information.
updateElementDomain()
Update elements in the domain.
1.7.24 updateMaterialStage
wipe()
This command is used to destroy all constructed objects, i.e. all components of the model, all components of
the analysis and all recorders.
This command is used to start over without having to exit and restart the interpreter. It causes all elements,
nodes, constraints, loads to be removed from the domain. In addition it deletes all recorders, analysis objects
and all material objects created by the model builder.
wipeAnalysis()
This command is used to destroy all components of the Analysis object, i.e. any objects created with system,
numberer, constraints, integrator, algorithm, and analysis commands.
setNumThreads(num)
set the number of threads to be used in the multi-threaded environment.
getNumThreads()
return the total number of threads available
1. line mesh
2. triangular mesh
3. quad mesh
4. tetrahedron mesh
5. particle mesh
6. background mesh
mesh(type, tag, *args)
Create a mesh object. See below for available mesh types.
line mesh
triangular mesh
quad mesh
tetrahedron mesh
particle mesh
mesh(’part’, tag, type, *pArgs, eleType=”, *eleArgs=[], ’-vel’, *vel0, ’-pressure’, p0)
Create or return a group of particles which will be used for background mesh.
background mesh
mesh(’bg’, basicsize, *lower, *upper, ’-tol’, tol, ’-meshtol’, meshtol, ’-wave’, wavefilename, numl, *locations,
’-numsub’, numsub, ’-structure’, id, numnodes, *snodes, ’-largeSize’, level, *llower, *lupper)
Create a background mesh.
remesh(alpha=-1.0)
• 𝛼 ≥ 0 for updating moving mesh.
• 𝛼 < 0 for updating background mesh.
If there are nodes shared by different mesh in the domain, the principles to decide what element should be used
for a triangle:
1. If all 3 nodes share the same mesh, use that mesh for the triangle.
2. If all 3 nodes share more than one mesh, use the mesh with eleArgs defined and lowest id.
3. If all 3 nodes are in different mesh, use the mesh with lowest id.
4. If the selected mesh id >= 0, skip the triangle.
5. If the selected mesh has no eleArgs, skip the triangle.
integrator(’PFEM’)
Create a PFEM Integrator.
test(’PFEM’, tolv, tolp, tolrv, tolrp, tolrelv, tolrelp, iter, maxincr, pFlag=0, nType=2)
Create a PFEM test, which check both increments and residual for velocities and pressures.
Note: Each parameter must be unique in the FE domain, and all parameter tags must be numbered sequentially
starting from 1.
Examples
1. To identify the elastic modulus, E, of the material 1 at section 3 of element 4, the <specific object arguments>
string becomes:
2. To identify the elastic modulus, E, of elastic section 3 of element 4 (for elastic section, no specific material need
to be defined), the <specific object arguments> string becomes:
3. To parameterize E for element 4 with material 1 (no section need to be defined), the <specific object arguments>
string simplifies as:
Note: Notice that the format of the <specific object arguments> is different for each considered ele-
ment/section/material. The specific set of parameters and the relative <specific object arguments> format will be
added in the future.
updateParameter(tag, newValue)
Once the parameters in FE model are defined, their value can be updated.
Note: Scott M.H., Haukaas T. (2008). “Software framework for parameter updating and finite element response
sensitivity analysis.” Journal of Computing in Civil Engineering, 22(5):281-291.
newValue (float) the updated value to which the parameter needs to be set.
eleTags (list (int)) a list of element tags
start (int) start element tag
end (int) end element tag
args (list (str)) a list of strings for the element parameter
getParamTags()
Return a list of tags for all parameters
getParamValue(tag)
Return the value of a parameter
computeGradients()
This command is used to perform a sensitivity analysis. If the user wants to call this command, then the
'-computeByCommand' should be set in the sensitivityAlgorithm command.
sensitivityAlgorithm(type)
This command is used to create a sensitivity algorithm.
sensLambda(patternTag, paramTag)
Returns the current load factor sensitivity to a parameter in a load pattern.
sensNodePressure(nodeTag, paramTag)
Returns the current pressure sensitivity to a parameter at a specified node.
randomVariable(tag, dist, ’-mean’, mean, ’-stdv’, stdv, ’-startPoint’, startPoint, ’-parameters’, *params)
Create a random variable with user specified distribution
The parallel commands are currently only working in the Linux version. The parallel OpenSeesPy is similar to
OpenSeesMP, which requires users to divide the model to distributed processors.
You can still run the single-processor version as before. To run the parallel version, you have to install a MPI imple-
mentation, such as mpich. Then call your python scripts in the command line
where np is the number of processors to be used, python is the python interpreter, and filename.py is the script
name.
Inside the script, OpenSeesPy is still imported as
Common problems:
1. Unmatch send/recv will cause deadlock.
2. Writing to the same files at the same from different processors will cause race conditions.
3. Poor model decomposition will cause load imbalance problem.
Following are commands related to parallel computing:
1. getPID command
2. getNP command
3. barrier command
4. send command
5. recv command
6. Bcast command
7. setStartNodeTag command
8. domainChange command
9. Parallel Plain Numberer
10. Parallel RCM Numberer
11. MUMPS Solver
12. Parallel DisplacementControl
13. partition command
getPID()
Get the processor ID of the calling processor.
getNP()
Get total number of processors.
barrier()
Set a barrier for all processors, i.e., faster processors will pause here to wait for all processors to reach to this
point.
Note: send command and recv command must match and the order of calling both commands matters.
recv(’-pid’, pid)
Receive information from another processor.
Note: send command and recv command must match and the order of calling both commands matters.
Bcast(*data)
Broadcast information from processor 0 to all processors.
Note: Run the same command to receive data sent from pid = 0.
For example,
if pid == 0:
data1 = []
data2 = []
ops.Bcast(*data1)
ops.Bcast(*data2)
if pid != 0:
data1 = ops.Bcast()
data2 = ops.Bcast()
setStartNodeTag(ndtag)
Set the starting node tag for the mesh command. The purpose of this command is to control the node tags
generated by the mesh command. Some nodes are shared by processors, which must have same tags. Nodes
which are unique to a processor must have uniques tags across all processors.
ndtag (int) starting node tag for the next call of mesh command
domainChange()
Mark the domain has changed manually. This is used to notify processors whose domain is not changed, but the
domain in other processors have changed.
ncuts Specifies the number of different partitionings that it will compute. The final partitioning is the
(int) one that achieves the best edge cut or communication volume. (Optional default is 1).
niters Specifies the number of iterations for the refinement algorithms at each stage of the uncoarsening
(int) process. (Optional default is 10).
ufactor Specifies the maximum allowed load imbalance among the partitions. (Optional default is 30,
(int) indicating a load imbalance of 1.03).
'-info' print information. (optional)
(str)
opsdm.DiscretizeMember()
1. mesh command
2. remesh command
3. DiscretizeMember command
The postprocessing modules are removed from the OpenSeesPy module to their own modules for better maintainance
and support. Please direct any questions and issues to following documents for postprocessing modules:
1. opsvis
2. vfo (Visualization For OpenSees)
1.14 Examples
1. Structural Examples
2. Earthquake Examples
3. Tsunami Examples
4. GeoTechnical Examples
5. Thermal Examples
6. Parallel Examples
7. Plotting Examples
8. Sensitivity Examples
8. Cantilever FRP-Confined Circular Reinforced Concrete Column under Cyclic Lateral Loading
3 import numpy as np
4 import matplotlib.pyplot as plt
5
6 # ------------------------------
7 # Start of model generation
8 # -----------------------------
9
13 # set modelbuilder
14 model('basic', '-ndm', 2, '-ndf', 2)
15
16 # create nodes
17 node(1, 0.0, 0.0)
18 node(2, 144.0, 0.0)
19 node(3, 168.0, 0.0)
20 node(4, 72.0, 96.0)
21
27 # define materials
28 uniaxialMaterial("Elastic", 1, 3000.0)
29
30 # define elements
31 element("Truss",1,1,4,10.0,1)
32 element("Truss",2,2,4,5.0,1)
33 element("Truss",3,3,4,5.0,1)
34
35 # create TimeSeries
36 timeSeries("Linear", 1)
37
44 # ------------------------------
45 # Start of analysis generation
46 # ------------------------------
47
48 # create SOE
49 system("BandSPD")
(continues on next page)
57 # create integrator
58 integrator("LoadControl", 1.0)
59
60 # create algorithm
61 algorithm("Linear")
62
69 ux = nodeDisp(4,1)
70 uy = nodeDisp(4,2)
71 if abs(ux-0.53009277713228375450)<1e-12 and abs(uy+0.17789363846931768864)<1e-12:
72 print("Passed!")
73 else:
74 print("Failed!")
3 import numpy as np
4 import matplotlib.pyplot as plt
5
6 # ------------------------------
7 # Start of model generation
8 # -----------------------------
9
10 # set modelbuilder
11 wipe()
12 model('basic', '-ndm', 2, '-ndf', 2)
13
14 # variables
15 A = 4.0
16 E = 29000.0
17 alpha = 0.05
18 sY = 36.0
19 udisp = 2.5
20 Nsteps = 1000
21 Px = 160.0
22 Py = 0.0
23
24 # create nodes
25 node(1, 0.0, 0.0)
(continues on next page)
35 # define materials
36 uniaxialMaterial("Hardening", 1, E, sY, 0.0, alpha/(1-alpha)*E)
37
38 # define elements
39 element("Truss",1,1,4,A,1)
40 element("Truss",2,2,4,A,1)
41 element("Truss",3,3,4,A,1)
42
43 # create TimeSeries
44 timeSeries("Linear", 1)
45
52 # ------------------------------
53 # Start of analysis generation
54 # ------------------------------
55
56 # create SOE
57 system("ProfileSPD")
58
65 # create integrator
66 integrator("LoadControl", 1.0/Nsteps)
67
68 # create algorithm
69 algorithm("Newton")
70
71 # create test
72 test('NormUnbalance',1e-8, 10)
73
77 # ------------------------------
78 # Finally perform the analysis
79 # ------------------------------
80
88 plt.plot(data[:,0], data[:,1])
89 plt.xlabel('Horizontal Displacement')
90 plt.ylabel('Horizontal Load')
91 plt.show()
92
Period Comparisons:
Period OpenSees SAP2000 SeismoStruct
1 1.27321 1.2732 1.2732
2 0.43128 0.4313 0.4313
3 0.24204 0.2420 0.2420
4 0.16018 0.1602 0.1602
5 0.11899 0.1190 0.1190
6 0.09506 0.0951 0.0951
7 0.07951 0.0795 0.0795
8 # REFERENCES:
9 # used in verification by SAP2000:
10 # SAP2000 Integrated Finite Element Analysis and Design of Structures, Verification
˓→Manual,
15
19 model('Basic', '-ndm', 2)
(continues on next page)
21 # properties
22
23 # units kip, ft
24
25 numBay = 2
26 numFloor = 7
27
28 bayWidth = 360.0
29 storyHeights = [162.0, 162.0, 156.0, 156.0, 156.0, 156.0, 156.0]
30
31 E = 29500.0
32 massX = 0.49
33 M = 0.
34 coordTransf = "Linear" # Linear, PDelta, Corotational
35 massType = "-lMass" # -lMass, -cMass
36
42 WSection = {
43 'W14X176': [51.7, 2150.],
44 'W14X211': [62.1, 2670.],
45 'W14X246': [72.3, 3230.],
46 'W14X287': [84.4, 3910.],
47 'W24X110': [32.5, 3330.],
48 'W24X130': [38.3, 4020.],
49 'W24X160': [47.1, 5120.]
50 }
51
52 nodeTag = 1
53
54
55 # procedure to read
56 def ElasticBeamColumn(eleTag, iNode, jNode, sectType, E, transfTag, M, massType):
57 found = 0
58
59 prop = WSection[sectType]
60
61 A = prop[0]
62 I = prop[1]
63 element('elasticBeamColumn', eleTag, iNode, jNode, A, E, I, transfTag, '-mass', M,
˓→ massType)
64
65
71 xLoc = 0.
72 for i in range(0, numBay + 1):
73 node(nodeTag, xLoc, yLoc)
(continues on next page)
77 if j < numFloor:
78 storyHeight = storyHeights[j]
79
80 yLoc += storyHeight
81
93 if nodeTag != nodeTagR:
94 equalDOF(nodeTagR, nodeTag, 1)
95 else:
96 mass(nodeTagR, massX, 1.0e-10, 1.0e-10)
97
98 nodeTag += 1
99
108 end1 = j + 1
109 end2 = end1 + numBay + 1
110 thisColumn = columns[j]
111
135 #
136 # apply loads for static analysis & perform analysis
137 #
138
139 timeSeries('Linear', 1)
140 pattern('Plain', 1, 1)
141 load(22, 20.0, 0., 0.)
142 load(19, 15.0, 0., 0.)
143 load(16, 12.5, 0., 0.)
144 load(13, 10.0, 0., 0.)
145 load(10, 7.5, 0., 0.)
146 load(7, 5.0, 0., 0.)
147 load(4, 2.5, 0., 0.)
148
157 #
158 # print pretty output of comparisons
159 #
160
166
194 print('{:>30}{:>15.3f}{:>15.2f}{:>15.2f}'.format(comparisonResults[0][i],
195 result,
196 comparisonResults[1][i],
197 comparisonResults[2][i]))
198 resultOther = comparisonResults[1][i]
199 tol = tolerances[i]
200 if abs(result - resultOther) > tol:
201 ok - 1
202 print("failed-> ", i, abs(result - resultOther), tol)
203
204 if ok == 0:
205 print("PASSED Verification Test PortalFrame2d.py \n\n")
206 else:
207 print("FAILED Verification Test PortalFrame2d.py \n\n")
208
13 # Define element
14 # tag ndI ndJ secTag
15 element('zeroLengthSection', 1, 1, 2, secTag)
16
48
49 wipe()
50 print("Start MomentCurvature.py example")
51
65 # STEEL
66 # Reinforcing steel
67 fy = 60.0 # Yield stress
68 E = 30000.0 # Young's modulus
69
70 # tag fy E0 b
71 uniaxialMaterial('Steel01', 3, fy, E, 0.01)
72
80 cover = 1.5
81 As = 0.60; # area of no. 7 bars
82
87
88 section('Fiber', 1)
89
129 u = nodeDisp(2,3)
130 if abs(u-0.00190476190476190541)<1e-12:
131 results.write('PASSED : MomentCurvature.py\n');
132 print("Passed!")
133 else:
(continues on next page)
137 results.close()
138
139 print("==========================")
1 print("==========================")
2
10 # Create nodes
11 # ------------
12
17 # Create nodes
18 # tag, X, Y
19 node(1, 0.0, 0.0)
20 node(2, width, 0.0)
21 node(3, 0.0, height)
22 node(4, width, height)
23
38 # STEEL
39 # Reinforcing steel
40 fy = 60.0; # Yield stress
41 E = 30000.0; # Young's modulus
42 # tag fy E0 b
(continues on next page)
48 # some parameters
49 colWidth = 15
50 colDepth = 24
51
52 cover = 1.5
53 As = 0.60 # area of no. 7 bars
54
59 section('Fiber', 1)
60
81 geomTransf('PDelta', 1)
82
86 # Lobatto integratoin
87 beamIntegration('Lobatto', 1, 1, np)
88
121 # ------------------------------
122 # End of model generation
123 # ------------------------------
124
125
126 # ------------------------------
127 # Start of analysis generation
128 # ------------------------------
129
130 # Create the system of equation, a sparse solver with partial pivoting
131 system('BandGeneral')
132
139 # Create the convergence test, the norm of the residual with a tolerance of
140 # 1e-12 and a max number of iterations of 10
141 test('NormDispIncr', 1.0e-12, 10, 3)
142
146 # Create the integration scheme, the LoadControl scheme using steps of 0.1
147 integrator('LoadControl', 0.1)
148
152 # ------------------------------
153 # End of analysis generation
154 # ------------------------------
155
156
(continues on next page)
161 # perform the gravity load analysis, requires 10 steps to reach the load level
162 analyze(10)
163
170 u3 = nodeDisp(3, 2)
171 u4 = nodeDisp(4, 2)
172
175 if abs(u3 + 0.0183736) < 1e-6 and abs(u4 + 0.0183736) < 1e-6:
176 results.write('PASSED : RCFrameGravity.py\n')
177 print("Passed!")
178 else:
179 results.write('FAILED : RCFrameGravity.py\n')
180 print("Failed!")
181
182 results.close()
183
184 print("==========================")
10 wipe()
11 # ----------------------------------------------------
12 # Start of Model Generation & Initial Gravity Analysis
13 # ----------------------------------------------------
14
19 # Set the gravity loads to be constant & reset the time in the domain
(continues on next page)
22 # ----------------------------------------------------
23 # End of Model Generation & Initial Gravity Analysis
24 # ----------------------------------------------------
25
26
27 # ----------------------------------------------------
28 # Start of additional modelling for lateral loads
29 # ----------------------------------------------------
30
45 # ----------------------------------------------------
46 # End of additional modelling for lateral loads
47 # ----------------------------------------------------
48
49
50 # ----------------------------------------------------
51 # Start of modifications to analysis for push over
52 # ----------------------------------------------------
53
61 # ----------------------------------------------------
62 # End of modifications to analysis for push over
63 # ----------------------------------------------------
64
65
66 # ------------------------------
67 # Start of recorder generation
68 # ------------------------------
69
79 # --------------------------------
80 # End of recorder generation
81 # ---------------------------------
82
83
84 # ------------------------------
85 # Finally perform the analysis
86 # ------------------------------
87
98 ok = analyze(1)
99
118 if ok == 0:
119 results.write('PASSED : RCFramePushover.py\n')
120 print("Passed!")
121 else:
122 results.write('FAILED : RCFramePushover.py\n')
123 print("Failed!")
124
125 results.close()
126
130
131 print("==========================")
Three story steel building with rigid beam-column connections and W-section
2 ##################################################################
3 ## 2D steel frame example.
4 ## 3 story steel building with rigid beam-column connections.
5 ## This script uses W-section command inOpensees to create steel..
6 ## .. beam-column fiber sections.
7 ##
8 ## By - Anurag Upadhyay, PhD Student, University of Utah.
9 ## Date - 08/06/2018
10 ##################################################################
11
12 print("=========================================================")
13 print("Start 2D Steel Frame Example")
14
17 import numpy as np
18 import matplotlib.pyplot as plt
(continues on next page)
23 ## ------------------------------
24 ## Start of model generation
25 ## -----------------------------
26 # remove existing model
27 wipe()
28
29 # set modelbuilder
30 model('basic', '-ndm', 2, '-ndf', 3)
31
32 import math
33
34 ############################################
35 ### Units and Constants ###################
36 ############################################
37
38 inch = 1;
39 kip = 1;
40 sec = 1;
41
42 # Dependent units
43 sq_in = inch*inch;
44 ksi = kip/sq_in;
45 ft = 12*inch;
46
47 # Constants
48 g = 386.2*inch/(sec*sec);
49 pi = math.acos(-1);
50
51 #######################################
52 ##### Dimensions
53 #######################################
54
55 # Dimensions Input
56 H_story=10.0*ft;
57 W_bayX=16.0*ft;
58 W_bayY_ab=5.0*ft+10.0*inch;
59 W_bayY_bc=8.0*ft+4.0*inch;
60 W_bayY_cd=5.0*ft+10.0*inch;
61
62 # Calculated dimensions
63 W_structure=W_bayY_ab+W_bayY_bc+W_bayY_cd;
64
65 ################
66 ### Material
67 ################
68
69 # Steel02 Material
70
71 matTag=1;
72 matConnAx=2;
73 matConnRot=3;
74
91 uniaxialMaterial('Steel02', matTag, Fy, Es, b, R0, cR1, cR2, a1, a2, a3, a4, sigInit)
92
93 # ##################
94 # ## Sections
95 # ##################
96
97 colSecTag1=1;
98 colSecTag2=2;
99 beamSecTag1=3;
100 beamSecTag2=4;
101 beamSecTag3=5;
102
103 # COMMAND: section('WFSection2d', secTag, matTag, d, tw, bf, tf, Nfw, Nff)
104
122 # ###########################
123 # ##### Nodes
124 # ###########################
125
160 # ###############
161 # Constraints
162 # ###############
163
164 fix(1, 1, 1, 1)
165 fix(2, 1, 1, 1)
166 fix(3, 1, 1, 1)
167
168 # #######################
169 # ### Elements
170 # #######################
171
174 ColIntTag1=1;
175 ColIntTag2=2;
176 BeamIntTag1=3;
177 BeamIntTag2=4;
178 BeamIntTag3=5;
179
188 ColTransfTag=1
189 BeamTranfTag=2
190
194
210 #
211
214
224 # Assign constraints between beam end nodes and column nodes (RIgid beam column
˓→connections)
241 ################
242 ## Gravity Load
243 ################
244 # create TimeSeries
245 timeSeries("Linear", 1)
246
263
264 # ------------------------------
265 # Start of analysis generation
266 # ------------------------------
267
268 NstepsGrav = 10
269
270 system("BandGEN")
271 numberer("Plain")
272 constraints("Plain")
273 integrator("LoadControl", 1.0/NstepsGrav)
274 algorithm("Newton")
275 test('NormUnbalance',1e-8, 10)
276 analysis("Static")
277
278
290 wipeAnalysis()
291
292 ###############################
293 ### PUSHOVER ANALYSIS
294 ###############################
295
296 if(AnalysisType=="Pushover"):
(continues on next page)
308 ControlNode=31
309 ControlDOF=1
310 MaxDisp=0.15*H_story
311 DispIncr=0.1
312 NstepsPush=int(MaxDisp/DispIncr)
313
314 system("ProfileSPD")
315 numberer("Plain")
316 constraints("Plain")
317 integrator("DisplacementControl", ControlNode, ControlDOF, DispIncr)
318 algorithm("Newton")
319 test('NormUnbalance',1e-8, 10)
320 analysis("Static")
321
328
329 # analyze(NstepsPush)
330
338
348
351
352
353
Cantilever FRP-Confined Circular Reinforced Concrete Column under Cyclic Lateral Loading
1. The source code is developed by Michael Haas & Konstantinos G. Megalooikonomou, German Research Centre
for Geosciences (GFZ)
2. The source code is shown below, which can be downloaded here.
3. Run the source code in your favorite Python program and should see following plot.
=========================================================
Start cantilever 2D EQ ground motion with gravity example
u2 = -0.07441860465116278
Passed!
=========================================
1 print("=========================================================")
2 print("Start cantilever 2D EQ ground motion with gravity example")
3
7 # ------------------------------------------------------------------------------------
˓→--------------
8 # Example 1. cantilever 2D
9 # EQ ground motion with gravity
10 # all units are in kip, inch, second
11 # elasticBeamColumn ELEMENT
12 # Silvia Mazzoni & Frank McKenna, 2006
13 #
14 # ^Y
15 # |
16 # 2 __
17 # | |
18 # | |
19 # | |
20 # (1) 36'
21 # | |
22 # | |
23 # | |
24 # =1= ---- -------->X
25 #
26
27 # SET UP ----------------------------------------------------------------------------
28 wipe() # clear opensees model
29 model('basic', '-ndm', 2, '-ndf', 3) # 2 dimensions, 3 dof per node
30 # file mkdir data # create data directory
31
40 # nodal masses:
41 mass(2, 5.18, 0., 0.) # node#, Mx My Mz, Mass=Weight/g.
42
47 # connectivity:
48 element('elasticBeamColumn', 1, 1, 2, 3600.0, 3225.0,1080000.0, 1)
49
54
63
69
79 system('BandGeneral') # how to store and solve the system of equations in the analysis
80 algorithm('Linear') # use Linear algorithm for linear analysis
81 integrator('Newmark', 0.5, 0.25) # determine the next time step for an analysis
82 analysis('Transient') # define type of analysis: time-dependent
83 analyze(3995, 0.01) # apply 3995 0.01-sec time steps in analysis
84
85 u2 = nodeDisp(2, 2)
86 print("u2 = ", u2)
87
88
94 wipe()
95
96 print("=========================================")
1 print("==========================")
2 print("Start RCFrameEarthquake Example")
3
10 import ReadRecord
11 import numpy as np
12 import matplotlib.pyplot as plt
(continues on next page)
14 wipe()
15 # ----------------------------------------------------
16 # Start of Model Generation & Initial Gravity Analysis
17 # ----------------------------------------------------
18
23 # Set the gravity loads to be constant & reset the time in the domain
24 loadConst('-time', 0.0)
25
26 # ----------------------------------------------------
27 # End of Model Generation & Initial Gravity Analysis
28 # ----------------------------------------------------
29
34 mass(3, m, m, 0.0)
35 mass(4, m, m, 0.0)
36
62 # Create the convergence test, the norm of the residual with a tolerance of
63 # 1e-12 and a max number of iterations of 10
64 test('NormDispIncr', 1.0e-12, 10 )
65
72 # Create the integration scheme, the Newmark with alpha =0.5 and beta =.25
73 integrator('Newmark', 0.5, 0.25 )
74
88 time = [tCurrent]
89 u3 = [0.0]
90
94 ok = analyze(1, .01)
95
109 time.append(tCurrent)
110 u3.append(nodeDisp(3,1))
111
112
113
120 if ok == 0:
121 results.write('PASSED : RCFrameEarthquake.py\n');
122 print("Passed!")
123 else:
124 results.write('FAILED : RCFrameEarthquake.py\n');
125 print("Failed!")
126
(continues on next page)
133 plt.show()
134
135
136
137 print("==========================")
1 import eqsig
2 from eqsig import duhamels
3 import matplotlib.pyplot as plt
4 import numpy as np
5
6 import openseespy.opensees as op
7 import opensees_constants as opc #opensees_constants.py should be close to main file
˓→or use sys.path... to its directory
8
24 op.wipe()
25 op.model('basic', '-ndm', 2, '-ndf', 3) # 2 dimensions, 3 dof per node
26
27 # Establish nodes
28 bot_node = 1
29 top_node = 2
30 op.node(bot_node, 0., 0.)
31 op.node(top_node, 0., 0.)
32
42 # Define material
43 bilinear_mat_tag = 1
44 mat_type = "Steel01"
45 mat_props = [f_yield, k_spring, r_post]
46 op.uniaxialMaterial(mat_type, bilinear_mat_tag, *mat_props)
47
51
59
71 op.wipeAnalysis()
72
73 op.algorithm('Newton')
74 op.system('SparseGeneral')
75 op.numberer('RCM')
76 op.constraints('Transformation')
77 op.integrator('Newmark', 0.5, 0.25)
78 op.analysis('Transient')
79
80 tol = 1.0e-10
81 iterations = 10
82 op.test('EnergyIncr', tol, iterations, 0, 2)
83 analysis_time = (len(values) - 1) * dt
84 analysis_dt = 0.001
85 outputs = {
86 "time": [],
87 "rel_disp": [],
88 "rel_accel": [],
89 "rel_vel": [],
90 "force": []
91 }
92
102 op.wipe()
103 for item in outputs:
104 outputs[item] = np.array(outputs[item])
105
108
113 :return:
114 """
115
128
144 sps[0].legend()
145 sps[1].legend()
146 plt.show()
147
148
1. The source code is developed by Jawad Fayaz from University of California- Irvine.
2. The source code is shown below, which can be downloaded here.
3. Also download the code to read the provided GM file here.
4. The example bi-directional ground motion time histories are given GM11, GM21, GM12, GM22.
5. Run the source code in any Python IDE (e.g Spyder, Jupyter Notebook) and should see
"""
author : JAWAD FAYAZ (email: [email protected]) (website: https://jfayaz.github.io)
The two directions of the ground motion record must be named as 'GM1i' and 'GM2i',
where 'i' is the ground motion number which goes from 1 to 'n', 'n' being the total
number of ground motions for which the Spectra needs to be generated. The extension
of the files must be '.AT2'
For example: If the Spectra of two ground motion records are required, 4 files with
the following names must be provided in the given 'GM' folder:
'GM11.AT2' - Ground Motion 1 in direction 1 (direction 1 can be either one of the
˓→bi-directional GM as we are rotating the ground motions it does not matter)
The Ground Motion file must be a vector file with 4 header lines.The first 3 lines
˓→can have
any content, however, the 4th header line must be written exactly as per the
˓→following example:
You may run this code in python IDE: 'Spyder' or any other similar IDE
INPUT:
This codes provides the option to have 3 different regions of developing the Spectra
˓→of ground motions with different period intervals (discretizations)
˓→readthedocs.io/en/latest/windows.html)
'Int_T_Reg_1' --> Period Interval for the first region of the Spectrum
'End_T_Reg_1' --> Last Period of the first region of the Spectrum (where
˓→to end the first region)
'Int_T_Reg_2' --> Period Interval for the second region of the Spectrum
'End_T_Reg_2' --> Last Period of the second region of the Spectrum (where
˓→to end the second region)
'Int_T_Reg_3' --> Period Interval for the third region of the Spectrum
(continues on next page)
OUTPUT:
The output will be provided in a saperate 'GMi_Spectra.txt' file for each ground
˓→motion record, where 'i' denotes the number of ground motion in the same of
provided 'GM1i.AT2' and 'GM2i.AT2' files. The output files will be generated in a
˓→saperate folder 'Spectra' which will be created in the current folder
%%%%%
˓→===================================================================================================
˓→%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
˓→%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
˓→%%%%%%%%%%%%
"""
# Path where the library files 'opensees.pyd' and 'LICENSE.rst' are included (for
˓→further details go to https://openseespydoc.readthedocs.io/en/latest/windows.html)
Path_to_openpyfiles = 'C:\Tcl'
Int_T_Reg_2 = 0.2
End_T_Reg_2 = 2
Int_T_Reg_3 = 0.5
End_T_Reg_3 = 5
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
(continues on next page)
# Initializations
DISPLACEMENTS = pd.DataFrame(columns=['uX','uY'])
GM_SPECTRA = pd.DataFrame(columns=['Period(s)','RotD50Sa(g)', 'RotD100Sa(g)'])
SDOF_RESPONSE = [[]]
GM_RESPONSE = [[]]
# Spectra Generation
for iEQ in range(1,No_of_GMs+1):
print('Generating Spectra for GM: {} ...\n'.format(np.round(iEQ,0)))
Periods = np.concatenate((list(np.arange(Int_T_Reg_1,End_T_Reg_1+Int_T_Reg_1,Int_
˓→T_Reg_1)),list(np.arange(End_T_Reg_1+Int_T_Reg_2,End_T_Reg_2+Int_T_Reg_2,Int_T_Reg_
˓→2)),list(np.arange(End_T_Reg_2+Int_T_Reg_3,End_T_Reg_3+Int_T_Reg_3,Int_T_Reg_3))),
˓→axis=0)
ii = 0
for T in Periods:
ii = ii+1
GMinter = 0
# Storing Periods
GM_SPECTRA.loc[ii-1,'Period(s)'] = T
# Setting modelbuilder
model('basic', '-ndm', 3, '-ndf', 6)
# Creating nodes
node(1, 0.0, 0.0, 0.0)
node(2, 0.0, 0.0, L)
# Transformation
transfTag = 1
(continues on next page)
# Defining materials
uniaxialMaterial("Elastic", 11, E)
# Defining elements
element("elasticBeamColumn",12,1,2,A,E,G,J,I2,I3,1)
# Defining mass
mass(2,M,M,0.0,0.0,0.0,0.0)
## Reading GM Files
exec(open("ReadGMFile.py").read()) # read in procedure
˓→Multinition
# Storing GM Histories
gmX = gmXY[1]
gmY = gmXY[2]
gmXY_mat = np.column_stack((gmX,gmX,gmY,gmY))
IDTag = 2
loop = [1,2,3,4]
for i in loop:
# Setting time series to be passed to uniform excitation
timeSeries('Path',IDTag +i, '-dt', dt, '-values', *list(gmXY_mat[:,i-1]),
˓→'-factor', GMfact[i-1]*g)
# Defining Damping
# Applying Rayleigh Damping from $xDamp
(continues on next page)
xDamp = 0.05;
˓→ # 5% damping ratio
alphaM = 0.;
˓→ # M-prop. damping;
˓→D = alphaM*M
betaKcurr = 0.;
˓→ # K-proportional damping;
˓→+beatKcurr*KCurrent
betaKcomm = 2.*xDamp/omega; # K-
˓→prop. damping parameter; +betaKcomm*KlastCommitt
betaKinit = 0.;
˓→ # initial-stiffness proportional
˓→damping +beatKinit*Kini
rayleigh(alphaM,betaKcurr,betaKinit,betaKcomm); # RAYLEIGH damping
# Initializations of response
u1 = [0.0]
u2 = [0.0]
tCurrent = getTime()
time.append(tCurrent)
u1.append(nodeDisp(2,1))
u2.append(nodeDisp(2,2))
# Storing responses
DISPLACEMENTS.loc[ii-1,'uX'] = np.array(u1)
DISPLACEMENTS.loc[ii-1,'uY'] = np.array(u2)
DISP_X_Y = np.column_stack((np.array(u1),np.array(u2)))
# Storing Spectra
Rot_Acc = np.dot(Rot_Disp,(omega**2)/g)
GM_SPECTRA.loc[ii-1,'RotD50Sa(g)'] = np.median(Rot_Acc)
GM_SPECTRA.loc[ii-1,'RotD100Sa(g)']= np.max(Rot_Acc)
wipe()
# Plotting Spectra
if Plot_Spectra == 'Yes':
def plot_spectra(PlotTitle,SpectraType,iGM):
axes = fig.add_subplot(1, 1, 1)
axes.plot(GM_SPECTRA['Period(s)'] , GM_SPECTRA[SpectraType] , '.-',lw=7,
˓→markersize=20, label='GM'+str(iGM))
axes.set_xlabel('Period (sec)',fontsize=30,fontweight='bold')
axes.set_ylabel(SpectraType,fontsize=30,fontweight='bold')
axes.set_title(PlotTitle,fontsize=40,fontweight='bold')
axes.tick_params(labelsize= 25)
axes.grid(True)
axes.set_xlim(0, np.ceil(max(GM_SPECTRA['Period(s)'])))
axes.set_ylim(0, np.ceil(max(GM_SPECTRA[SpectraType])))
axes.axhline(linewidth=10,color='black')
axes.axvline(linewidth=10,color='black')
axes.hold(True)
axes.legend(fontsize =30)
fig = plt.figure(1,figsize=(18,12))
(continues on next page)
fig = plt.figure(2,figsize=(18,12))
plot_spectra('RotD100 Spectra','RotD100Sa(g)',iEQ)
SDOF_RESPONSE.insert(iEQ-1,DISPLACEMENTS)
GM_RESPONSE.insert(iEQ-1,GM_SPECTRA)
1. This is a simple model of an elastic portal frame with EQ ground motion and gravity loading. Here the structure
is excited using uniform excitation load pattern
2. All units are in kip, inch, second
3. To run EQ ground-motion analysis, BM68elc.acc needs to be downloaded into the same directory)
4. The source code is shown below, which can be downloaded here.
5. The detailed problem description can be found here (example: 1b)
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10 # Example 1b. portal frame in 2D
11 #This is a simple model of an elastic portal frame with EQ ground motion and gravity
˓→loading. Here the structure is excited using uniform excitation load pattern
16 # elasticBeamColumn ELEMENT
17 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
18
19 #
20 # ^Y
21 # |
22 # 3_________(3)________4 __
23 # | | |
24 # | | |
25 # | | |
(continues on next page)
34 # SET UP -----------------------------------------------------------------------------
35
36 import openseespy.opensees as op
37 #import the os module
38 import os
39 op.wipe()
40
41 ######################################################################################
˓→###################################################################################
42
43 ######################################################################################
˓→###################################################################################
49 #this will create the directory with name 'Data' and will update it when we rerun the
˓→analysis, otherwise we have to keep deleting the old 'Data' Folder
50 dir = "Data-1b"
51 if not os.path.exists(dir):
52 os.makedirs(dir)
53
61 h = 432.0
62 w = 504.0
63
69 op.fix(1, 1,1,1)
70 op.fix(2, 1,1,1)
71 op.fix(3, 0,0,0)
72 op.fix(4, 0,0,0)
73
77 op.geomTransf('Linear', 1)
78 A = 3600000000.0
79 E = 4227.0
(continues on next page)
82 A1 = 5760000000.0
83 Iz1 = 4423680.0
84 op.element('elasticBeamColumn', 1, 1, 3, A, E, Iz, 1)
85 op.element('elasticBeamColumn', 2, 2, 4, A, E, Iz, 1)
86 op.element('elasticBeamColumn', 3, 3, 4, A1, E, Iz1, 1)
87
100 op.constraints('Plain')
101 op.numberer('Plain')
102 op.system('BandGeneral')
103 op.test('NormDispIncr', 1e-8, 6)
104 op.algorithm('Newton')
105 op.integrator('LoadControl', 0.1)
106 op.analysis('Static')
107 op.analyze(10)
108
122 op.wipeAnalysis()
123 op.constraints('Plain')
124 op.numberer('Plain')
125 op.system('BandGeneral')
126 op.test('NormDispIncr', 1e-8, 10)
127 op.algorithm('Newton')
128 op.integrator('Newmark', 0.5, 0.25)
129 op.analysis('Transient')
130 op.analyze(1000, 0.02)
131
(continues on next page)
135 op.wipe()
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10
14 #the OpenSees input and also to run various tests and algorithms at once to increase
˓→the chances of convergence
19 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
20
21 #
22 # ^Y
23 # |
24 # 2 __
25 # | |
26 # | |
(continues on next page)
35 # SET UP ----------------------------------------------------------------------------
36 import openseespy.opensees as op
37 #import the os module
38 import os
39 import math
40 op.wipe()
41
42 ######################################################################################
˓→###################################################################################
43
44 ######################################################################################
˓→###################################################################################
49
50 #this will create the directory with name 'Data' and will update it when we rerun the
˓→analysis, otherwise we have to keep deleting the old 'Data' Folder
51 dir = "Data-2a"
52 if not os.path.exists(dir):
53 os.makedirs(dir)
54
79 op.fix(1, 1, 1, 1)
80
(continues on next page)
83 ColTransfTag = 1
84 op.geomTransf('Linear', ColTransfTag)
85 #A = 3600000000.0
86 #E = 4227.0
87 #Iz = 1080000.0
88
91
111 op.system('BandGeneral') # how to store and solve the system of equations in the
˓→analysis
118 op.loadConst('-time', 0.0) #maintain constant gravity loads and reset time to zero
119
125
126
143 maxNumIter = 10
144 op.timeSeries('Path', 2, '-dt', dt, '-filePath', GMfile, '-factor', GMfact)
145 op.pattern('UniformExcitation', IDloadTag, GMdirection, '-accel', 2)
146
147 op.wipeAnalysis()
148 op.constraints('Transformation')
149 op.numberer('Plain')
150 op.system('BandGeneral')
151 op.test('EnergyIncr', Tol, maxNumIter)
152 op.algorithm('ModifiedNewton')
153
167 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
168
171
175 if ok != 0:
176 if j < 4:
177 op.algorithm(algorithm[j], '-initial')
178
179 else:
180 op.algorithm(algorithm[j])
181
(continues on next page)
190 u2 = op.nodeDisp(2, 1)
191 print("u2 = ", u2)
192
193 op.wipe()
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10 # Example 2b. 2D cantilever column, dynamic eq ground motion
11 # EQ ground motion with gravity- uniform excitation of structure
12 #he nonlinear beam-column element that replaces the elastic element of Example 2a
˓→requires the definition of the element cross section, or its behavior. In this
˓→example,
13 #the Uniaxial Section used to define the nonlinear moment-curvature behavior of the
˓→element section is "aggregated" to an elastic response for the axial behavior to
˓→define
(continues on next page)
15 #Note:In this example, both the axial behavior (typically elastic) and the flexural
˓→behavior (moment curvature) are defined indepenently and are then "aggregated" into
˓→a section.
18 #To run EQ ground-motion analysis (BM68elc.acc needs to be downloaded into the same
˓→directory)
20 # ------------------------------------------------------------------------------------
˓→--------------
21 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
22 #
23 # ^Y
24 # |
25 # 2 __
26 # | |
27 # | |
28 # | |
29 # (1) LCol
30 # | |
31 # | |
32 # | |
33 # =1= _|_ -------->X
34 #
35
36 # SET UP ----------------------------------------------------------------------------
37 import openseespy.opensees as op
38 #import the os module
39 import os
40 import math
41 op.wipe()
42 ######################################################################################
˓→###################################################################################
43
47 #this will create the directory with name 'Data' and will update it when we rerun the
˓→analysis, otherwise we have to keep deleting the old 'Data' Folder
57
58 ######################################################################################
˓→###################################################################################
77 op.fix(1, 1, 1, 1)
78
89
90 #Column Section
91 EICol = Ec*IzCol # EI, for moment-curvature relationship
92 EACol = Ec*ACol # EA, for axial-force-strain relationship
93 MyCol = 130000.0 #yield Moment calculated
94 PhiYCol = 0.65e-4 # yield curvature
95 EIColCrack = MyCol/PhiYCol # cracked section inertia
96 b = 0.01 # strain-hardening ratio (ratio between post-yield tangent and initial
˓→elastic tangent)
97
101
102 ColTransfTag = 1
103 op.geomTransf('Linear', ColTransfTag)
104 numIntgrPts = 5
105 eleTag = 1
106 op.element('nonlinearBeamColumn', eleTag, 1, 2, numIntgrPts, ColSecTag, ColTransfTag)
107
115
126 op.system('BandGeneral') # how to store and solve the system of equations in the
˓→analysis
133 op.loadConst('-time', 0.0) #maintain constant gravity loads and reset time to zero
134
140
141
158 maxNumIter = 10
159 op.timeSeries('Path', 2, '-dt', dt, '-filePath', GMfile, '-factor', GMfact)
(continues on next page)
162 op.wipeAnalysis()
163 op.constraints('Transformation')
164 op.numberer('Plain')
165 op.system('BandGeneral')
166 op.test('EnergyIncr', Tol, maxNumIter)
167 op.algorithm('ModifiedNewton')
168
183 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
184
187
191 if ok != 0:
192 if j < 4:
193 op.algorithm(algorithm[j], '-initial')
194
195 else:
196 op.algorithm(algorithm[j])
197
206 u2 = op.nodeDisp(2, 1)
207 print("u2 = ", u2)
208
209 op.wipe()
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10 # Example 2c. 2D cantilever column, dynamic eq ground motion
11 # EQ ground motion with gravity- uniform excitation of structure
12 #In this example, the Uniaxial Section of Example 2b is replaced by a fiber section.
˓→Inelastic uniaxial materials are used in this example,
16
17 #To run EQ ground-motion analysis (BM68elc.acc needs to be downloaded into the same
˓→directory)
19 # ------------------------------------------------------------------------------------
˓→--------------
20 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
21
22 #
23 # ^Y
24 # |
25 # 2 __
26 # | |
27 # | |
28 # | |
29 # (1) LCol
30 # | |
(continues on next page)
36 # SET UP ----------------------------------------------------------------------------
37 import openseespy.opensees as op
38 #import the os module
39 import os
40 import math
41 op.wipe()
42 ######################################################################################
˓→###################################################################################
46 #this will create the directory with name 'Data' and will update it when we rerun the
˓→analysis, otherwise we have to keep deleting the old 'Data' Folder
56
57 ######################################################################################
˓→###################################################################################
76 op.fix(1, 1, 1, 1)
77
85 # MATERIAL parameters
86 IDconcU = 1 # material ID tag -- unconfined cover concrete
˓→(here used for complete section)
92
93 # unconfined concrete
94 fc1U = fc # UNCONFINED concrete (todeschini parabolic model),
˓→maximum stress
99
110
131 coverY = HCol/2.0 # The distance from the section z-axis to the edge of the
˓→cover concrete -- outer edge of cover concrete
132 coverZ = BCol/2.0 # The distance from the section y-axis to the edge of the
˓→cover concrete -- outer edge of cover concrete
158
169 op.system('BandGeneral') # how to store and solve the system of equations in the
˓→analysis
176 op.loadConst('-time', 0.0) #maintain constant gravity loads and reset time to zero
177
183
184
201 maxNumIter = 10
202 op.timeSeries('Path', 2, '-dt', dt, '-filePath', GMfile, '-factor', GMfact)
203 op.pattern('UniformExcitation', IDloadTag, GMdirection, '-accel', 2)
204
205 op.wipeAnalysis()
206 op.constraints('Transformation')
207 op.numberer('Plain')
208 op.system('BandGeneral')
209 op.test('EnergyIncr', Tol, maxNumIter)
210 op.algorithm('ModifiedNewton')
211
226 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
227
(continues on next page)
230
234 if ok != 0:
235 if j < 4:
236 op.algorithm(algorithm[j], '-initial')
237
238 else:
239 op.algorithm(algorithm[j])
240
249 u2 = op.nodeDisp(2, 1)
250 print("u2 = ", u2)
251
252 op.wipe()
1. To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, Uniform Earthquake Excitation
2. First import the InelasticFiberSection.py (upto gravity loading is already in this script) and run the
current script
3. To run EQ ground-motion analysis BM68elc.acc needs to be downloaded into the same directory)
4. Same acceleration input at all nodes restrained in specified direction (uniform acceleration input at all support
nodes)
5. The problem description can be found here (example:3)
6. The source code is shown below, which can be downloaded here.
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
(continues on next page)
17 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
18 ######################################################################################
˓→####################################################################################
19 import openseespy.opensees as op
20 #import the os module
21 #import os
22 import math
23 op.wipe()
24 ######################################################################################
˓→###################################################################################
25 import InelasticFiberSection
26 #applying Dynamic Ground motion analysis
27 Tol = 1e-8
28 GMdirection = 1
29 GMfile = 'BM68elc.acc'
30 GMfact = 1.0
31 Lambda = op.eigen('-fullGenLapack', 1) # eigenvalue mode 1
32 Omega = math.pow(Lambda, 0.5)
33 betaKcomm = 2 * (0.02/Omega)
34
46 maxNumIter = 10
47 op.timeSeries('Path', 2, '-dt', dt, '-filePath', GMfile, '-factor', GMfact)
48 op.pattern('UniformExcitation', IDloadTag, GMdirection, '-accel', 2)
49
50 op.wipeAnalysis()
51 op.constraints('Transformation')
52 op.numberer('Plain')
53 op.system('BandGeneral')
54 op.test('EnergyIncr', Tol, maxNumIter)
55 op.algorithm('ModifiedNewton')
56
(continues on next page)
67 ok = op.analyze(Nsteps, DtAnalysis)
68
69 tCurrent = op.getTime()
70
71 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
72
75
76 for i in test:
77 for j in algorithm:
78
79 if ok != 0:
80 if j < 4:
81 op.algorithm(algorithm[j], '-initial')
82
83 else:
84 op.algorithm(algorithm[j])
85
94 u2 = op.nodeDisp(2, 1)
95 print("u2 = ", u2)
96
97 op.wipe()
1. To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, Static Pushover Analysis
2. First import the InelasticFiberSection.py (upto gravity loading is already in this script) and run the
current script
3. To run EQ ground-motion analysis BM68elc.acc needs to be downloaded into the same directory)
4. Same acceleration input at all nodes restrained in specified direction (uniform acceleration input at all support
nodes)
5. The problem description can be found here (example:3)
6. The source code is shown below, which can be downloaded here.
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10 # Example 3. 2D Cantilever -- Static Pushover
11 #To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, Static Pushover
˓→Analysis: First import the InelasticFiberSection.py(upto gravity loading is already
15 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
16 # characteristics of pushover analysis
17 ######################################################################################
˓→####################################################################################
18 import openseespy.opensees as op
19 #import the os module
20 #import os
21 import math
22 op.wipe()
23
31 op.timeSeries('Linear', 2)
32 op.pattern('Plain', 200, 2)
33 op.load(2, Hload, 0.0,0.0)
34
35 op.wipeAnalysis()
36 op.constraints('Plain')
37 op.numberer('Plain')
38 op.system('BandGeneral')
39 op.test('EnergyIncr', Tol, maxNumIter)
40 op.algorithm('Newton')
41
45
48 ok = op.analyze(Nsteps)
49 print(ok)
50
51 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
52
55
56 for i in test:
57 for j in algorithm:
58
59 if ok != 0:
60 if j < 4:
61 op.algorithm(algorithm[j], '-initial')
62
63 else:
64 op.algorithm(algorithm[j])
65
74 u2 = op.nodeDisp(2, 1)
75 print("u2 = ", u2)
76
77 op.wipe()
1. To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, Uniform Earthquake Excitation
2. First import the InelasticFiberSectionPortal2Dframe.py
3. To run EQ ground-motion analysis (ReadRecord.py, H-E12140.AT2 needs to be downloaded into the
same directory)
4. Same acceleration input at all nodes restrained in specified direction (uniform acceleration input at all support
nodes)
5. The problem description can be found here (example:4)
6. The source code is shown below, which can be downloaded here.
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10 # Example4. 2D Portal Frame-- Dynamic EQ input analysis
11
12 #To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, Uniform
˓→Earthquake Excitation:First import the InelasticFiberSectionPortal2Dframe.py
13 #(upto gravity loading is already in this script) and run the current script
14 #To run EQ ground-motion analysis (ReadRecord.py, H-E12140.AT2 needs to be downloaded
˓→into the same directory)
18 # ------------------------------------------------------------------------------------
˓→--------------
19 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
20 ######################################################################################
˓→####################################################################################
21 import openseespy.opensees as op
22 #import the os module
23 #import os
24 import math
25 op.wipe()
26 ######################################################################################
˓→####################################################################################
27
38
53 import ReadRecord
54 # Permform the conversion from SMD record to OpenSees record
55 dt, nPts = ReadRecord.ReadRecord(record+'.at2', record+'.dat')
56 #print(dt, nPts)
57
63 op.wipeAnalysis()
64 op.constraints('Transformation')
65 op.numberer('RCM')
66 op.system('BandGeneral')
67 #op.test('EnergyIncr', Tol, maxNumIter)
68 #op.algorithm('ModifiedNewton')
69 #NewmarkGamma = 0.5
70 #NewmarkBeta = 0.25
71 #op.integrator('Newmark', NewmarkGamma, NewmarkBeta)
72 #op.analysis('Transient')
73
74
79 tCurrent = op.getTime()
80
81 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
82
85
86 tFinal = nPts*dt
87
88 #tFinal = 10.0*sec
89 time = [tCurrent]
90 u3 = [0.0]
91 u4 = [0.0]
92 ok = 0
93 while tCurrent < tFinal:
94 # ok = op.analyze(1, .01)
95 for i in test:
96 for j in algorithm:
97 if j < 4:
98 op.algorithm(algorithm[j], '-initial')
99
100 else:
101 op.algorithm(algorithm[j])
102 while ok == 0 and tCurrent < tFinal:
103
111 if ok == 0 :
112 tCurrent = op.getTime()
113 time.append(tCurrent)
114 u3.append(op.nodeDisp(3,1))
115 u4.append(op.nodeDisp(4,1))
116 print(test[i], algorithm[j], 'tCurrent=', tCurrent)
117
118
127 plt.figure(figsize=(8,8))
128 plt.plot(time, u4)
129 plt.ylabel('Horizontal Displacement of node 4 (in)')
130 plt.xlabel('Time (s)')
131 plt.savefig('Horizontal Disp at Node 4 vs time.jpeg', dpi = 500)
132 plt.show()
133
134
135 op.wipe()
1. To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, MultipleSupport Earthquake ground motion
2. First import the InelasticFiberSectionPortal2Dframe.py
3. Upto gravity loading is already in this script and run the current script
4. To run EQ ground-motion analysis (ReadRecord.py, H-E12140.AT2 needs to be downloaded into the
same directory)
5. MultipleSupport Earthquake ground motion (different acceleration input at specified support nodes) – two nodes
here
6. The problem description can be found here (example:4)
7. The source code is shown below, which can be downloaded here.
1 # -*- coding: utf-8 -*-
2 """
3 Created on Mon Apr 22 15:12:06 2019
(continues on next page)
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10 # Example4. 2D Portal Frame-- Dynamic EQ input analysis-- multiple-support
˓→excitation using acceleration timeseries
11
12 #To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, MultipleSupport
˓→Earthquake ground motion:First import the InelasticFiberSectionPortal2Dframe.py
13 #(upto gravity loading is already in this script) and run the current script
14 #To run EQ ground-motion analysis (ReadRecord.py, H-E12140.AT2 needs to be downloaded
˓→into the same directory)
18 # ------------------------------------------------------------------------------------
˓→--------------
19 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
20 ######################################################################################
˓→####################################################################################
21 import openseespy.opensees as op
22 #import the os module
23 #import os
24 import math
25 op.wipe()
26 ######################################################################################
˓→####################################################################################
27
33
43 # define DAMPING----------------------------------------------------------------------
˓→----------------
63 # read a PEER strong motion database file, extracts dt from the header and converts
˓→the file
69 import ReadRecord
70 # Permform the conversion from SMD record to OpenSees record
71 #dt, nPts = ReadRecord.ReadRecord(record+'.at2', record+'.dat')
72 #print(dt, nPts)
73 count = 2
74 #use displacement series, create time series('Path'), then create multi-support
˓→excitation patter (gmtag, 'Plain'), then create imposed ground motion
75 #using groundmotion('nodetag', gmtag), run this in a loop for each support or node
˓→where the earthquake load is going to be applied.
76 op.pattern('MultipleSupport', IDloadTag)
77 for i in range(len(iSupportNode)):
78 record_single = record[i]
79 GMfatt = (iGMfact[i])*g
80 dt, nPts = ReadRecord.ReadRecord(record_single+'.AT2', record_single+'.dat')
81 op.timeSeries('Path', count, '-dt', dt, '-filePath', record_single+'.dat', '-
˓→factor', GMfatt)
86 maxNumIter = 10
87 op.wipeAnalysis()
88 op.constraints('Transformation')
89 op.numberer('RCM')
90 op.system('BandGeneral')
91 #op.test('EnergyIncr', Tol, maxNumIter)
92 #op.algorithm('ModifiedNewton')
93 #NewmarkGamma = 0.5
94 #NewmarkBeta = 0.25
95 #op.integrator('Newmark', NewmarkGamma, NewmarkBeta)
96 #op.analysis('Transient')
97 #
98 #
99 #Nsteps = int(TmaxAnalysis/ DtAnalysis)
100 #
101 #ok = op.analyze(Nsteps, DtAnalysis)
102
(continues on next page)
105 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
106
109
124 else:
125 op.algorithm(algorithm[j])
126 while ok == 0 and tCurrent < tFinal:
127
135 if ok == 0 :
136 tCurrent = op.getTime()
137 time.append(tCurrent)
138 u3.append(op.nodeDisp(3,1))
139 u4.append(op.nodeDisp(4,1))
140 print(test[i], algorithm[j], 'tCurrent=', tCurrent)
141
148 plt.show()
149
150 plt.figure(figsize=(8,8))
151 plt.plot(time, u4)
152 plt.ylabel('Horizontal Displacement of node 4 (in)')
153 plt.xlabel('Time (s)')
154 plt.savefig('Horizontal Disp at Node 4 vs time-multiple support excitation-acctime.
˓→jpeg', dpi = 500)
(continues on next page)
157
158 op.wipe()
1. To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, MultipleSupport Earthquake ground motion
2. First import the InelasticFiberSectionPortal2Dframe.py
3. To run EQ ground-motion analysis (ReadRecord.py, H-E12140.DT2 needs to be downloaded into the
same directory)
4. MultipleSupport Earthquake ground motion (different displacement input at specified support nodes) – two
nodes here
5. The problem description can be found here (example:4)
6. The source code is shown below, which can be downloaded here.
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10 # Example4. 2D Portal Frame-- Dynamic EQ input analysis-- multiple-support
˓→excitation using displacement timeseries
11
12 #To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, MultipleSupport
˓→Earthquake ground motion:First import the InelasticFiberSectionPortal2Dframe.py
13 #(upto gravity loading is already in this script) and run the current script
14 #To run EQ ground-motion analysis (ReadRecord.py, H-E12140.DT2 needs to be downloaded
˓→into the same directory)
18 # ------------------------------------------------------------------------------------
˓→--------------
19 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
20 ######################################################################################
˓→####################################################################################
21 import openseespy.opensees as op
22 #import the os module
23 #import os
24 import math
(continues on next page)
27
33
43 # define DAMPING----------------------------------------------------------------------
˓→----------------
63 # read a PEER strong motion database file, extracts dt from the header and converts
˓→the file
69 import ReadRecord
70 # Permform the conversion from SMD record to OpenSees record
71 #dt, nPts = ReadRecord.ReadRecord(record+'.at2', record+'.dat')
72 #print(dt, nPts)
73 count = 2
74 #use displacement series, create time series('Path'), then create multi-support
˓→excitation patter (gmtag, 'Plain'), then create imposed ground motion
75 #using groundmotion('nodetag', gmtag), run this in a loop for each support or node
˓→where the earthquake load is going to be applied. (continues on next page)
86 maxNumIter = 10
87 op.wipeAnalysis()
88 op.constraints('Transformation')
89 op.numberer('RCM')
90 op.system('BandGeneral')
91 #op.test('EnergyIncr', Tol, maxNumIter)
92 #op.algorithm('ModifiedNewton')
93 #NewmarkGamma = 0.5
94 #NewmarkBeta = 0.25
95 #op.integrator('Newmark', NewmarkGamma, NewmarkBeta)
96 #op.analysis('Transient')
97 #
98 #
99 #Nsteps = int(TmaxAnalysis/ DtAnalysis)
100 #
101 #ok = op.analyze(Nsteps, DtAnalysis)
102
105 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
106
109
124 else:
125 op.algorithm(algorithm[j])
126 while ok == 0 and tCurrent < tFinal:
127
135 if ok == 0 :
136 tCurrent = op.getTime()
137 time.append(tCurrent)
138 u3.append(op.nodeDisp(3,1))
139 u4.append(op.nodeDisp(4,1))
140 print(test[i], algorithm[j], 'tCurrent=', tCurrent)
141
148 plt.show()
149
150 plt.figure(figsize=(8,8))
151 plt.plot(time, u4)
152 plt.ylabel('Horizontal Displacement of node 4 (in)')
153 plt.xlabel('Time (s)')
154 plt.savefig('Horizontal Disp at Node 4 vs time-multiple support excitation-disptime.
˓→jpeg', dpi = 500)
155 plt.show()
156
157
158 op.wipe()
1. To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, Bidirectional-uniform earthquake ground
motion
2. First import the InelasticFiberSectionPortal2Dframe.py
3. To run EQ ground-motion analysis (ReadRecord.py, H-E12140.AT2, H-E01140.AT2 needs to be
downloaded into the same directory)
4. Bidirectional-uniform support excitation using acceleration timeseries (different accelerations are input at all
support nodes in two directions) – two support nodes here
5. The problem description can be found here (example:4)
6. The source code is shown below, which can be downloaded here.
5 @author: pchi893
6 """
7 # Converted to openseespy by: Pavan Chigullapally
8 # University of Auckland
9 # Email: [email protected]
10
12
13 #To run Uniaxial Inelastic Material, Fiber Section, Nonlinear Mode, Bidirectional-
˓→uniform earthquake ground motion:First import the
˓→InelasticFiberSectionPortal2Dframe.py
14 #(upto gravity loading is already in this script) and run the current script
15 #To run EQ ground-motion analysis (ReadRecord.py, H-E12140.AT2 and H-E01140.AT2 needs
˓→to be downloaded into the same directory)
˓→nodes here
19 # ------------------------------------------------------------------------------------
˓→--------------
20 # OpenSees (Tcl) code by: Silvia Mazzoni & Frank McKenna, 2006
21 # ------------------------------------------------------------------------------------
˓→--------------
22 ######################################################################################
˓→####################################################################################
23 import openseespy.opensees as op
24 #import the os module
25 #import os
26 import math
27 op.wipe()
28 ######################################################################################
˓→####################################################################################
29
35
45 # define DAMPING----------------------------------------------------------------------
˓→----------------
64
65 # read a PEER strong motion database file, extracts dt from the header and converts
˓→the file
71 import ReadRecord
72
84 maxNumIter = 10
85 op.wipeAnalysis()
86 op.constraints('Transformation')
87 op.numberer('RCM')
88 op.system('BandGeneral')
89 #op.test('EnergyIncr', Tol, maxNumIter)
90 #op.algorithm('ModifiedNewton')
91 #NewmarkGamma = 0.5
92 #NewmarkBeta = 0.25
93 #op.integrator('Newmark', NewmarkGamma, NewmarkBeta)
94 #op.analysis('Transient')
95
96
103 # for gravity analysis, load control is fine, 0.1 is the load factor increment (http:/
˓→/opensees.berkeley.edu/wiki/index.php/Load_Control)
104
107
122 else:
123 op.algorithm(algorithm[j])
124 while ok == 0 and tCurrent < tFinal:
125
133 if ok == 0 :
134 tCurrent = op.getTime()
135 time.append(tCurrent)
136 u3.append(op.nodeDisp(3,1))
137 u4.append(op.nodeDisp(4,1))
138 print(test[i], algorithm[j], 'tCurrent=', tCurrent)
139
146 plt.show()
147
148 plt.figure(figsize=(8,8))
149 plt.plot(time, u4)
150 plt.ylabel('Horizontal Displacement of node 4 (in)')
151 plt.xlabel('Time (s)')
152 plt.savefig('Horizontal Disp at Node 4 vs time-uniform excitation-acctime.jpeg', dpi
˓→= 500)
(continues on next page)
156 op.wipe()
1. Moving Mesh
2. Background Mesh
Moving Mesh
4 # ------------------------------
5 # Start of model generation
6 # -----------------------------
7
11 # set modelbuilder
12 ops.model('basic', '-ndm', 2, '-ndf', 2)
13
14 # geometric
15 L = 0.146
16 H = L*2
17 H2 = 0.3
18 h = 0.005
19 alpha = 1.4
20 tw = 3*h
21
22 # material
23 rho = 1000.0
24 mu = 0.0001
25 b1 = 0.0
26 b2 = -9.81
27 thk = 0.012
28 kappa = -1.0
(continues on next page)
30 # time steps
31 dtmax = 1e-3
32 dtmin = 1e-6
33 totaltime = 1.0
34
35 # filename
36 filename = 'dambreak'
37
38 # recorder
39 if not os.path.exists(filename):
40 os.makedirs(filename)
41 ops.recorder('PVD', filename, 'disp', 'vel', 'pressure')
42
43 # nodes
44 ops.node(1, 0.0, 0.0)
45 ops.node(2, L, 0.0)
46 ops.node(3, L, H)
47 ops.node(4, 0.0, H)
48 ops.node(5, 0.0, H2)
49 ops.node(6, 4*L, 0.0)
50 ops.node(7, 4*L, H2)
51 ops.node(8, -tw, H2)
52 ops.node(9, -tw, -tw)
53 ops.node(10, 4*L+tw, -tw)
54 ops.node(11, 4*L+tw, H2)
55
61 # wall mesh
62 wall_tag = 3
63 ndf = 2
64 ops.mesh('line', 1, 9, 4,5,8,9,10,11,7,6,2, wall_id, ndf, h)
65 ops.mesh('line', 2, 3, 2,1,4, wall_id, ndf, h)
66 ops.mesh('tri', wall_tag, 2, 1,2, wall_id, ndf, h)
67
68 # fluid mesh
69 fluid_tag = 4
70 ops.mesh('line', 5, 3, 2,3,4, water_bound_id, ndf, h)
71
72 eleArgs = ['PFEMElementBubble',rho,mu,b1,b2,thk,kappa]
73 ops.mesh('tri', fluid_tag, 2, 2,5, water_body_id, ndf, h, *eleArgs)
74
102 # analysis
103 while ops.getTime() < totaltime:
104
105 # analysis
106 if ops.analyze() < 0:
107 break
108
109 ops.remesh(alpha)
110
111
112
1 import os
2 import openseespy.opensees as ops
3
4 # ------------------------------
5 # Start of model generation
6 # -----------------------------
7
11 # set modelbuilder
12 ops.model('basic', '-ndm', 2, '-ndf', 3)
13
14 # geometric
15 L = 0.146
16 H = 2*L
17 H2 = 0.3
18 b = 0.012
(continues on next page)
24 # material
25 rho = 1000.0
26 mu = 0.0001
27 b1 = 0.0
28 b2 = -9.81
29 thk = 0.012
30 kappa = -1.0
31
32 rhos = 2500.0
33 A = thk*thk
34 E = 1e6
35 Iz = thk*thk*thk*thk/12.0
36 bmass = A*Hb*rhos
37
38 # analysis
39 dtmax = 1e-3
40 dtmin = 1e-6
41 totaltime = 1.0
42
43 filename = 'obstacle'
44
45 # recorder
46 if not os.path.exists(filename):
47 os.makedirs(filename)
48 ops.recorder('PVD', filename, 'disp', 'vel', 'pressure')
49
50 # nodes
51 ops.node(1, 0.0, 0.0)
52 ops.node(2, L, 0.0)
53 ops.node(3, L, H, '-ndf', 2)
54 ops.node(4, 0.0, H)
55 ops.node(5, 0.0, H2)
56 ops.node(6, 4*L, 0.0)
57 ops.node(7, 4*L, H2)
58 ops.node(8, -tw, H2)
59 ops.node(9, -tw, -tw)
60 ops.node(10, 4*L+tw, -tw)
61 ops.node(11, 4*L+tw, H2)
62 ops.node(12, 2*L, 0.0)
63 ops.node(13, 2*L, Hb)
64
71 # transformation
72 transfTag = 1
73 ops.geomTransf('Corotational', transfTag)
74
75 # section
(continues on next page)
79 # beam integration
80 inteTag = 1
81 numpts = 2
82 ops.beamIntegration('Legendre', inteTag, secTag, numpts)
83
84 # beam mesh
85 beamTag = 6
86 ndf = 3
87 ops.mesh('line', beamTag, 2, 12, 13, beam_id, ndf, h, 'dispBeamColumn', transfTag,
˓→inteTag)
88
94 # fluid mesh
95 fluidTag = 4
96 ndf = 2
97 ops.mesh('line', 1, 10, 4,5,8,9,10,11,7,6,12,2, wall_id, ndf, h)
98 ops.mesh('line', 2, 3, 2,1,4, wall_id, ndf, h)
99 ops.mesh('line', 3, 3, 2,3,4, water_bound_id, ndf, h)
100
135 # analysis
136 while ops.getTime() < totaltime:
137
138 # analysis
139 if ops.analyze() < 0:
140 break
141
142 ops.remesh(alpha)
Background Mesh
5 # ------------------------------
6 # Start of model generation
7 # -----------------------------
8
15 # geometric
16 L = 0.146
17 H = L * 2
18 h = L / 40
19
24 # material
25 rho = 1000.0
26 mu = 0.0001
27 b1 = 0.0
28 b2 = -9.81
(continues on next page)
32 # analysis
33 dtmax = 1e-3
34 dtmin = 1e-3
35 totaltime = 1.0
36 filename = 'dambreak-bg'
37
38 # recorder
39 ops.recorder('BgPVD', filename, 'disp', 'vel', 'pressure', '-dT', 1e-3)
40 if not os.path.exists(filename):
41 os.makedirs(filename)
42
43 # fluid particles
44 ndf = 2
45
50 # create particles
51 eleArgs = ['PFEMElementBubble', rho, mu, b1, b2, thk, kappa]
52 partArgs = ['quad', 0.0, 0.0, L, 0.0, L, H, 0.0, H, nx, ny]
53 parttag = 1
54 ops.mesh('part', parttag, *partArgs, *eleArgs, '-vel', 0.0, 0.0)
55
58 # wall
59 ops.node(1, 0.0, H)
60 ops.node(2, 0.0, 0.0)
61 ops.node(3, 4 * L, 0.0)
62 ops.node(4, 4 * L, H)
63
64 walltag = 2
65 wallid = 1
66 ops.mesh('line', walltag, 4, 1, 2, 3, 4, wallid, ndf, h)
67
70 for nd in wallnodes:
71 ops.fix(nd, 1, 1)
72
73 # background mesh
74 lower = [-h, -h]
75 upper = [4 * L + L, H + L]
76
102 # analysis
103 while ops.getTime() < totaltime:
104
105 # analysis
106 if ops.analyze() < 0:
107 break
108
109 ops.remesh()
110
111 print("==========================================")
1 import os
2 import openseespy.opensees as ops
3
5 print("=======================================================")
6 print("Starting Dambreak with Obstacle Background Mesh example")
7
8 # ------------------------------
9 # Start of model generation
10 # -----------------------------
11
18 # geometric
19 L = 0.146
(continues on next page)
30 # fluid properties
31 rho = 1000.0
32 mu = 0.0001
33 b1 = 0.0
34 b2 = -9.81
35 thk = 0.012
36 kappa = -1.0
37
50 nonlinear = False
51
52 # analysis
53 dtmax = 1e-3
54 dtmin = 1e-3
55 totaltime = 1.0
56
57 if nonlinear:
58 filename = 'obstaclenonlinear-bg'
59 else:
60 filename = 'obstacle-bg'
61
62 # recorder
63 ops.recorder('BgPVD', filename, 'disp', 'vel', 'pressure', '-dT', 1e-3)
64 if not os.path.exists(filename):
65 os.makedirs(filename)
66
67 # fluid mesh
68 ndf = 3
69
74 # create particles
75 eleArgs = ['PFEMElementBubble', rho, mu, b1, b2, thk, kappa]
76 partArgs = ['quad', 0.0, 0.0, L, 0.0, L, H, 0.0, H, nx, ny]
(continues on next page)
80 # wall mesh
81 ops.node(1, 2 * L, 0.0)
82 ops.node(2, 2 * L, Hb)
83 ops.node(3, 0.0, H)
84 ops.node(4, 0.0, 0.0)
85 ops.node(5, 4 * L, 0.0)
86 ops.node(6, 4 * L, H)
87
88 sid = 1
89 walltag = 4
90 ops.mesh('line', walltag, 5, 3, 4, 1, 5, 6, sid, ndf, h)
91
96 # structural mesh
97
98 # transformation
99 transfTag = 1
100 ops.geomTransf('Corotational', transfTag)
101
102 # section
103 secTag = 1
104 if nonlinear:
105 matTag = 1
106 ops.uniaxialMaterial('Steel01', matTag, Fy, E0, hardening)
107 numfiber = 5
108 ops.section('Fiber', secTag)
109 ops.patch('rect', matTag, numfiber, numfiber, 0.0, 0.0, thk, thk)
110 else:
111 ops.section('Elastic', secTag, E, A, Iz)
112
118 coltag = 3
119 eleArgs = ['dispBeamColumn', transfTag, inteTag]
120 ops.mesh('line', coltag, 2, 1, 2, sid, ndf, h, *eleArgs)
121
122 # mass
123 sNodes = ops.getNodeTags('-mesh', coltag)
124 bmass = bmass / len(sNodes)
125 for nd in sNodes:
126 ops.mass(int(nd), bmass, bmass, 0.0)
127
128
162 # analysis
163 while ops.getTime() < totaltime:
164
165 # analysis
166 if ops.analyze() < 0:
167 break
168
169 ops.remesh()
170
171 print("==========================================")
5 @author: pchi893
6 """
7
10
11 ##########################################################
12 # #
13 # Procedure to compute ultimate lateral resistance, p_u, #
14 # and displacement at 50% of lateral capacity, y50, for #
15 # p-y springs representing cohesionless soil. #
16 # Converted to openseespy by: Pavan Chigullapally #
17 # University of Auckland #
18 # #
19 # Created by: Hyung-suk Shin #
20 # University of Washington #
21 # Modified by: Chris McGann #
22 # Pedro Arduino #
23 # Peter Mackenzie-Helnwein #
24 # University of Washington #
25 # #
26 ###########################################################
27
28 # references
29 # American Petroleum Institute (API) (1987). Recommended Practice for Planning,
˓→Designing and
31 # 17th edition.
32 #
33 # Brinch Hansen, J. (1961). "The ultimate resistance of rigid piles against
˓→transversal forces."
39 # Rep. UCD/CGM-03/01.
40 #
41 # Reese, L.C. and Van Impe, W.F. (2001), Single Piles and Pile Groups Under Lateral
˓→Loading.
44 import math
45
47
48 #----------------------------------------------------------
49 # define ultimate lateral resistance, pult
(continues on next page)
52 # pult is defined per API recommendations (Reese and Van Impe, 2001 or API, 1987)
˓→ for puSwitch = 1
53 # OR per the method of Brinch Hansen (1961) for puSwitch = 2
54
55 pi = 3.14159265358979
56 phi = phiDegree * (pi/180)
57 zbRatio = pyDepth / b
58
61 if puSwitch == 1:
62
72
95 tan_4 = math.tan(beta)
96 tan_5 = math.tan(alpha)
97 c2 = (tan_4/tan_3)*tan_4 * tan_5
98
103 # terms for Equation (3.45), Reese and Van Impe (2001)
104 pow_1 = math.pow(tan_4,8)
105 pow_2 = math.pow(tan_4,4)
106 c5 = Ka * (pow_1-1)
107 c6 = K0 * tan_2 * pow_2
108
115 # pult is the lesser of pst and psd. At surface, an arbitrary value is defined
116 if pst <=psd:
117 if pyDepth == 0:
118 pu = 0.01
119
120 else:
121 pu = A * pst
122
123 else:
124 pu = A * psd
125
168 #----------------------------------------------------------
169 # define displacement at 50% lateral capacity, y50
170 #----------------------------------------------------------
171
172 # values of y50 depend of the coefficent of subgrade reaction, k, which can be
˓→defined in several ways.
173 # for gwtSwitch = 1, k reflects soil above the groundwater table
174 # for gwtSwitch = 2, k reflects soil below the groundwater table
175 # a linear variation of k with depth is defined for kSwitch = 1 after API (1987)
176 # a parabolic variation of k with depth is defined for kSwitch = 2 after
˓→Boulanger et al. (2003)
177
178 # API (1987) recommended subgrade modulus for given friction angle, values
˓→ obtained from figure (approximate)
179
180 ph = [28.8, 29.5, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.
˓→ 0]
181
186 else:
187 k = [10, 20, 33, 42, 50, 60, 70, 85, 95, 107, 122, 141, 155]
188
189 dataNum = 13
190 for i in range(dataNum):
191 if ph[i] <= phiDegree and phiDegree <= ph[i+1]:
192 khat = (k[i+1]-k[i])/(ph[i+1]-ph[i])*(phiDegree - ph[i]) + k[i]
193
197 # define parabolic distribution of k with depth if desired (i.e. lin_par switch
˓→ == 2)
198 sigV = pyDepth * gamma
199
200 if sigV == 0:
201 sigV = 0.01
202
203 if kSwitch == 2:
204 # Equation (5-16), Boulanger et al. (2003)
205 cSigma = math.pow(50 / sigV , 0.5)
206 # Equation (5-15), Boulanger et al. (2003)
207 k_SIunits = cSigma * k_SIunits
208
(continues on next page)
211 # based on API (1987) recommendations, p-y curves are described using tanh
˓→ functions.
212 # tcl does not have the atanh function, so must define this specifically
213
216 # when half of full resistance has been mobilized, p(y50)/pult = 0.5
217 x = 0.5
218 log_1 = math.log((1+x)/(1-x))
219 atanh_value = 0.5 * log_1
220
233 ######################################################################################
˓→###################################################################################
234
235 ######################################################################################
˓→###################################################################################
236
237 ###########################################################
238 # #
239 # Procedure to compute ultimate tip resistance, qult, and #
240 # displacement at 50% mobilization of qult, z50, for #
241 # use in q-z curves for cohesionless soil. #
242 # Converted to openseespy by: Pavan Chigullapally #
243 # University of Auckland #
244 # Created by: Chris McGann #
245 # Pedro Arduino #
246 # University of Washington #
247 # #
248 ###########################################################
249
250 # references
251 # Meyerhof G.G. (1976). "Bearing capacity and settlement of pile foundations."
252 # J. Geotech. Eng. Div., ASCE, 102(3), 195-228.
253 #
254 # Vijayvergiya, V.N. (1977). "Load-movement characteristics of piles."
255 # Proc., Ports 77 Conf., ASCE, New York.
256 #
257 # Kulhawy, F.H. ad Mayne, P.W. (1990). Manual on Estimating Soil Properties for
258 # Foundation Design. Electrical Power Research Institute. EPRI EL-6800,
259 # Project 1493-6 Final Report.
260
264 pi = 3.14159265358979
265 pa = 101
266 sin_4 = math.sin(phiDegree * (pi/180))
267 Ko = 1 - sin_4
268
269 # ultimate tip pressure can be computed by qult = Nq*sigV after Meyerhof (1976)
270 # where Nq is a bearing capacity factor, phi is friction angle, and sigV is eff.
˓→overburden
284 Nq = (1+2*Ko)*(1/(3-sin_5))*exp_4*(pow_4)*(pow_5)
285 # tip resistance
286 qu = Nq * sigV
287 # QzSimple1 material formulated with qult as force, not stress, multiply by area of
˓→pile tip
291 # the q-z curve of Vijayvergiya (1977) has the form, q(z) = qult*(z/zc)^(1/3)
292 # where zc is critical tip deflection given as ranging from 3-9% of the
293 # pile diameter at the tip.
294
301 # return values of qult and z50 for use in q-z material
302 outResult = []
303 outResult.append(qult)
304 outResult.append(z50)
305
308 ######################################################################################
˓→###################################################################################
309
310 ######################################################################################
˓→###################################################################################
311 ##########################################################
312 # #
313 # Procedure to compute ultimate resistance, tult, and #
314 # displacement at 50% mobilization of tult, z50, for #
(continues on next page)
325 # references
326 # Mosher, R.L. (1984). "Load transfer criteria for numerical analysis of
327 # axial loaded piles in sand." U.S. Army Engineering and Waterways
328 # Experimental Station, Automatic Data Processing Center, Vicksburg, Miss.
329 #
330 # Kulhawy, F.H. (1991). "Drilled shaft foundations." Foundation engineering
331 # handbook, 2nd Ed., Chap 14, H.-Y. Fang ed., Van Nostrand Reinhold, New York
332
333 pi = 3.14159265358979
334
352 # TzSimple1 material formulated with tult as force, not stress, multiply by
˓→ tributary length of pile
353 tult = tu * pEleLength
354
355 # Mosher (1984) provides recommended initial tangents based on friction angle
356 # values are in units of psf/in
357 kf = [6000, 10000, 10000, 14000, 14000, 18000]
358 fric = [28, 31, 32, 34, 35, 38]
359
362
363 # determine kf for input value of phi, linear interpolation for intermediate
˓→ values
364 if phi < fric[0]:
365 k = kf[0]
366 elif phi > fric[5]:
367 k = kf[5]
368 else:
369 for i in range(dataNum):
(continues on next page)
373
377 # based on a t-z curve of the shape recommended by Mosher (1984), z50 = tult/kf
378 z50 = tult / kSIunits
379
380 # return values of tult and z50 for use in t-z material
381 outResult = []
382 outResult.append(tult)
383 outResult.append(z50)
384
387
388 ######################################################################################
˓→###################################################################################
389
390 ######################################################################################
˓→###################################################################################
391
392 ###########################################################
393 # #
394 # Static pushover of a single pile, modeled as a beam on #
395 # a nonlinear Winkler foundation. Lateral soil response #
396 # is described by p-y springs. Vertical soil response #
397 # described by t-z and q-z springs. #
398 # Converted to openseespy by: Pavan Chigullapally #
399 # University of Auckland #
400 # Created by: Chris McGann #
401 # HyungSuk Shin #
402 # Pedro Arduino #
403 # Peter Mackenzie-Helnwein #
404 # --University of Washington-- #
405 # #
406 # ---> Basic units are kN and meters #
407 # #
408 ###########################################################
409
410
413 op.wipe()
414
415 ######################################################################################
˓→###################################################################################
416
417 ######################################################################################
˓→###################################################################################
418
421 #----------------------------------------------------------
(continues on next page)
440 #----------------------------------------------------------
441 # create spring nodes
442 #----------------------------------------------------------
443 # spring nodes created with 3 dim, 3 dof
444 op.model('basic', '-ndm', 3, '-ndf', 3)
445
476 #----------------------------------------------------------
477 # soil properties
478 #----------------------------------------------------------
(continues on next page)
492 # variation in coefficent of subgrade reaction with depth for p-y curves
493 # API linear variation (default) --> 1
494 # modified API parabolic variation --> 2
495 kSwitch = 1
496
497 # effect of ground water on subgrade reaction modulus for p-y curves
498 # above gwt --> 1
499 # below gwt --> 2
500 gwtSwitch = 1
501
502 #----------------------------------------------------------
503 # create spring material objects
504 #----------------------------------------------------------
505
517
530
533 # vertical effective stress at pile tip, no water table (depth is embedded pile
˓→ length)
(continues on next page)
543 print("Finished creating all p-y, t-z, and z-z spring material objects...")
544
545
546 #----------------------------------------------------------
547 # create zero-length elements for springs
548 #----------------------------------------------------------
549
559 #----------------------------------------------------------
560 # create pile nodes
561 #----------------------------------------------------------
562
576
580
587 #----------------------------------------------------------
588 # define equal dof between pile and spring nodes
589 #----------------------------------------------------------
590
(continues on next page)
596 #----------------------------------------------------------
597 # pile section
598 #----------------------------------------------------------
599 ######################################################################################
˓→####################################################################################
600
601 ######################################################################################
˓→###################################################################################
602
603 #----------------------------------------------------------
604 # create elastic pile section
605 #----------------------------------------------------------
606
607 secTag = 1
608 E = 25000000.0
609 A = 0.785
610 Iz = 0.049
611 Iy = 0.049
612 G = 9615385.0
613 J = 0.098
614
625
626 ######################################################################################
˓→###################################################################################
627
628 ######################################################################################
˓→####################################################################################
629
633 #----------------------------------------------------------
634 # create pile elements
635 #----------------------------------------------------------
636 op.beamIntegration('Legendre', 1, secTag3D, 3) # we are using gauss-Legendre
˓→integration as it is the default integration scheme used in opensees tcl (check
˓→dispBeamColumn)
637
643 #----------------------------------------------------------
644 # create recorders
645 #----------------------------------------------------------
646
652
655
658
661 #----------------------------------------------------------
662 # create the loading
663 #----------------------------------------------------------
664
665 op.setTime(10.0)
666
667 # apply point load at the uppermost pile node in the x-direction
668 values = [0.0, 0.0, 1.0, 1.0]
669 time = [0.0, 10.0, 20.0, 10000.0]
670
680 #----------------------------------------------------------
681 # create the analysis
682 #----------------------------------------------------------
683 op.integrator('LoadControl', 0.05)
684 op.numberer('RCM')
685 op.system('SparseGeneral')
686 op.constraints('Transformation')
687 op.test('NormDispIncr', 1e-5, 20, 1)
688 op.algorithm('Newton')
689 op.analysis('Static')
690
697 #op.wipe
698
699 op.reactions()
700 Nodereactions = dict()
701 Nodedisplacements = dict()
702 for i in range(201,nodeTag+1):
703 Nodereactions[i] = op.nodeReaction(i)
704 Nodedisplacements[i] = op.nodeDisp(i)
705 print('Node Reactions are: ', Nodereactions)
706 print('Node Displacements are: ', Nodedisplacements)
707
708
709
710
711
5 @author: harsh
6 """
7 import numpy as np
8 import math as mm
9 import opensees as op
10 import time as tt
11 ##################################################################
12 # #
13 # Effective stress site response analysis for a layered #
14 # soil profile located on a 2% slope and underlain by an #
15 # elastic half-space. 9-node quadUP elements are used. #
16 # The finite rigidity of the elastic half space is #
17 # considered through the use of a viscous damper at the #
18 # base. #
19 # #
20 # Converted to openseespy by: Harsh Mistry #
21 # The University of Manchester #
22 # #
23 # Created by: Chris McGann #
24 # HyungSuk Shin #
25 # Pedro Arduino #
26 # Peter Mackenzie-Helnwein #
27 # --University of Washington-- #
28 # #
29 # ---> Basic units are kN and m (unless specified) #
30 # #
(continues on next page)
35
36 op.wipe()
37 nodes_dict = dict()
38
39 #---SOIL GEOMETRY
40 # thicknesses of soil profile (m)
41 soilThick = 30.0
42 # number of soil layers
43 numLayers = 3
44 # layer thicknesses
45 layerThick=[20.0,8.0,2.0]
46
56 #---MESH GEOMETRY
57 # number of elements in horizontal direction
58 nElemX = 1
59 # number of nodes in horizontal direction
60 nNodeX =2 * nElemX+1
61 # horizontal element size (m)
62 sElemX = 2.0
63
70 sElemY = np.zeros((numLayers,1))
71 # vertical element size in each layer
72 for i in range(numLayers):
73 sElemY[i] = [layerThick[i-1]/nElemY[i-1]]
74 print('size:',sElemY[i])
75
82 #-------------------------------------------------------------------------------------
˓→----
87 count = 1
88 layerNodeCount = 0
89 dry_Node=np.zeros((500,1))
90 node_save=np.zeros((500,1))
91 # loop over soil layers
92 for k in range(1,numLayers+1):
93 # loop in horizontal direction
94 for i in range(1,nNodeX+1,2):
95 if k==1:
96 bump = 1
97 else:
98 bump = 0
99 j_end=2 * nElemY[k-1] + bump
100 for j in range(1,j_end+1,2):
101 xCoord = (i-1) * (sElemX/2)
102 yctr = j + layerNodeCount
103 yCoord = (yctr-1) * (np.float(sElemY[k-1]))/2
104 nodeNum = i + ((yctr-1) * nNodeX)
105 op.node(nodeNum, xCoord, yCoord)
106
117 dryNode=np.trim_zeros(dry_Node)
118 Node_d=np.unique(node_save)
119 Node_d=np.trim_zeros(Node_d)
120 np.savetxt('Node_record.txt',Node_d)
121 print('Finished creating all -ndf 3 nodes')
122 print('Number of Dry Nodes:',len(dryNode))
123
124 # define fixities for pore pressure nodes above water table
125 for i in range(count-1):
126 n_dryNode=np.int(dryNode[i])
127 op.fix(n_dryNode, 0, 0, 1)
128
129 op.fix(1, 0, 1, 0)
130 op.fix(3, 0, 1, 0)
131 print('Finished creating all -ndf 3 boundary conditions...')
132
139 #-------------------------------------------------------------------------------------
˓→----
191 # define equal degrees of freedom which have not yet been defined
192 for i in range(1,((3*nNodeY)-6),6):
193 op.equalDOF(i , i+1, 1, 2)
194 op.equalDOF(i+3, i+4, 1, 2)
195 op.equalDOF(i+3, i+5, 1, 2)
196
(continues on next page)
200 #-------------------------------------------------------------------------------------
˓→----
203
218
243 #-------------------------------------------------------------------------------------
˓→----
246
264
271
283 # define equal DOF for dashpot and base soil node
284 op.equalDOF(1, dashS, 1)
285 print('Finished creating dashpot nodes and boundary conditions...')
286
301 #-------------------------------------------------------------------------------------
˓→----
(continues on next page)
304
313 op.recorder('Node','-file','Gacceleration.txt','-time','-node',*nodeList3,'-dof', 1,
˓→2, 'accel')
314 op.recorder('Node','-file','GporePressure.txt','-time','-node',*nodeList3,'-dof', 3,
˓→'vel')
315
316 # record elemental stress and strain (files are names to reflect GiD gp numbering)
317 op.recorder('Element','-file','Gstress1.txt','-time','-eleRange', 1,nElemT,'material',
˓→'1','stress')
327
330 #-------------------------------------------------------------------------------------
˓→----
333
374
383 #-------------------------------------------------------------------------------------
˓→----
413 #-------------------------------------------------------------------------------------
˓→----
416
417 # choose base number for parameter IDs which is higer than other tags used in analysis
418 ctr = 10000.0
419 # loop over elements to define parameter IDs
420 for i in range(1,nElemT+1):
421 op.parameter(np.int(ctr+1.0), 'element', i, 'vPerm')
422 op.parameter(np.int(ctr+2.0), 'element', i, 'hPerm')
423 ctr = ctr+2.0
424
425 # update permeability parameters for each element using parameter IDs
426 ctr = 10000.0
427 for j in range(1,nElemT+1):
428 lowerBound = 0.0
429 for i in range(1,numLayers+1):
430 if j * sElemY[i-1] <= layerBound[i-1] and j*sElemY[i-1] > lowerBound:
431 op.updateParameter(np.int(ctr+1.0), vPerm[i-1])
432 op.updateParameter(np.int(ctr+2.0), hPerm[i-1])
433 lowerBound = layerBound[i-1]
434 ctr = ctr+2.0
435
438 #-------------------------------------------------------------------------------------
˓→----
441
454
455 # record elemental stress and strain (files are names to reflect GiD gp numbering)
456 op.recorder('Element','-file','stress1.txt','-time', '-dT',recDT,'-eleRange', 1,
˓→nElemT,'material','1','stress')
466
469 #-------------------------------------------------------------------------------------
˓→----
1. The original model is from 2D Undrained Cyclic Direct Simple Shear Test Using One Element at University
of Washington, Department of Civil and Environmental Eng by Geotechnical Eng Group L. Chen, P. Arduino -
Feb 2018.
2. The Python code is converted by Steve Xu from University of Texas at Austin ([email protected]), and
shown below, which can be downloaded here.
18 """
19 # from IPython import get_ipython;
20 # get_ipython().run_line_magic('reset', '-sf')
21
28 #==============================================================================
29 #Input Variables
30 '''
31 nDMaterial('PM4Sand', matTag, Dr, G0, hpo, rho, P_atm, h0, e_max, e_min,
32 nb, nd, Ado, z_max, c_z, c_e, phi_cv, nu, g_degr, c_dr, c_kaf,
33 Q, R, m_par, F_sed, p_sed)
34 '''
35 atm = -101.325
36 sig_v0 = 2.0* atm #initial vertical stress
37 CSR = 0.2 #cyclic stress ratio
38 Cycle_max = 5 #maximxum number of cycles
39 strain_in = 5.0e-6 #strain increment
40 K0 = 0.5
41 nu = K0/(1+K0) #poisson's ratio
42 devDisp = 0.03 #cutoff shear strain
43 perm = 1e-9 #permeability
44 #==============================================================================
45
46 #primary parameters
47 Dr = 0.5
48 G0 = 476.0
49 hpo = 0.53 #Contraction rate parameter
50 rho = 1.42 #mass density, KN/m3
51
52 #secondary parameters
53 P_atm = 101.325
54 # all initial stress dependant parameters have negative default values
55 # and will be calculated during initialization
56 h0 = -1.0 #Variable that adjusts the ratio of plastic modulus to elastic modulus
57 e_max = 0.8
58 e_min = 0.5
(continues on next page)
77 #%%
78 #Rayleigh Damping Parameters
79 '''
80 rayleigh(alphaM, betaK, betaKinit, betaKcomm)
81 '''
82 damp = 0.02
83 omega1 = 0.2
84 omega2 = 20.0
85 a1 = 2.0*damp/(omega1+omega2) #a1 is alphaM
86 a0 = a1*omega1*omega2 #a0 is betaK
87 #%%
88 #create model
89 #Remove the existing model, important!!!
90 op.wipe()
91
92 # set modelbuilder
93 op.model('basic', '-ndm', 2, '-ndf', 3)
94
95 #model nodes
96 x1 = 0.0
97 y1 = 0.0
98
99 x2 = 1.0
100 y2 = 0.0
101
102 x3 = 1.0
103 y3 = 1.0
104
105 x4 = 0.0
106 y4 = 1.0
107
122 #material
123 #==================================================================
124 #nDMaterial('PM4Sand', matTag, D_r, G_o, h_po, Den, P_atm, h_o, e_max,
125 #e_min, n_b, n_d, A_do, z_max, c_z, c_e, phi_cv, nu, g_degr, c_dr, c_kaf,
126 #Q_bolt, R_bolt, m_par, F_sed, p_sed)
127 #==================================================================
128 op.nDMaterial('PM4Sand', 1, Dr, G0, hpo, rho, P_atm, h0, e_max, e_min,
129 nb, nd, Ado, z_max, c_z, c_e, phi_cv, nu, g_degr, c_dr, c_kaf,
130 Q, R, m_par, F_sed, p_sed)
131
132 #element
133 op.element('SSPquadUP',1, 1,2,3,4, 1, 1.0, 2.2e6, 1.0, perm, perm, e_ini, 1.0e-5)
134
174
175 op.analyze(25,1.0)
176 b = op.eleResponse(1, 'stress') #b = [sigmaxx, sigmayy, sigmaxy]
177 print('shear stress is',b[2])
178 print('Drainage is closed')
179
193 op.analyze(25,1.0)
194 b = op.eleResponse(1, 'stress') #b = [sigmaxx, sigmayy, sigmaxy]
195 print('shear stress is',b[2])
196 print('finished update fixties')
197 # update Poisson's ratio for analysis
198 #setParameter -value 0.3 -ele 1 poissonRatio 1
199 op.setParameter('-val', 0.3, '-ele',1, 'poissonRatio', '1')
200
201
235 op.pattern('Plain', 3, 3)
236 op.sp(3, 1, 1.0)
237 while b[2] > CSR*sig_v0:
238 op.analyze(1, 1.0)
239 b = op.eleResponse(1, 'stress')
240 print('shear stress is',b[2])
241 hDisp = op.nodeDisp(3,1)
242 if hDisp <= -1.0*devDisp:
243 print('unloading break')
244 break
245 numCycle = numCycle + 0.5
246 hDisp = op.nodeDisp(3,1)
247 cur_time = op.getTime()
248 op.remove('loadPattern', 3)
249 op.remove('timeSeries', 3)
250 op.remove('sp', 3, 1)
251 #impose 1/4 cycle
252 steps = (controlDisp+hDisp)/strain_in
253 op.timeSeries('Path', 3,'-values', hDisp, controlDisp, controlDisp, '-time', cur_
˓→time, time_change, 1.0e10, '-factor', 1.0)
270 op.wipe()
271 print('Analysis is done!')
272 end = datetime.now()
273 run_time = end-start
274 print('Computation time is' , run_time)
275 #%%PostProcessing
276 import pandas as pd
277 df_stress = pd.read_csv('Cycstress.txt', sep=" ", header=None)
(continues on next page)
3 import numpy as np
4 import matplotlib.pyplot as plt
5
6 # define model
7 model('basic', '-ndm', 2, '-ndf', 3)
8
9 #define node
10 node(1, 0.0, 0.0)
11 node(2, 2.0, 0.0)
12 node(3, 1.0, 0.0)
13
34 # beam integration
35 np = 3
36 biTag = 1
37 beamIntegration('Lobatto',biTag, secTag, np)
38
54 # define analysis
55 incrtemp = 0.01
56 system('BandGeneral')
57 constraints('Plain')
58 numberer('Plain')
59 test('NormDispIncr', 1.0e-3, 100, 1)
60 algorithm('Newton')
61 integrator('LoadControl', incrtemp)
62 analysis('Static')
63
64 # analysis
65 nstep = 100
66 temp = [0.0]
67 disp = [0.0]
68 for i in range(nstep):
69 if analyze(1) < 0:
70 break
71
72 temp.append(getLoadFactor(patternTag)*maxtemp)
73 disp.append(nodeDisp(3,1))
74
75
76 plt.plot(temp,disp,'-o')
77 plt.xlabel('Temperature')
78 plt.ylabel('Nodal displacement')
79 plt.grid()
80 plt.show()
3 pid = ops.getPID()
4 np = ops.getNP()
5
Random:
Hello from 2
Hello from 1
(continues on next page)
Ordered:
Hello from 1
Hello from 2
Hello from 3
Broadcasting:
Hello from 0
Hello from 0
Hello from 0
Process 3 Terminating
Process 2 Terminating
Process 1 Terminating
Process 0 Terminating
3 pid = ops.getPID()
4 np = ops.getNP()
5
6 # datatype = 'float'
7 # datatype = 'int'
8 datatype = 'str'
9
10 if pid == 0:
11 print('Random: ')
12
24 ops.barrier()
25
26 if pid == 0:
27 print('\nOrdered: ')
28
Process 0 Terminating
Process 1 Terminating
3 pid = ops.getPID()
4 np = ops.getNP()
5 ops.start()
6 if np != 2:
7 exit()
8
12 if pid == 0:
13 ops.node(1, 0.0, 0.0)
14 ops.node(4, 72.0, 96.0)
15
16 ops.fix(1, 1, 1)
17
18 ops.element('Truss', 1, 1, 4, 10.0, 1)
19 ops.timeSeries('Linear', 1)
(continues on next page)
23 else:
24 ops.node(2, 144.0, 0.0)
25 ops.node(3, 168.0, 0.0)
26 ops.node(4, 72.0, 96.0)
27
28 ops.fix(2, 1, 1)
29 ops.fix(3, 1, 1)
30
31 ops.element('Truss', 2, 2, 4, 5.0, 1)
32 ops.element('Truss', 3, 3, 4, 5.0, 1)
33
34 ops.constraints('Transformation')
35 ops.numberer('ParallelPlain')
36 ops.system('Mumps')
37 ops.test('NormDispIncr', 1e-6, 6, 2)
38 ops.algorithm('Newton')
39 ops.integrator('LoadControl', 0.1)
40 ops.analysis('Static')
41
42 ops.analyze(10)
43
46 ops.loadConst('-time', 0.0)
47
48 if pid == 0:
49 ops.pattern('Plain', 2, 1)
50 ops.load(4, 1.0, 0.0)
51
52 ops.domainChange()
53 ops.integrator('ParallelDisplacementControl', 4, 1, 0.1)
54 ops.analyze(10)
55
Process 0 Terminating
Process 1 Terminating
Process 2 Terminating
Process 3 Terminating
3 pid = ops.getPID()
4 np = ops.getNP()
5 ops.start()
6
9 L = 48.0
10 H = 4.0
11
12 Lp = L / np
13 ndf = 2
14 meshsize = 0.05
15
21 sid = 1
22 ops.setStartNodeTag(2 * np + 2 + pid * int(H / meshsize + 10))
23 ops.mesh('line', 3, 2, pid, np + pid + 1, sid, ndf, meshsize)
24 ops.setStartNodeTag(2 * np + 2 + (pid + 1) * int(H / meshsize + 10))
25 ops.mesh('line', 4, 2, pid + 1, np + pid + 2, sid, ndf, meshsize)
26
38
(continues on next page)
47
48 ops.constraints('Transformation')
49 ops.numberer('ParallelPlain')
50 ops.system('Mumps')
51 ops.test('NormDispIncr', 1e-6, 6)
52 ops.algorithm('Newton')
53 ops.integrator('LoadControl', 1.0)
54 ops.analysis('Static')
55
56 ops.stop()
57 ops.start()
58 ops.analyze(1)
59
60 if pid == np-1:
61 print('Node', pid+1, ops.nodeDisp(pid+1))
62
63
64 ops.stop()
Processor 0
Node 4 (E = 3000.0 ) Disp : [0.5300927771322836, -0.17789363846931766]
Processor 1
Process 1 Terminating
Process 0 Terminating
3 pid = ops.getPID()
4 np = ops.getNP()
5 ops.start()
6 if np != 2:
(continues on next page)
11 if pid == 0:
12 E = 3000.0
13 else:
14 E = 6000.0
15
16 ops.uniaxialMaterial('Elastic', 1, E)
17
23 ops.fix(1, 1, 1)
24 ops.fix(2, 1, 1)
25 ops.fix(3, 1, 1)
26
27 ops.element('Truss', 1, 1, 4, 10.0, 1)
28 ops.timeSeries('Linear', 1)
29 ops.pattern('Plain', 1, 1)
30 ops.load(4, 100.0, -50.0)
31
32 ops.element('Truss', 2, 2, 4, 5.0, 1)
33 ops.element('Truss', 3, 3, 4, 5.0, 1)
34
35 ops.constraints('Transformation')
36 ops.numberer('ParallelPlain')
37 ops.system('Umfpack')
38 ops.test('NormDispIncr', 1e-6, 6)
39 ops.algorithm('Newton')
40 ops.integrator('LoadControl', 0.1)
41 ops.analysis('Static')
42
43 ops.analyze(10)
44
45
46 if pid == 0:
47 print('Processor 0')
48 print('Node 4 (E =', E, ') Disp :', ops.nodeDisp(4))
49
50 ops.barrier()
51
52 if pid == 1:
53 print('Processor 1')
54 print('Node 4 (E =', E, ') Disp :', ops.nodeDisp(4))
55
56
57 ops.stop()
2. opsvis Examples
Note: Visit the documentation page of vfo to see examples of OpenSees model post-processing.
opsvis Examples
Note: The opsvis module has been moved to its own respository. The examples can be found there.
1 """
2 - The source code is developed by Marin Grubišić https://github.com/mgrubisic
3 at University of Osijek, Croatia.
4 - The numerical model with the associated analysis was described in detail by
5 Prof. Michael Scott within OpenSees Days 2011
6 https://opensees.berkeley.edu/OpenSees/workshops/OpenSeesDays2011/B5_MHS.pdf
7 - Run the source code in your favorite Python program and should see following plot.
8 """
9
10 import time
11 import sys
12 import numpy as np
13 import matplotlib.pyplot as plt
14 import openseespy.opensees as ops
15
16 # +===============================================================================+
17 # | OpenSees Header |
18 # +===============================================================================+
19 nSpaces = 90
20 OpenSeesHeader = {"header_00": " ",
21 "header_01": nSpaces * "=",
22 "header_02": "OpenSees -- Open System For Earthquake Engineering
˓→Simulation",
36
43
44 # +===============================================================================+
45 # | Units |
46 # +===============================================================================+
47 m, kN, sec = 1.0, 1.0, 1.0 # meter for length, kilonewton for force, second for time
48
49 # Angle
50 rad = 1.0
51 deg = np.pi/180.0*rad
52
60 # Force
61 N = kN*1E-3
62 g = 9.80665*m/(sec**2)
63
64 # Mass
65 kg = N*sec**2/m
66 ton = kg*1E3
67 lbs = 0.45359237*kg
68 kip = 453.59237*kg
69
70 # Pressure
71 Pa, kPa, MPa, GPa = N/m**2, 1E3*N/m**2, 1E6*N/m**2, 1E9*N/m**2
72 pcf = lbs/(ft**3)
73 ksi = kip/(inch**2)
74 psi = ksi/1E3
75
83 # +===============================================================================+
84 # | Define some functions |
85 # +===============================================================================+
86
87
89 """
90 Run load-control sensitivity analysis
91 """
92 ops.wipeAnalysis()
93 start_time = time.time()
94
97 ops.system("BandGeneral")
98 ops.numberer("RCM")
99 ops.constraints("Transformation")
100 ops.test("NormDispIncr", 1.0E-12, 10, 3)
101 ops.algorithm("Newton") # KrylovNewton
102 ops.integrator("LoadControl", 1/steps)
103 ops.analysis("Static")
104 ops.sensitivityAlgorithm("-computeAtEachStep") # automatically compute
˓→sensitivity at the end of each step
105
˓→{FunitTXT}.")
119 ops.analyze(1)
120 tCurrent = ops.getTime()
121
129
135
136 # +===============================================================================+
137 # | Define model |
138 # +===============================================================================+
139 # Create ModelBuilder
140 # -------------------
141 ops.wipe()
142 ops.model("basic", "-ndm", 2, "-ndf", 3)
143
168
172 beamSecTag = 1
173 beamWidth, beamDepth = 10*cm, 50*cm
174 # secTag, matTag, d, tw, bf, tf,
˓→Nfw, Nff
183 nip = 5
184 # Lobatto, Legendre, NewtonCotes, Radau, Trapezoidal, CompositeSimpson
185 ops.beamIntegration("Legendre", beamIntTag, beamSecTag, nip)
186
199 ops.pattern("Plain", 1, 1)
200
201 P = 1710*kN
202 # Create nodal loads at node 2
203 # nd FX FY MZ
204 ops.load(2, 0.0, P, 0.0)
205
206 # +===============================================================================+
207 # | Define Sensitivity Parameters |
208 # +===============================================================================+
209 # /// Each parameter must be unique in the FE domain, and all parameter tags MUST be
˓→numbered sequentially starting from 1! ///
223 # Map parameter 6 to vertical load at node 2 contained in load pattern 1 (last
˓→argument is global DOF, e.g., in 2D PX=1, PY=2, MZ=3)
231 # +===============================================================================+
232 # | Run the analysis |
233 # +===============================================================================+
234 # Run analysis with 500 steps
235 # -------------------------
236 outputs = run_sensitivity_analysis(
237 ctrlNode=2, dof=2, baseNode=1, SensParam=ops.getParamTags(), steps=500,
˓→IOflag=False)
238
239 # +===============================================================================+
240 # | Plot results |
241 # +===============================================================================+
242 rows, columns = 7, 2
243 grid = plt.GridSpec(rows, columns, wspace=0.25, hspace=0.25)
244 plt.figure(figsize=(10, 15))
245
246
253
254 # Subplot #1
255 # ----------
256 plt.subplot(grid[0]), plot_params()
257 plt.plot(outputs["time"],
258 outputs["force"], "-k", linewidth=1.5)
259 plt.ylabel(r"Load, $P$ [kN]")
260
261 # Subplot #2
262 # ----------
263 plt.subplot(grid[1]), plot_params()
(continues on next page)
268 i, j = 2, 0
269 for p in ParamVars:
270 # Subplot #i
271 # ----------
272 plt.subplot(grid[i]), plot_params()
273 plt.plot(outputs["time"], outputs[f"sensDisp_{j+1}"]*p, "-.k", linewidth=1.5,
˓→label="DDM")
288
291
299
303 plt.show()
Two storey steel moment frame with W-sections for displacement-controlled sensitivity analysis
1 """
2 - The source code is developed by Marin Grubišić https://github.com/mgrubisic
3 at University of Osijek, Croatia.
4 - The numerical model with the associated analysis was described in detail by
5 Prof. Michael Scott in the Portwood Digital blog
6 https://portwooddigital.com/2021/01/03/sensitivity-training/
7 - Run the source code in your favorite Python program and should see following plot.
8 """
9
10 import time
11 import sys
12 import numpy as np
13 import matplotlib.pyplot as plt
14 import openseespy.opensees as ops
15
36
43
44 # +===============================================================================+
45 # | Units |
46 # +===============================================================================+
47 inch = 1.0 # define basic units
48 kip = 1.0
49 sec = 1.0
50
51 ft = 12*inch
52 lb = kip/1000
53 ksi = kip/inch**2
54 psf = lb/ft**2
55
60 # +===============================================================================+
61 # | Define some functions |
62 # +===============================================================================+
63
64
65 def run_gravity_analysis(steps=10):
66 """
67 Run gravity analysis (in 10 steps)
68 """
(continues on next page)
83
85 """
86 Run pushover analysis with sensitivity
87 """
88 ops.wipeAnalysis()
89 start_time = time.time()
90 ops.loadConst("-time", 0.0)
91
99 ops.system("BandGeneral")
100 ops.constraints("Transformation")
101 ops.numberer("RCM")
102 ops.test(testType, tolInit, iterInit)
103 ops.algorithm(algorithmType)
104 # Change the integration scheme to be displacement control
105 # node dof init Jd min max
106 ops.integrator("DisplacementControl", ctrlNode, dof, Dincr)
107 ops.analysis("Static")
108 ops.sensitivityAlgorithm("-computeAtEachStep") # automatically compute
˓→sensitivity at the end of each step
109
110 if IOflag:
111 print(f"Single Pushover: Push node {ctrlNode} to {max_disp} {LunitTXT}.\n")
112
125 nodeList = []
126 for node in baseNodes:
127 nodeList.append(f"- ops.nodeReaction({node}, dof) ")
128
139 if IOflag:
140 print(f"Current displacement ==> {ops.nodeDisp(ctrlNode, dof):.3f}
˓→{LunitTXT}")
141
151 if ok != 0:
152 print("\n==> Trying Newton with initial then current...")
153 ops.test(testType, tolInit/0.01, iterInit*50)
154 ops.algorithm("Newton", "-initialThenCurrent")
155 ok = ops.analyze(1)
156 if ok == 0:
157 print("==> that worked ... back to default analysis...\n")
158 ops.algorithm(algorithmType)
159 ops.test(testType, tolInit, iterInit)
160
161 if ok != 0:
162 print("\n==> Trying ModifiedNewton with initial...")
163 ops.test(testType, tolInit/0.01, iterInit*50)
164 ops.algorithm("ModifiedNewton", "-initial")
165 ok = ops.analyze(1)
166 if ok == 0:
167 print("==> that worked ... back to default analysis...\n")
168 ops.algorithm(algorithmType)
169 ops.test(testType, tolInit, iterInit)
170
171 currentStep += 1
172 tCurrent = ops.getTime()
173
181
192
193 # +===============================================================================+
194 # | Define model |
195 # +===============================================================================+
196 # Create ModelBuilder
197 # -------------------
198 ops.wipe()
199 ops.model("basic", "-ndm", 2, "-ndf", 3)
200
237
266 # +===============================================================================+
267 # | Define Sensitivity Parameters |
268 # +===============================================================================+
269 # /// Each parameter must be unique in the FE domain, and all parameter tags MUST be
˓→numbered sequentially starting from 1! ///
276 # https://github.com/OpenSees/OpenSees/blob/master/SRC/material/uniaxial/Steel02.
˓→cpp
286 # +===============================================================================+
287 # | Define nodal loads & Run the analysis |
288 # +===============================================================================+
289 # Create nodal loads at nodes 3 & 5
290 # nd FX FY MZ
291 ops.load(3, 1/3, 0.0, 0.0)
292 ops.load(5, 2/3, 0.0, 0.0)
293
297
298 # +===============================================================================+
299 # | Plot results |
300 # +===============================================================================+
301 rows, columns = len(ops.getParamTags())*2, 1
302 grid = plt.GridSpec(rows, columns, wspace=0.25, hspace=0.25)
303 fig = plt.figure(figsize=(10, 10))
304
308
315
˓→color='grey', alpha=0.15)
339 plt.fill_between(pushover_output["disp"],
340 pushover_output[f"sensLambda_{s-2}"] * ParamVars[s-3], color=
˓→'grey', alpha=0.15)
346 s += 1
347
351 plt.show()
439
OpenSeesPy Documentation, Release 3.5.1.3
440 Bibliography
Index
B G
barrier() (built-in function), 292 geomTransf() (built-in function), 222
basicDeformation() (built-in function), 257 getEleTags() (built-in function), 258
basicForce() (built-in function), 257 getLoadFactor() (built-in function), 259
basicStiffness() (built-in function), 257 getNodeTags() (built-in function), 259
Bcast() (built-in function), 293 getNP() (built-in function), 292
beamIntegration() (built-in function), 113 getNumThreads() (built-in function), 280
block2D() (built-in function), 112 getParamTags() (built-in function), 289
block3D() (built-in function), 112 getParamValue() (built-in function), 289
getPID() (built-in function), 292
C getTime() (built-in function), 259
computeGradients() (built-in function), 289 groundMotion() (built-in function), 110
constraints() (built-in function), 225
convertBinaryToText() (built-in function), 274
I
convertTextToBinary() (built-in function), 274 imposedMotion() (built-in function), 110
InitialStateAnalysis() (built-in function), 275
D integrator() (built-in function), 243
database() (built-in function), 275
domainChange() (built-in function), 294
L
layer() (built-in function), 213
E load() (built-in function), 107
eigen() (built-in function), 244 loadConst() (built-in function), 275
eleDynamicalForce() (built-in function), 258 logFile() (built-in function), 273
eleForce() (built-in function), 258
eleLoad() (built-in function), 108 M
element() (built-in function), 37 mass() (built-in function), 111
eleNodes() (built-in function), 258 mesh() (built-in function), 280
eleResponse() (built-in function), 258 modalDamping() (built-in function), 275
equalDOF() (built-in function), 102 modalProperties() (built-in function), 245
equalDOF_Mixed() (built-in function), 102 model() (built-in function), 37
F N
fiber() (built-in function), 212 nDMaterial() (built-in function), 190
441
OpenSeesPy Documentation, Release 3.5.1.3
S
save() (built-in function), 276
section() (built-in function), 210
sectionDeformation() (built-in function), 272
sectionFlexibility() (built-in function), 272
sectionForce() (built-in function), 271
sectionLocation() (built-in function), 272
442 Index