目 录
- Blog Links
- 一、前言
- 二、Abaqus有限元分析流程
- 2.1 前处理 (Abaqus/Pre)
- 2.2 模拟计算 (Simulation)
- 2.3 后处理 (Abaqus/Post)
- 三、开发神器
- 3.1 .rpy文件
- 3.2 PythonReader
- 四、单位制与变量命名
- 4.1 单位制
- 4.2 变量命名
- 五、各种库的导入
- 六、文件与时间
- 6.1 获取文件名
- 6.2 读取数据
- 6.3 写入数据
- 6.4 删除文件
- 七、Session 对象
- 八、Mdb 对象
- 8.1 部件/Part
- 8.2 属性/Property
- 8.4.1 材料属性
- 8.4.2 截面属性
- 8.3 装配/Assembly
- 8.4 分析步/Step
- 8.4.1 分析步的创建
- 8.4.1.1 静力通用分析步(Static, General)
- 8.4.1.2 模态分析步(Frequency)
- 8.4.1.3 隐式动力学分析步(Frequency)
- 8.4.1.4 直接稳态动力学分析步 (SSD)
- 8.4.2 设置重启动选项
- 8.4.3 定义输出
- 8.4.3.1 定义场输出
- 8.4.3.2 定义历史输出
- 8.5 相互作用/Interaction
- 8.5.1 创建Tie约束
- 3.5.2 创建MPC约束
- 8.5.3 创建标准接触
- 8.6 荷载/Load
- 8.6.1 幅值数据表格/Amplitude
- 8.6.2 荷载边界条件
- 8.6.1.1 隐式动力学分析步/集中荷载
- 8.6.1.2 直接稳态动力学分析步/集中荷载
- 8.6.3 位移边界条件
- 3.7 网格/Mesh
- 3.8 草图/Sketch
- 3.9 坐标系
- 九、示例
- 十、Odb 对象
- 10.1 从odb中读取场变量数据
- 十一、尾声
- 十二、参考文献
一、前言
求解器层次的 Fortran 和 前后处理层次的 Python 。前者对应用户子程序开发,后者对应用户图形界面程序开发。;Abaqus 用户子程序开发基于 Fortran 语言,用户可以根据实际需求编写材料本构关系 (UMAT/VUMAT)、自定义单元 UEL 等。
用户图形界面开发则基于 Python 语言,主要是根据需求对原有 Abaqus/CAE 功能组件进行扩展,开发专用的前后处理模块及 GUI 工具等。用户子程序的开发影响的是 CAE 分析过程中的求解环节,GUI 开发主要是方便用户根据自身的需求开发前后处理工具或者辅助用户实现参数化的建模及数据处理等工作,其影响的是 CAE 分析过程中的前后处理环节。
大量可重复建模工作适合以二次开发方式实现,其余没必要,老老实实点软件。本文 Abaqus 版本: 6.14-1 。
本文正在更新,最后更新于2022/01/03
三角函数的计算
def cos(x):
# 功能:计算x的余弦值
# 参数:x为角度,单位为度
# 返回:余弦值
import math
pi = math.pi
x = x * pi / 180
cosine = math.cos(x)
return cosine
def sin(x):
# 功能:计算x的正弦值
# 参数:x为角度,单位为度
# 返回:余弦值
import math
pi = math.pi
x = x * pi / 180
sine = math.sin(x)
return sine
二、Abaqus有限元分析流程
Abaqus分析流程
2.1 前处理 (Abaqus/Pre)
建立的 Abaqus 模型通常包括如下信息:几何形状、单元局部特性、材料数据、荷载和边界条件、分析类型、输出要求等。
建模的过程是把待分析问题的模型图形化的过程,建模的最终目的是生成一个 Abaqus 求解器能识别的输入文件即 inp 文件。
inp 文件不是编程语言,只是按照 Abaqus 求解器的计算要求,而形成的输入文件。
Abaqus 输入文件是前处理 (Abaqus/Pre) 和求解器 (Abaqus/Standard) 之间的交流工具,它包含了对分析模型的完整描述。
2.2 模拟计算 (Simulation)
模拟计算即选择适当的求解器求解 inp 文件所确定的数值问题,求解器的求解过程实际上就是求解大型偏微分方程组的过程。
计算速度(解方程的速度)和计算精度是评价有限元软件性能的两个重要方面。
Abaqus/Standard 和 Abaqus/Explicit 就是用来求解大型方程组的求解器。
Abaqus/Standard
Abaqus/Explicit
2.3 后处理 (Abaqus/Post)
后处理一般是由 Abaqus/Post 或其他后处理程序实现的,Abaqus/Post 读入二进制文件,可以用各种各样方式显示结果,如彩色等值线图、动画、应力云图、位移云图及x-y平面绘图等。求解器计算求解后的分析结果主要存储在 .odb, .dat, .res, .fil 文件中。
前处理的最终目的是生成 .inp 文件,求解器根据 inp 文件的有关要求进行求解计算并输出计算结果,后处理根据输出的结果 (.odb文件) 进行数据的二次加工供工程人员参考。前处理及后处理用户起主导作用,计算任务提交后计算机自动完成模拟计算。
三、开发神器
3.1 .rpy文件
为了实现某个功能,用户需在特定的 GUI (图形界面) 中输入相关参数,点击 “OK” 或 “Continue” 按钮后,程序后台将输入参数打包并生成与实现该功能相对应的 Python 语句,该语句会进一步传递给 Kernel 执行,这就是这个实现这个功能的完整流程。
这一条条 Python 语句,就是要发送给内核执行的一条条命令。
abaqus.rpy
Abaqus/CAE records its commands as a Python script in the replay (.rpy) file.
当你开发一些自定义的功能时,通常开始于创建实现这些功能的内核命令 (Python语句) 。这些命令可以通过在 Abaqus /CAE 中命令行接口 (CLI) 中执行来进行调试。一旦从 CLI 中确定内核命令可以准确运行,那么你就可以设计图形用户界面 (GUI) 来收集内核命令所需要的用户输入。
.rpy 文件一般位于 “当前工作目录” 或 “current work directory” 中,一般命名为 abaqus.rpy 。
3.2 PythonReader
PythonReader 软件类似于一个文本查看器,它小巧精炼,以浮动窗口的形式把 rpy 文件的内容显示在当前窗口,使用者可以边操作边学习,非常方便高效。PythonReader 可从 Simwe 论坛 Abaqus 板面内搜索获得。ABAQUS PythonReader 最新版本:1.9.4.101028 .
Step 1. 设置 Abaqus/CAE 的当前工作目录为 M:\HaShen 。
Step 2. 启动 Abaqus/CAE,M:\HaShen 目录内同步出现 abaqus.rpy 文件。
Step 3. 启动 PythonReader,鼠标右键进行配置。
勾选可调整大小的边框
Step 4. 启动 PythonReader,匹配 abaqus.rpy 文件。
四、单位制与变量命名
4.1 单位制
有限元软件中未明确具体的单位制,但应保证各单位间协调统一,常用的单位制如下:
质量 | 长度 | 时间 | 力 | 压强/应力 | 能量 | 密度 | 弹性模量 |
kg | m | s | N | Pa | J | kg/m3 | Pa |
t | mm | s | N | MPa | N-mm | t/mm3 | MPa |
4.2 变量命名
为了使二次开发编写的 Python 代码逻辑清晰、易读易解,现对主要变量的命名进行约定,见以下各表。该命名规则为个人习惯,非强制要求。
文件
缩写 | 全拼 | 含义 | 示例 |
iges | - | iges 文件 | |
pre | prefix | 名称前缀 | |
post | postfix | 名称后缀 |
几何(部件)/装配/部件实例
缩写 | 全拼 | 含义 | 示例 |
vp | viewport | 视口 | |
mymdb/currmdb | my model database | 当前引用模型数据库 | |
iges | - | iges 文件 | |
skh | sketch | 草图 | |
prt | part | 部件 | |
v | vertex | 几何点 | |
e | edge | 几何边 | |
s/surf | surface geometry | 几何面 | |
c | cell | 几何体 |
特征
缩写 | 全拼 | 含义 | 示例 |
dtm | datum | ||
pl | datum plane | 基准面/参考面 |
材性
缩写/前缀 | 全拼 | 含义 | 示例 |
mat | material | 材料 | |
E/e | Young’s modulus | 杨氏模量 | |
nu | Poisson ratio | 泊松比 | |
rho | Density | 质量密度 | |
Abq-1D-Sec- | 1D section | 梁截面 | |
Abq-2D-Sec- | 2D section | 板壳截面 | |
Abq-3D-Sec- | 3D section | 实体截面 |
阿拉伯数字为一级排序,英文字母为二级排序,如 1A、1B、1C、2、3A、3B 等,反之亦可。
五、各种库的导入
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
=============================
Python Version: 2.7.3
Abaqus/CAE 6.14-1
Email: liyang@alu.hit.edu.cn
=============================
"""
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
import regionToolset
import os
六、文件与时间
Abaqus 建模过程中,如荷载时程等数据需由外部文件获得。因此,有必要了解一些简单的关于文件获取的函数,如文本文件中数据的读取,文件名的获取等。
6.1 获取文件名
def get_file_name(dir, ext, pre=None, post=None, remove=True):
"""获取某一文件夹下符合指定拓展名的全部文件名,并根据需求去掉文件名的前后缀。
:param dir: 文件夹路径。
:param ext: 文件拓展名,函数根据该拓展名筛选文件。
:param pre: 文件名前缀,若为None,则获取dir文件夹内全部符合给定拓展名要求的文件名。
:param post: 文件名后缀,暂时不按后缀筛选文件名也没必要。
:param remove: 去掉文件名前后缀选项,若为True,则去掉前后缀。
返回值names为去掉前后缀的文件名列表
"""
names = []
for root, dirs, files in os.walk(top=dir):
tempfnames = files
break
# break保证dir目录内所包含的子目录中的文件名不被迭代。
for fname in tempfnames:
# 根据给定拓展名筛选文件名
extension = os.path.splitext(fname)[1]
if extension == ext:
print(fname)
names.append(fname)
if pre is not None:
# 根据给定前缀名称筛选文件名
tempfnames = []
for fname in names:
l = len(pre)
if fname[:l] == pre:
tempfnames.append(fname)
names = tempfnames
if remove is True:
tempnames = []
for fname in names:
if pre is not None:
l = len(pre)
fname = fname[l:]
if post is not None:
r = len(post)
fname = fname[:-r]
tempnames.append(fname)
names = tempnames
names = sorted(names) # 排序
return names
- 示例
获取 E:\AbqTest\tempLoads 文件目录内,拓展名为 .txt 文件的文件名,文件名称去掉前缀 CRSTIII_160_80Hz_ 及后缀 .txt,remove 设置为 True,返回值 names = [“0.12207”,“0.18311”,. . .],若 remove = False,则忽略 pre 及 post 的设置,函数返回值为由文件全名构成的列表。
directory = r"E:\AbqTest\tempLoads"
names = get_file_name(dir=directory, ext=".txt", pre="CRSTIII_160_80Hz_", post=".txt")
# 获取E:\AbqTest\tempLoads文件夹内所有txt文件的文件名,并去掉前后缀。
print(names)
6.2 读取数据
文本文件不一定只是 .txt 文件,凡是能用记事本开的文件都可视作文本文件,都可用如下函数读取其中的数据,如 .csv 文件、.s2k 文件、.inp 文件、.cdb 文件等等。
def get_file_data(path, row1=1, row2=None):
"""按行读取文件内的数据/读取文件内的第row1行到row2行数据。
:param path: 文本文件的绝对路径。col1,col2,row1,row2
:param rows: 读取txt文件前rows行数据,若为All则全部读取。
返回值data为二维列表,其内的每个子列表为文件内的每一行数据值。
"""
data = []
row1 = row1 - 1
with open(path, 'r') as fr:
lines = fr.readlines()
if row2 is None:
lines = lines[row1:]
else:
lines = lines[row1:row2]
for line in lines:
line = line.strip().split(',') # 删除单行数据间的逗号及尾部的换行符号
data.append(line)
return data
- 示例
获取 E:\HS-Test.csv 文件的第 2 行到第 5 行数据值,即第 2、3、4、5 行数据。
path = r"E:\HS-Test.csv"
data = get_file_data(path, row1=2, row2=5)
print(data)
# data = get_file_data(path) 获取文件内的全部数据
6.3 写入数据
注意区分目录、子目录、文件等。
def create_txt_file(name, data, dir=None):
"""创建文本文件/逐行写入数据源
:param name: 创建的文本文件的名称。
:param data: 写入文本文件中的数据。二维列表,子列表为将写入文本文件内的每一行数据值。
:param dir: 文件保存目录,若为None,则创建的txt文件存储在当前工作目录内。
"""
if dir is None:
dir = os.getcwd() # 当前工作目录
path = dir + "\\" + name
with open(path, "w")as f:
for var in data:
line = []
for i in var:
s = str(i)
line.append(s)
line.append(",") # 数据分割符号
line[-1] = "\n" # 行尾换行符号
f.writelines(line)
print(path)
此函数也可直接创建 csv 文件。CSV (逗号分隔值文件格式)
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV 文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用 WORDPAD 或是记事本来开启,再则先另存新档后用 EXCEL 开启,也是方法之一。
- 示例
将数据 data = [[1,2,3], [4,5,6], [7,8,9], [“ha”,“ha”,“ha”]] 写入到 test.csv 文件中,并将其存储到 E 盘。
data = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
["ha", "ha", "ha"]]
name = "test.csv"
dir = r"E:"
create_txt_file(name, data, dir)
6.4 删除文件
七、Session 对象
这部分没什么卵用,你 Abaqus/CAE 都打开了,鼠标键盘随便动几下,视图就设置好了,费劲吧啦的用 Python 实现视图/视口设置,有病么,赶紧跳过,不看这部分不影响你二次开发。
Session 对象并非模型数据或者结果数据的载体,但是它是模型可视化、结果可视化的完成者。利用 Session 对象 可以完成模型结果的可视化,完成图片的输出,也可以完成数据的可视化。
Session 对象群的主要功能在于可视化, Viewport (视口) 和 View (视图) 对象是最重要的两个成员。Viewport (视口) 对象管理 CAE 软件的各种显示窗口的具体设置:窗口大小、活跃状态、显示内容等。而 View (视图) 对象则是在某一个具体的显示窗口中如何显示,它告诉 Viewport 从什么位置从什么角度观察要显示的内容。
视口及其西南等轴测视图
session.Viewport(name='Viewport: 1', origin=(0.0, 0.0), width=120, height=80) # 创建视口
vp = session.viewports['Viewport: 1'] # 引用视口
vp.makeCurrent() # 设定当前
vp.maximize() # 最大化
executeOnCaeStartup()
vp.partDisplay.geometryOptions.setValues(referenceRepresentation=ON)
myMdb = mdb.models['Model-1'] # 当前引用的模型数据库
显然,对于工程师而言,二次开发的主要目的是提高建模效率,而不是观察模型,此部分内容可略过,没必要详细研究。
八、Mdb 对象
Mdb 模型数据库对象记录了 Abaqus 有限元分析模型和分析设置。所有的分析任务都从建立模型开始。Mdb 对象中存储了几何结构、组装关系、网格划分、材料属性、边界载荷分布以及求解设定的全部信息。
8.1 部件/Part
- 创建梁柱/框架部件
- 创建板壳部件
- 创建实体部件
L = 100 # 土隧模型的长度
prtGD = ["GDSlab", "GDSlabPrf", L] # 轨道板部件信息:部件名称/草图名称/拉伸长度。
prtZC = ["ZCSlab", "ZCSlabPrf", L] # CA砂浆支撑层部件信息:部件名称/草图名称/拉伸长度。
prtTun = ["Tunnel", "TunnelPrf", L] # 隧道部件信息:部件名称/草图名称/拉伸长度。
prtSoil = ["Soil", "SoilPrf", L] # 土体部件信息:部件名称/草图名称/拉伸长度。
prtCutSoil = ["CutSoil", "TunOuterPrf", L] # 切土体部件信息:部件名称/草图名称/拉伸长度。
partInfo = [prtGD, prtZC, prtTun, prtSoil, prtCutSoil]
# 循环创建Part
for var in partInfo:
skh = myMdb.sketches[var[1]]
prt = myMdb.Part(name=var[0], dimensionality=THREE_D, type=DEFORMABLE_BODY)
prt = myMdb.parts[var[0]]
prt.BaseSolidExtrude(sketch=skh, depth=var[2])
- 创建结点集
- 创建单元集
- 创建几何面
- 创建网格面
8.2 属性/Property
Abaqus中的属性模块
8.4.1 材料属性
以下读取及创建的材料属性为最通常的各项同性材料,如钢材等。
- 读取材料属性
def get_material(mdbname):
"""读取已有模型数据库中的材料属
:param mdbname: 模型数据库名称。
返回值mps为材料属性构成的列表,其内元素为列表,其数据结构为
mps = [[材料名称,质量密度,弹性模量,泊松比,alpha,beta,composite,structural],...]
"""
currmdb = mdb.models[mdbname]
matnames = currmdb.materials.keys()
mps = []
for matname in matnames:
rho = currmdb.materials[matname].density.table[0][0] # 质量密度
e, nu = currmdb.materials[matname].elastic.table[0] # 弹性模量、泊松比
try:
damping = currmdb.materials[matname].damping
alpha = damping.alpha # 瑞丽阻尼/质量阻尼系数
beta = damping.beta # 瑞丽阻尼/刚度阻尼系数
comp = damping.composite
stru = damping.structural # 结构阻尼(通常结构阻尼除2为阻尼比)
except:
s = "AttributeError: 'Material: %s' object has no attribute 'damping'" % matname
print(s)
alpha, beta, comp, stru = None, None, None, None
s1 = "Model Name: %s. " % mdbname
s2 = "Materlial Name: %s. " % matname
s3 = "Mass Density: %s. " % rho
s4 = "Young's Modulus: %s. " % e
s5 = "Possion's Ratio: %s. " % nu
s6 = "Alpha: %s. " % alpha
s7 = "Beta: %s. " % beta
s8 = "Composite: %s. " % comp
s9 = "Structural: %s." % stru
s = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9
print(s)
mp = [matname, rho, e, nu, alpha, beta, comp, stru]
mps.append(mp)
return mps
- 示例
读取模型数据库 Model-1 中的全部材料属性,并返回材料属性二元列表 mps ,mps 数据结构为:mps = [[材料名称,质量密度,弹性模量,泊松比,alpha,beta,composite,structural],…] 。
get_material(mdbname="Model-1")
- 创建材料属性
def create_material(mdbname, matname, rho, e, nu, f1=None, f2=None, xi=None, comp=None, stru=None):
"""创建材料属性
:param mdbname: 模型数据库名称。
:param matname: 创建的材料名称。
:param rho: 质量密度。
:param e、nu: 弹性模量和泊松比。
:param f1、f2、xi: 起止频率及阻尼比,用于确定瑞利阻尼系数alpha和beta,其中频率单位为Hz。
:param comp、stru: composite\structural。
"""
currmdb = mdb.models[mdbname]
currmdb.Material(name=matname)
currmdb.materials[matname].Density(table=((rho,),))
currmdb.materials[matname].Elastic(table=((e, nu),))
...
...
...
s1 = "Model Name: %s. " % mdbname
s2 = "Materlial Name: %s. " % matname
s3 = "Mass Density: %s. " % rho
s4 = "Young's Modulus: %s. " % e
s5 = "Possion's Ratio: %s. " % nu
s6 = "Alpha: %s. " % alpha
s7 = "Beta: %s. " % beta
s8 = "Composite: %s. " % comp
s9 = "Structural: %s." % stru
s = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9
print(s)
- 示例 1
在模型数据库 Model-1 中,创建 3 个 材料属性,分别为 Mat-1,Mat-2 和 Mat-3,其中 Mat-1 为无阻尼材料,Mat-2 为瑞利阻尼材料,瑞利阻尼系数由起止频率自动计算得到。Mat-3 为结构阻尼材料。
mdbname = "Model-1"
rho, e, nu = 7850, 2.06e11, 0.3
f1, f2, xi = 1, 80, 0.02
stru = 0.04
matname = "MAT-1" # 无阻尼
create_material(mdbname, matname, rho, e, nu)
matname = "MAT-2" # 瑞利阻尼
create_material(mdbname, matname, rho, e, nu, f1, f2, xi)
matname = "MAT-3" # 结构阻尼
create_material(mdbname, matname, rho, e, nu, stru=stru)
- 示例 2
读取模型数据库 Model-1 中,各材料的材性参数,并修改阻尼系数,即由结构阻尼变更为瑞利阻尼。
mdbname = "Model-1"
mps = get_material(mdbname)
for mp in mps:
stru = mp[-1]
xi = 0.5*stru
matname, rho, e, nu = mp[:4]
create_material(mdbname, matname, rho, e, nu, f1=1, f2=80, xi=None)
8.4.2 截面属性
- 创建1D截面
(1). 创建截面轮廓
(2). 创建梁截面
(3). 创建通用梁截面
- 创建2D截面
def create_shell_section(mdbname, secname, matname, thickness, type="Homogenerous"):
"""创建壳截面
:param mdbname: 模型数据库名称。
:param secname: 创建的壳截面名称。
:param matname: 截面所采用的材料名称。
:param thickness: thickness壳的厚度。
:param type: 创建的壳的类型,Homogenerous为各项同性。
"""
if type == "Homogenerous":
currmdb = mdb.models[mdbname]
currmdb.HomogeneousShellSection(name=secname, preIntegrate=OFF, material=matname,
thicknessType=UNIFORM, thickness=thickness,
thicknessField='', idealization=NO_IDEALIZATION,
poissonDefinition=DEFAULT, thicknessModulus=None,
temperature=GRADIENT, useDensity=OFF,
integrationRule=SIMPSON, numIntPts=5)
s1 = "Model Name: %s. " % mdbname
s2 = "Section Name: %s. " % secname
s3 = "Section Type: Shell Homogenerous. "
s4 = "Material Name: %s. " % matname
s5 = "Thickness: %s." % thickness
s = s1 + s2 + s3 + s4 + s5
# 其余类型截面按需补充
if type == "Composite":
pass
if type == "Membrane":
pass
# 其余类型截面按需补充
print(s)
- 示例
在模型数据库 Model-1 中,创建一名称为 Abq-2D-Sec-1 的各项同性壳截面,截面所采用的材料名称为 MAT-3,壳的厚度为 10 。
mdbname = "Model-1"
secname = "Abq-2D-Sec-1"
matname = "MAT-3"
t = 10
create_shell_section(mdbname, secname, matname, t, type="Homogenerous")
- 创建3D截面
def create_solid_section(mdbname, secname, matname, type="Homogenerous"):
"""创建实体截面
:param mdbname: 模型数据库名称。
:param secname: 创建的壳截面名称。
:param matname: 截面所采用的材料名称。
:param type: 创建的实体截面的类型,Homogenerous为各项同性。
"""
if type is "Homogenerous":
currmdb = mdb.models[mdbname]
currmdb.HomogeneousSolidSection(name=secname, material=matname, thickness=None)
s1 = "Model Name: %s. " % mdbname
s2 = "Section Name: %s. " % secname
s3 = "Section Type: Solid Homogenerous. "
s4 = "Material Name: %s." % matname
s = s1 + s2 + s3 + s4
# 其余类型截面按需补充
print(s)
- 示例
在模型数据库 Model-1 中,创建一名称为 Abq-3D-Sec-1 的各项同性三维实体截面,截面所采用的材料名称为 MAT-2。
mdbname = "Model-1"
secname = "Abq-3D-Sec-1"
matname = "MAT-2"
create_solid_section(mdbname, secname, matname, type="Homogenerous")
8.3 装配/Assembly
- 创建结点集
- 创建单元集
- 创建几何面
- 创建网格面
8.4 分析步/Step
8.4.1 分析步的创建
8.4.1.1 静力通用分析步(Static, General)
def create_static_general_step():
pass
8.4.1.2 模态分析步(Frequency)
def create_freq_step(mdbname, freqnum=10):
# 功能:创建模态分析步
# 参数:mdbname模型数据库的名称,默认为"Model-1";
# 参数:stepname为模态分析步的名称;freqnum为模态阶数
# 返回:无。
currmdb = mdb.models[mdbname]
stepname = "Step-1"
currmdb.FrequencyStep(name=stepname, previous='Initial', numEigen=freqnum)
- 示例
在模型数据库 Model-1 中,创建模态分析步 Step-1,模态阶数为 50 。
mdbname = "Model-1"
num = 50
create_frequency_step(mdbname, stepname="Step-1", freqnum=num)
8.4.1.3 隐式动力学分析步(Frequency)
def create_dynamic_implicit_step(stepname, prestepname, time, subtime=0.001, mdbname="Model-1"):
"""创建隐式动力分析步(用于求解一般的动力学问题)/固定步长
Abaqus中的分析步相当ANSYS中的荷载步,主要区分荷载步、子步和平衡迭代间的关系。
:param stepname: 创建的分析步(荷载步)名称。
:param prestepname: 前一分析步名称,创建的分析步位于该分析步之后。
:param time: time period 分析步总时长。
:param subtime: increment size 荷载子步时长。
:param mdbname: 模型数据库名称。
"""
currmdb = mdb.models[mdbname]
currmdb.ImplicitDynamicsStep(name=stepname, previous=prestepname, timePeriod=time,
maxNumInc=10000, timeIncrementationMethod=FIXED,
initialInc=subtime, nohaf=OFF, noStop=OFF)
outstr = mdbname + " " + stepname
print(outstr)
- 示例
create_dynamic_implicit_step(stepname="Step-1", prestepname="Initial", time=3.5)
8.4.1.4 直接稳态动力学分析步 (SSD)
def create_steady_state_dynamics_direct_step(stepname, prestepname, fre, mdbname="Model-1"):
"""创建直接稳态动力学分析步(直接积分计算/精度高/耗时长)/单个频率值分析
:param stepname: 创建的分析步(荷载步)名称。
:param prestepname: 前一分析步名称,创建的分析步位于该分析步之后。
:param fre: frequency 分析频率值。
:param mdbname: 模型数据库名称。
"""
currmdb = mdb.models[mdbname]
f1, f2 = fre, fre # f1: lower frequency 低频;f2: upper frequency 高频。
currmdb.SteadyStateDirectStep(name=stepname, previous=prestepname,
frequencyRange=((f1, f2, 2, 1.0),))
outstr = mdbname + " " + stepname
print(outstr)
- 示例
create_steady_state_dynamics_direct_step(stepname="Step-2", prestepname="Step-1", fre=40.0391)
8.4.2 设置重启动选项
def set_restart_requests(stepname, frequency=1, overlay=True):
# 功能:设置重启动请求
# 参数:stepname设置重启动所在的分析步;frequency为重启动信息的输出频率,即每隔多少个子步一输出重启动信息
# 参数:overlay为覆盖选项,若为True,则只保存最后一步重启动信息,若为False则每步重启动信息均保存。
# 说明:若frequency=10,则表示每隔10个增量步一输出重启动信息
# 返回:无
currmdb = mdb.models[mdbname]
steps = currmdb.steps
frequency = int(frequency)
if overlay:
steps[stepname].Restart(frequency=frequency, numberIntervals=0, overlay=ON, timeMarks=OFF)
else:
steps[stepname].Restart(frequency=frequency, numberIntervals=0, overlay=OFF, timeMarks=OFF)
8.4.3 定义输出
8.4.3.1 定义场输出
def create_field_output(fieldname, stepname, setname, outvars, mdbname="Model-1"):
"""创建场输出/输出范围为某一集合
:param fieldname: 创建的场输出名称。
:param stepname: 分析步(荷载步)名称。
:param setname: 集合名称。
:param outvars: output variables 输出变量名称,可以为 S,MISES,U,UT,UR,V,VT,VR,A,AT,AR 等。
:param mdbname: 模型数据库名称。
"""
currmdb = mdb.models[mdbname]
region = currmdb.rootAssembly.sets[setname]
currmdb.FieldOutputRequest(name=fieldname, createStepName=stepname, variables=outvars,
region=region, sectionPoints=DEFAULT, rebar=EXCLUDE)
outstr = mdbname + " " + fieldname
print(outstr)
- 示例
create_field_output(fieldname="F-Output-1", stepname="Step-2", setname="Moni-Node-B1F-2",
outvars=["U", "V", "A"])
8.4.3.2 定义历史输出
def create_history_output(historyname, stepname, setname, outvars, mdbname="Model-1"):
"""创建历史输出/输出范围为某一集合
:param historyname: 创建的历史输出名称。
:param stepname: 分析步(荷载步)名称。
:param setname: 集合名称。
:param outvars: output variables 输出变量名称,可以为S,MISES,U,UT,UR,V,VT,VR,A,AT,AR等。
:param mdbname: 模型数据库名称。
"""
currmdb = mdb.models[mdbname]
region = currmdb.rootAssembly.sets[setname]
currmdb.HistoryOutputRequest(name=historyname, createStepName=stepname, variables=outvars,
region=region, sectionPoints=DEFAULT, rebar=EXCLUDE)
outstr = mdbname + " " + historyname
print(outstr)
- 示例
create_history_output(historyname="H-Output-1", stepname="Step-2", setname="Moni-Node-B1F-2",
outvars=["U1", "U2", "U3", "V1", "V2", "V3", "A1", "A2", "A3"])
8.5 相互作用/Interaction
8.5.1 创建Tie约束
def create_tie_constraint(mdbname, tiename, master, slave, tolerance="Default", adjust=True):
"""创建Tie约束
:param mdbname: 模型数据库名称。
:param tiename: 创建的tie约束的名称。
:param master: master surface 主面。
:param slave: slave surface 从面。
:param tolerance: position tolerance 位置容差,若为Default则采用默认设置,也可以指定具体数值。
:param adjust: adjust slave surface initial position 调整从面初始位置,若为True则调整,若为False,则不调整。
"""
currmdb = mdb.models[mdbname]
asm = currmdb.rootAssembly
...
...
...
outstr = mdbname + " " + tiename + " " + master + " " + slave
print(outstr)
- 示例
在模型数据库 Model-1 中,创建 6 个 Tie 约束,position tolerance 设置为15,不调整从面初始位置。
mdbname = "Model-1"
tienum = 6
for i in range(6):
tiename = "Constraint-%s" % (i + 1)
master = "M-Nodes-%s" % (i + 1)
slave = "S-Nodes-%s" % (i + 1)
tolerance = 15
create_tie_constraint(mdbname, tiename, master, slave, tolerance, adjust=False)
3.5.2 创建MPC约束
8.5.3 创建标准接触
8.6 荷载/Load
8.6.1 幅值数据表格/Amplitude
def create_tabular_amplitude(path, mdbname, ampname, col2, col1=1, row1=1, row2=None):
"""创建荷载幅值表格/表格数据来自txt文件/默认txt文件的第一列为幅值表格的第一列
:param mdbname: 模型数据库名称。
:param ampname: 创建的幅值表格的名称。
:param path: txt文件的绝对路径。
:param col1: 读取txt文件的列号,作为幅值表格的第一列数据,计数始于1。
:param col2: 读取txt文件的列号,作为幅值表格的第二列数据,计数始于1。
:param row1: 每列数据的起始行号,即从txt的第几行开始读取数据,计数始于1。
:param row2: 每列数据的结束行号,若为None,则读取到数据的最后一行。
"""
data = []
row1 = row1 - 1
...
...
...
s1 = "Model Name: %s." % mdbname
s2 = "Amplitude Name: %s." % ampname
s3 = "File Path: %s." % path
s = s1 + " " + s2 + " " + s3
print(s) # 提示字符串
- 示例
在模型数据库 Model-1 中,创建幅值表格 Amp-7,Amp-7 中的数据来自 csv 文件 E:\HS-Test.csv,Amp-7 的第 1 列数据为 csv 文件的第 1 列数据的第 7 行到第 18 行,Amp-7 的第 2 列数据为 csv 文件的第 5 列数据的第 7 行到第 18 行。若不指定 row1 及 row2 则读取 csv 文件每一列的全部数据,作为 Amp-7 相应列的数据。
path = r"E:\HS-Test.csv"
mdbname = "Model-1"
ampname = "Amp-7"
create_tabular_amplitude(path, mdbname, ampname, col1=1, col2=5, row1=7, row2=18)
8.6.2 荷载边界条件
8.6.1.1 隐式动力学分析步/集中荷载
def apply_dynamic_implicit_load(loadname, stepname, setname, ampname, cfs=[0, 0, 1],
mdbname="Model-1"):
"""在隐式动力学分析步上施加集中荷载,荷载来自幅值表格。
:param loadname: 荷载名称。
:param stepname: 隐式动力学分析步名称。
:param setname: 加载点集合名称。
:param ampname: 荷载幅值表格名称。
:param cfs: 各方向比例系数。
:param mdbname: 模型数据库名称。
"""
currmdb = mdb.models[mdbname]
region = currmdb.rootAssembly.sets[setname]
currmdb.ConcentratedForce(name=loadname, createStepName=stepname, region=region, cf1=cfs[0],
cf2=cfs[1], cf3=cfs[2], amplitude=ampname, distributionType=UNIFORM,
field='', localCsys=None)
- 示例
apply_dynamic_implicit_load(loadname="Load-L3V-1", stepname="Step-1", setname="Load-Node-L3V-1",
ampname="Amp-7", cfs=[0, 0, 1], mdbname="Model-1")
8.6.1.2 直接稳态动力学分析步/集中荷载
def apply_steady_state_dynamics_direct_load(loadname, stepname, setname, cf1=[0, 0], cf2=[0, 0],
cf3=[0, 0], mdbname="Model-1"):
"""在直接法稳态动力学分析步上施加集中荷载
:param loadname: 荷载名称。
:param stepname: 隐式动力学分析步名称。
:param setname: 加载点集合名称。
:param ampname: 荷载幅值表格名称。
:param cf1: 1方向荷载数值,第一个参数为荷载实部数据,第二个参数为荷载虚部数据。
:param cf2: 2方向荷载数值,第一个参数为荷载实部数据,第二个参数为荷载虚部数据。
:param cf3: 3方向荷载数值,第一个参数为荷载实部数据,第二个参数为荷载虚部数据。
:param mdbname: 模型数据库名称。
"""
currmdb = mdb.models[mdbname]
region = currmdb.rootAssembly.sets[setname]
cf1 = complex(cf1[0], cf1[1])
cf2 = complex(cf2[0], cf2[1])
cf3 = complex(cf3[0], cf3[1])
currmdb.ConcentratedForce(name=loadname, createStepName=stepname, region=region, cf1=cf1,
cf2=cf2, cf3=cf3, distributionType=UNIFORM, field='', localCsys=None)
- 示例
apply_steady_state_dynamics_direct_load(loadname="Load-L3V-1", stepname="Step-2",
setname="Load-Node-L3V-1", cf1=[10, 10], cf2=[20, 20],
cf3=[30, 30], mdbname="Model-1")
8.6.3 位移边界条件
def create_displacement_bc(mdbname, bcname, setname, u1="UNSET", u2="UNSET", u3="UNSET",
ur1="UNSET", ur2="UNSET", ur3="UNSET"):
"""在初始分析步上施加位移边界条件
:param mdbname: 模型数据库名称。
:param bcname: 创建的位移边界条件名称。
:param setname: 前一分析步名称,创建的分析步位于该分析步之后。
:param u1、u2、u3、ur1、ur2、ur3: 若设置0则表示该方向自由度被完全约束。
"""
for var in [u1, u2, u3, ur1, ur2, ur3]:
if var == 0:
var = "SET"
currmdb = mdb.models[mdbname]
asm = currmdb.rootAssembly
region = asm.sets[setname]
currmdb.DisplacementBC(name=bcname, createStepName='Initial',
region=region, u1=u1, u2=u2, u3=u3, ur1=ur1, ur2=ur2, ur3=ur3,
amplitude=UNSET, distributionType=UNIFORM, fieldName='',
localCsys=None)
outstr = mdbname + " " + "Step: Initial" + " " + bcname + " " + setname
# 模型数据库名称/位移边界条件施加的分析步/边界条件名称/结点集合名称
print(outstr)
- 示例
在模型数据库 Model-1 中,创建 4 个 位移边界条件,每个位移边界条件为约束结点集内每个结点全部自由度。
mdbname = "Model-1"
bcnum = 4 # 边界条件个数
bcnames = ["BC-%s" % (i + 1) for i in range(bcnum)] # 边界条件名称
setnames = ["BC-NODES-%s" % (i + 1) for i in range(bcnum)] # 施加边界条件的结点集合名称
for i in range(bcnum):
bcname = bcnames[i]
setname = setnames[i]
u1, u2, u3, ur1, ur2, ur3 = 0, 0, 0, 0, 0, 0
create_displacement_bc(mdbname, bcname, setname, u1=u1, u2=u2, u3=u3, ur1=ur1, ur2=ur2, ur3=ur3)
3.7 网格/Mesh
3.8 草图/Sketch
- create sketch from iges
def create_sketch_from_iges(path, skhname, sf=1.0, mdbname="Model-1"):
"""由iges文件创建草图
:param path: iges文件绝对路径。
:param skhname: 创建的草图名称。
:param mdbname: 模型数据库名称。
:param sf: scale factor 缩放系数。
"""
iges = mdb.openIges(path, msbo=0, trimCurve=DEFAULT, scaleFromFile=OFF,
topology=WIRE, uniteWires=OFF)
currmdb = mdb.models[mdbname]
currmdb.ConstrainedSketchFromGeometryFile(name=skhname, geometryFile=iges, scale=sf)
- 示例
directory = r"E:\AbqTest\sketch"
post = "Prf.iges"
names = get_file_name(dir=directory, ext=".iges", droppost=post) # 去后缀的文件名
# 获取E:\AbqTest\sketch文件夹内所有.iges文件的文件名,并去掉后缀。
for fn in names:
path = directory + "\\" + fn + post
create_sketch_from_iges(path=path, skhname=fn, sf=0.001, mdbname="Model-1")
- create sketch in Abaqus/CAE
skhName = 'SoilPrf' # 草图名称
shtSize = 500 # Approximate size
H, B = 50, 100 # 截面高度和宽度
skh = myMdb.ConstrainedSketch(name=skhName, sheetSize=shtSize)
skh.setPrimaryObject(option=STANDALONE)
skh.rectangle(point1=(-0.5 * B, 0.0), point2=(0.5 * B, -H))
skh.unsetPrimaryObject()
3.9 坐标系
def create_coordinate_system(mdbname, csysname, origin, point1, point2, prtname="Assembly", csystype="Cartesian"):
# 作者:DalNur;邮箱:liyang@alu.hit.edu.cn
# 功能:由给定三点创建坐标系
# 参数:mdbname为模型数据库名称;csysname为创建的局部坐标系名称;
# 参数:prtname为创建坐标系的部件名称,若为Assembly,则在装配层面创建坐标系;
# 参数:csystype为创建的坐标系类型,可以为Cartesian(直角坐标系)、(柱坐标系)和(球坐标系);
# 参数:origin为局部坐标系的原点坐标;point1为位于局部x轴上的任意一点的坐标;
# 参数:point2为位于局部xoy平面上任意一点的坐标,可取局部y轴上的任意一点的坐标。
# 返回:无
if prtname.upper() == "ASSEMBLY":
if csystype.upper() == "CARTESIAN":
# 直角坐标系/笛卡尔坐标系
currmdb = mdb.models[mdbname]
asm = currmdb.rootAssembly
asm.DatumCsysByThreePoints(name=csysname, coordSysType=CARTESIAN, origin=origin,
point1=point1, point2=point2)
else:
pass
# 测试代码
mdbname, csysname = "Model-4", "DalNur-CSYS-1"
origin = [0.0, 0.0, 109.46]
point1, point2 = [1.0, 0.0, 109.46], [0.0, 1.0, 109.46]
create_coordinate_system(mdbname, csysname, origin, point1, point2, prtname="Assembly", csystype="Cartesian")
九、示例
(2021-10-22 13:00:34)
十、Odb 对象
10.1 从odb中读取场变量数据
创建无限元边界的要点:
- 仅接着无限元的有有限元的几何厚度为网格的2倍。
- 划分网格时全部切为绿色,首先给内核划分网格。
- 其次,将边界几何指定为黄色,然后再划分网格。
不想出错,请不要更改次序。