Abaqus 二次开发 应用实例 |
您所在的位置:网站首页 › vpg载荷二次开发 › Abaqus 二次开发 应用实例 |
目 录
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 部件/Part8.2 属性/Property8.4.1 材料属性8.4.2 截面属性
8.3 装配/Assembly8.4 分析步/Step8.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 相互作用/Interaction8.5.1 创建Tie约束3.5.2 创建MPC约束8.5.3 创建标准接触
8.6 荷载/Load8.6.1 幅值数据表格/Amplitude8.6.2 荷载边界条件8.6.1.1 隐式动力学分析步/集中荷载8.6.1.2 直接稳态动力学分析步/集中荷载
8.6.3 位移边界条件
3.7 网格/Mesh3.8 草图/Sketch3.9 坐标系
九、示例十、Odb 对象10.1 从odb中读取场变量数据
十一、尾声十二、参考文献
Blog Links
DalNur | 博客总目录 Abaqus 二次开发 基本概念 Python 语言创建 Abaqus inp 文件 Abaqus 空间管路 自动化建模与分析 Abaqus 二次开发/建模 教程 HyperMesh 二次开发 教程 ANSYS 参数化建模 实用教程 nCodeDL 疲劳分析 实用教程 Python 二次开发 SAP2000 教程 Python 二次开发 AutoCAD 教程 Python 二次开发 Office 教程 水动力分析 实用教程 一、前言对于用户而言,可以且有价值的 Abaqus 二次开发主要有两种,求解器层次的 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 模型通常包括如下信息:几何形状、单元局部特性、材料数据、荷载和边界条件、分析类型、输出要求等。 建模的过程是把待分析问题的模型图形化的过程,建模的最终目的是生成一个 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 功能实现的过程中,后台程序实时记录用户在 Abaqus/CAE 中各种操作所对应的 Python 语句,并将其记录在当前工作目录下的 abaqus.rpy 文件中,abaqus.rpy 文件是实时更新的,也就是说,在 Abaqus/CAE 中,每完成一步操作,它所对应的 Python 语句都会立即出现在 abaqus.rpy 文件中,用户可以用任何一款文本编剧软件打开 abaqus.rpy 文件,查看操作对应的 Python 语句,并根据自身需要进行修改,这就为 Abaqus 的二次开发提供了很大的便利,只要用户能够在 Abaqus/CAE 中实现某一功能,那么它所对应的 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 PythonReaderPythonReader 软件类似于一个文本查看器,它小巧精炼,以浮动窗口的形式把 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 文件。 有限元软件中未明确具体的单位制,但应保证各单位间协调统一,常用的单位制如下: 质量长度时间力压强/应力能量密度弹性模量kgmsNPaJkg/m3PatmmsNMPaN-mmt/mm3MPa1 k g / m 3 = 1 0 − 12 t / m m 3 1 kg/m^3 = 10^{-12} t/mm^3 1kg/m3=10−12t/mm3 4.2 变量命名为了使二次开发编写的 Python 代码逻辑清晰、易读易解,现对主要变量的命名进行约定,见以下各表。该命名规则为个人习惯,非强制要求。 文件 缩写全拼含义示例iges-iges 文件preprefix名称前缀postpostfix名称后缀 几何(部件)/装配/部件实例 缩写全拼含义示例vpviewport视口mymdb/currmdbmy model database当前引用模型数据库iges-iges 文件skhsketch草图prtpart部件vvertex几何点eedge几何边s/surfsurface geometry几何面ccell几何体 特征 缩写全拼含义示例dtmdatumpldatum plane基准面/参考面 材性 缩写/前缀全拼含义示例matmaterial材料E/eYoung’s modulus杨氏模量nuPoisson ratio泊松比rhoDensity质量密度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: [email protected] ============================= """ 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)文本文件不一定只是 .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) 获取文件内的全部数据注意区分目录、子目录、文件等。 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)这部分没什么卵用,你 Abaqus/CAE 都打开了,鼠标键盘随便动几下,视图就设置好了,费劲吧啦的用 Python 实现视图/视口设置,有病么,赶紧跳过,不看这部分不影响你二次开发。 Session 对象并非模型数据或者结果数据的载体,但是它是模型可视化、结果可视化的完成者。利用 Session 对象 可以完成模型结果的可视化,完成图片的输出,也可以完成数据的可视化。 Session 对象群的主要功能在于可视化, Viewport (视口) 和 View (视图) 对象是最重要的两个成员。Viewport (视口) 对象管理 CAE 软件的各种显示窗口的具体设置:窗口大小、活跃状态、显示内容等。而 View (视图) 对象则是在某一个具体的显示窗口中如何显示,它告诉 Viewport 从什么位置从什么角度观察要显示的内容。 显然,对于工程师而言,二次开发的主要目的是提高建模效率,而不是观察模型,此部分内容可略过,没必要详细研究。 八、Mdb 对象Mdb 模型数据库对象记录了 Abaqus 有限元分析模型和分析设置。所有的分析任务都从建立模型开始。Mdb 对象中存储了几何结构、组装关系、网格划分、材料属性、边界载荷分布以及求解设定的全部信息。 以下读取及创建的材料属性为最通常的各项同性材料,如钢材等。 读取材料属性 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")在模型数据库 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)读取模型数据库 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)(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")在模型数据库 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")在模型数据库 Model-1 中,创建模态分析步 Step-1,模态阶数为 50 。 mdbname = "Model-1" num = 50 create_frequency_step(mdbname, stepname="Step-1", freqnum=num)在模型数据库 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)在模型数据库 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)在模型数据库 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)创建无限元边界的要点: 仅接着无限元的有有限元的几何厚度为网格的2倍。 划分网格时全部切为绿色,首先给内核划分网格。 其次,将边界几何指定为黄色,然后再划分网格。 不想出错,请不要更改次序。 十一、尾声以上便是 Abaqus 二次开发各主要功能实现的简单示例。 根据本文列出的内容和代码,能快速构建起 Abaqus 二次开发的基本框架。 自 2015 年 3 月 22 号开始接触 Abaqus 软件以来,经过多年的不懈努力, 实现了从最初的人肉点鼠标到现在的全自动化建模的跨越。 特此记录,借以总结,同时也能方便后学者。 本文仅用于个人学习,除此之外,无其他任何用途。 因个人水平有限,文中难免有所疏漏,还请各位大神不吝批评指正。 如有疑问、合作需求及推荐工作,请联系邮件联系本人,Email: [email protected] 。 胸藏文墨怀若谷,腹有诗书气自华,希望各位都能在知识的 pāo 子里快乐徜徉。 本文首次发表于 2020-07-20 12:33:03,Beijing 。 本文最后一次更新于 2021-10-01 14:15:17,Beijing 。 欢迎大家点赞、评论及转载,转载请注明出处! 为我打call,不如为我打款! 最后,祝各位攻城狮们,珍爱生命,保护发际线! [1]. ABAQUS Python 二次开发 攻略. 苏景鹤 江丙云 编著. [2]. ABAQUS重启动分析实例. 长安CAE. |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |