近期因为课题要求,作者开始学习并使用OpenSees进行有限元时程分析。OpenSees已经被非常多研究人员和工程师使用了,网上有相当多这类教程,如董瀚林、DinoChen,他们的博客对我的学习帮助很大。在学习过程中,我感觉到OpenSees分析,不管是静力分析还是动力分析,都基本遵循一套固定的流程。因此,我想把时程分析的一些步骤都记录下来,也算是记录一下OpenSees的学习体会。
安装非常简单,从官网下载压缩包,这里提供3.3.0版本的下载地址。下载后解压即可。
为了方便以后使用OpenSees,强烈建议将OpenSees添加到环境变量中。Windows系统下,在刚才解压的目录内找到OpenSees.exe并记录其所在路径,如我的路径是D:\Program Files\OpenSees3.3.0-x64.exe\bin,然后打开系统的环境变量设置(Windows设置->系统->系统信息->高级系统设置->高级->环境变量),然后在下方的系统变量里选定Path,点击编辑,在打开的页面中新建一个path,输入刚才记录的路径,一路确定保存。

打开命令提示符或者PowerShell,输入opensees,即可进入OpenSees的命令行界面。如果提示错误,说明环境变量没有设置正确。使用命令行运行每输入一步就要回车运行一步,不推荐这种方式进行分析,出错后不容易修改。

OpenSees可以运行tcl文件,我们可以将命令全部写到tcl文件中再统一运行,出错了也方便修改。推荐使用VScode编辑tcl文件,可以安装代码高亮插件OpenSees Language和运行插件Code Runner,Code Runner需要进行设置。
打开插件设置

找到并勾选这三个选项

找到并点击Edit in settings.json

在json文件找到这个位置并添加
".tcl": "cd $dir && opensees $filename",

然后大功告成,可以直接在VScode中点击右上角按钮运行tcl文件。
首先是要对分析对象进行建模,建模是指定义节点、给节点添加质量、定义材料、定义单元截面、定义单元。然后设置记录器,指定你想要在分析过程中记录的信息,如记录节点1的位移。最后是设置分析模型,指定进行动力分析的参数的方法等。
该例子创建了下图所示的模型。

wipe;
model BasicBuilder -ndm 2 -ndf 3; # 二维三自由度模型
# 定义节点
node 11 0. 0.; # 第一个参数是节点编号,第二第三个参数是坐标
node 21 0. 1.;
fixY 0. 1 1 0; # 约束位于地面的节点
# 给节点添加质量
mass 21 100. 0.0 0.0; # 第一个参数是节点编号,后面三个参数分别对应三个自由度方向的质量
# 定义材料(关于材料的参数请查询官网https://opensees.berkeley.edu/wiki/index.php/UniaxialMaterial_Command)
set matID 1;
uniaxialMaterial Concrete01 $matID -4.0 -0.002 0.0 -0.005; # 第一个参数是材料编号
单元的截面为四边形纤维截面,如下图所示。

# 定义单元截面
set secID 1;
set h 5.; # 截面高度
set b 5.; # 截面宽度
set fiberX 3; # x向纤维数量
set fiberY 3; # y向纤维数量
section fiberSec $secID {
patch quad $matID 3 3 -$b -$h $b -$h $b $h -$b $h; # 四边形截面
}
# 定义单元
set elemID 11;
set nodeI 11;
set nodeJ 21;
set np 5; # 高斯积分点
set transfID 1;
geomTransf PDelta $transfID; # 定义坐标转换
element nonlinearBeamColumn $elemID $nodeI $nodeJ $np $secID $transfID; # 非线性梁柱单元
模型建立完成后,可以使用以下命令进行时程分析。
# 设置记录器
recorder Node -file Node.out -time -node 21 -dof 1 disp; # 输出时间和节点21在自由度1方向的位移
# 设置分析模型
## 设置工况
set GMdirection 1; # 地震动施加方向
set loadID 400;
set GMfatt 9.8; # 地震动乘以一个系数
set GMdt 0.01; # 地震动时间步长
set AccelSeries "Series -dt $GMdt -filePath GM.txt -factor $GMfatt"; # 读取地震动
pattern UniformExcitation $loadID $GMdirection -accel $AccelSeries; # 施加激励
## 设置求解器
set Nsteps 1000; # 总步数
set dt 0.01; # 分析步长
constraints Transformation; # 约束方法
numberer Plain; # 编号方法
system UmfPack; # 结构体系
test EnergyIncr 1e-4 10; # 收敛条件
algorithm Newton; # 求解非线性方程方法
integrator Newmark 0.5 0.25; # 数值积分方法
analysis Transient; # 动力分析
analyze $Nsteps $dt; # 执行分析
程序运行的结果如下

本文出现的代码可在此处下载。

[1] https://blog.csdn.net/Lzn_nzL/article/details/117875509
[2] http://www.hanlindong.com/2017/opensees-bootstrap/#%E5%8D%95%E8%87%AA%E7%94%B1%E5%BA%A6%E4%BD%93%E7%B3%BB%E7%9A%84%E5%9C%B0%E9%9C%87%E5%93%8D%E5%BA%94
[3] http://www.hanlindong.com/2020/opensees-how-to-realize/
[4] https://opensees.berkeley.edu/wiki/index.php/Patch_Command