找回密码
 注册
Simdroid-非首页
查看: 12881|回复: 288

[二次开发] python作abaqus二次开发的一点经验(包含一个xfem例子)

[复制链接]
发表于 2015-3-4 14:17:54 | 显示全部楼层 |阅读模式 来自 北京
本帖最后由 wufan3924 于 2015-3-5 08:26 编辑

python作二次开发有一段时间了,越用越觉得其方便,好用。分享一点自己的经验,希望对大家有所帮助。

python是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。
1.   文本编辑器
优秀的文本编辑器有很多,但是个人认为最顺手的是Sublime Text,特别是对于python语言来说,用网上的一句话概括——Sublime Text,性感无比的代码编辑器,程序员必备神器!
工欲善其事,必先利其器。Abaqus是有限元分析的利器,python是Abaqus建模和后处理的利器,而SublimeText就是python代码编辑的利器
         它小巧干净,界面清爽,速度超快,灵活稳定。
语法高亮,自动补全,代码折叠,自定义皮肤,多便笺页……你能想到的关于编辑器的功能它都有。还有你想不到的功能——代码地图、多界面布局、多行选择和编辑、随心所欲的跳转、集所有命令于一身的命令面板、丰富无比的插件等等。
当然,最最重要的是——漂亮


file:///C:/Users/wangtao/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
         如何配置?对于python语言,几乎不用你去配置,默认各种支持,直接打开编辑器,敲代码,运行,一气呵成,没有比这更爽的了。当然,如果你是高玩or码神,直接百度sublime text配置,估计你会徜徉其中,不能自拔。
另外值得一提的是,Sublime Text跨平台支持Win/Mac/Linux。
对于abaqus的python编程,sublime还有一大优点不得不提,那就是实时自动更新文件。Abaqus会记录每一个cae界面操作中的python指令,存储在工作目录的abaqus.rpy文件中,这就为我们提供了一个快速学习abaqus的python脚本的方式——一边操作cae,一边查看rpy文件,而sublime的自动更新可以让我们方便的查看文件更新,真是为abaqus的 python量身定做的功能啊。

2.   好用的python
Python的强大,在于其五花八门、功能强大的各种函数库。各种函数信手拈来,使得你就像一个开挂的武林高手一样,举手投足之间,各种绝世武功频出,轻松解决一个个难题。
数值计算库——NumPy和SciPy。有了它们,matlab该哭了。
符号计算库——Sympy。
绘图与可视化——matplotlib。
关于各种库的详细介绍和使用方法自行百度orgoogle之。
其实我觉得有了NumPy和SciPy,对于abaqus的python编程就够了,更复杂的功能和库就要看实际的需要再进一步的取学习了,简单的数学函数掌握好还是很有必要的。
MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:
● 首先,MATLAB是一款商用软件,并且价格不菲。而Python完全免费,众多开源的科学计算库都提供了Python的调用接口。用户可以在任何计算机上免费安装Python及其绝大多数扩展库。
● 其次,与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。

● 最后,MATLAB主要专注于工程和科学计算。然而即使在计算领域,也经常会遇到文件管理、界面设计、网络通信等各种需求。而Python有着丰富的扩展库,可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。


下面给出matlab中的常用函数的各种pythonnumpy库的替代,看来matlab真该哭了。

  
MATLAB
  
numpy.array
numpy.matrix
说明
numel(a)
size(a) or a.size
得到数组中元素的个数
size(a)
shape(a) or a.shape
得到矩阵的“size”
[1 2 3;4 5 6]
array([[1.,2.,3.],
  [4.,5.,6.]])
mat([[1.,2.,3.],
  [4.,5.,6.]])
2x3 矩阵逐一赋值
[a b;c d]
vstack([hstack([a,b]),hstack([c,d])])
bmat('a b;c d')
通过矩阵块a,b,c,d构建矩阵
a(end)
a[-1]
a[:,-1][0,0]
得到一维矩阵的最后一个元素
a(2,5)
a[1,4]
数组a的第2行,第5列元素
a(2,
a[1] or a[1,:]
数组a的第2行
a(1:5,:)
a[0:5] or a[:5] or a[0:5,:]
数组a的前5行
a(end-4:end,:)
a[-5:]
数组a的最后5行
a(1:3,5:9)
a[0:3][:,4:9]
取矩阵的1-3行,5-9列
a([2,4,5],[1,3])
a[ix_([1,3,4],[0,2])]
取矩阵的2,4,5行,1,3列
a(3:2:21,:)
a[ 2:21:2,:]
取矩阵的所有列,从第三行开始,每隔2行取一行,直到21行
a(1:2:end,:)
a[ ::2,:]
所有列,从第一行开始,隔行取
a(end:1:1,:) or flipud(a)
a[ ::-1,:]
行倒序,所有列
a.'
a.transpose() or a.T
a的转置
a'
a.conj().transpose() or a.conj().T
a.H
a的共轭转置
a * b
dot(a,b)
a * b
矩阵乘法
a .* b
a * b
multiply(a,b)
矩阵对应元素乘法
a./b
a/b
矩阵对应元素的除法
a.^3
a**3
power(a,3)
矩阵每个元素的幂乘
(a>0.5)
(a>0.5)
矩阵中元素是否大于0.5(a_ij>0.5)
find(a>0.5)
nonzero(a>0.5)
找到(a > 0.5)的元素的位置
a(:) = 3
a[:] = 3
矩阵赋值
y=x
y = x.copy()
矩阵赋值
1:10
arange(1.,11.) or  r_[1.:11.] or r_[1:10:10j]
mat(arange(1.,11.))  or r_[1.:11.,'r']
创建一个1-10的行向量
0:9
arange(10.)or r_[:10.]  or r_[:9:10j]
mat(arange(10.))or r_[:10.,'r']
创建一个0-9的行向量
[1:10]'
arange(1.,11.)[:,newaxis]
r_[1.:11.,'c']
创建一个1-10的列向量
zeros(3,4)
zeros((3,4))
mat(...)
3x4的零矩阵
zeros(3,4,5)
zeros((3,4,5))
mat(...)
3x4x5的零矩阵
ones(3,4)
ones((3,4))
mat(...)
3x4的全1矩阵
eye(3)
eye(3)
mat(...)
3x3 单位阵
diag(a)
diag(a)
mat(...)
矩阵a的对角线元素组成的向量
rand(3,4)
random.rand(3,4)
mat(...)
3x4的随机矩阵
[a b]
concatenate((a,b),1)hstack((a,b))  column_stack((a,b)) c_[a,b]
concatenate((a,b),1)
连接a,b,按列连接
[a; b]
concatenate((a,b))  vstack((a,b)) r_[a,b]
concatenate((a,b))
连接a,b(按行连接)
max(max(a))
a.max()
a的最大元素
max(a)
a.max(0)
矩阵a每列的最大元素
max(a,[],2)
a.max(1)
矩阵a每行的最大元素
max(a,b)
maximum(a, b)
比较a,b,返回它们的最大值
norm(v)
sqrt(dot(v,v))
linalg.norm(v)
向量v的L2范数
inv(a)
linalg.inv(a)
方阵a的逆矩阵
pinv(a)
linalg.pinv(a)
矩阵a的伪逆矩阵
rank(a)
linalg.matrix_rank(a)
矩阵a的秩
a\b
linalg.solve(a,b)
方程a x = b 的解
b/a
Solve a.T x.T =  b.T instead
方程x a = b 的解
[U,S,V]=svd(a)
U, S, Vh = linalg.svd(a), V = Vh.T
a的奇异值分解
[V,D]=eig(a)
D,V = linalg.eig(a)
矩阵a的特征值和特征向量
[V,D]=eig(a,b)
V,D = Sci.linalg.eig(a,b)
矩阵a,b的特征值和特征向量
[Q,R,P]=qr(a,0)
Q,R=Sci.linalg.qr(a)
mat(...)
QR 分解
[L,U,P]=lu(a)
L,U = Sci.linalg.lu(a)
mat(...)
LU 分解
fft(a)
fft(a)
mat(...)
a的傅里叶变换
ifft(a)
ifft(a)
mat(...)
a的逆傅里叶变换
更多的numpy和matlab函数的关系见http://wiki.scipy.org/NumPy_for_Matlab_Users。上面的表格也是来自这个网址的。

3.   如何学习abaqus python编程
         练习,尽量多的做例子,这个道理大家都懂。
如何快速的入门,并成为砖家?个人经验:充分利用abaqus.rpy文件。这个文件前面已经提到了一点,他会实时记录你在cae中的操作,然后呢,你可以拷贝出来,为我所用。简言之,自动生成代码,而且生成的代码还比较简洁,很方便利用。我现在基本就是打开一个cae界面,同时打开abaqus.rpy文件,然后一边界面操作,一边提取代码,一次操作之后,就可以放弃cae了,之后的更改基本上是在代码中进行了。
上面是关于用python进行建模和前后处理的。
那么gui界面的定制呢?找一个相对完整的例子,在这个例子的基础上,照葫芦画瓢,模仿,一点一点的修改,一点一点的熟悉,基本上可以定制出自己想要的gui界面了,你甚至可以把abaqus的界面改的面目全非,只要你喜欢。

还有一点,需不需要完整的学习python语法。我是没有学,如果你有精力,可以尽情的学,python是一个非常有魅力,非常美的语言,多学点没什么坏处。我是懒癌加身,除非必要,是能不学就不学。对于abaqus的应用,就我目前的水平,python的简单语法了解了就足够了。


暂时先写到这儿,以后有想到什么再补充。欢迎大家讨论,批评!



评分

3

查看全部评分

 楼主| 发表于 2015-3-4 14:34:10 | 显示全部楼层 来自 北京
Simdroid开发平台
本帖最后由 wufan3924 于 2015-12-11 15:02 编辑

在二楼放一个例子吧

先是step by step 在abaqus中建模,用xfem方法进行断裂分析的。然后是实现这个例子的完整的python代码,这个例子是abaqus帮助文档中,I,II型混合裂纹的例子。我做了一些中文注释。

用python脚本创建一个完整的扩展有限元模拟断裂问题的算例。
本算例的示意图如下图所示,一个平板边缘有一个裂缝,高H=6m,长L=3m,裂缝长Lc=1.5m。

材料参数见下表:
  
杨氏模量(E
  
210.0  GPa
泊松比(v
0.3
最大主应力
220  MPa
断裂能
42200  N/m
Power-law指数
1.0


先在Abaqus cae中建模,过程如下:
1.        创建模型,删除原有模型
【Model】-【Creat】
Name: mixed_mode_2d,【ok】
【Model-1】-【右键】-【Delete】见下图。
2.        创建平板部件
{Part} 【Part】-【Creat】-【2D Planar】-【Deformable】-【Shell】
Name:plate,Approximate size:6.0。【Continue】,画一个矩形,两端点为(0,-3),(3,3),见下图【Done】。
3.        创建裂缝部件
{Part}【Part】-【Creat】-【2D Planar】-【Deformable】-【Wire】
Name:crack,Approximate size:6.0,【Continue】,画一条线,两端点为(0,0.05),(1.5,0.05),见上图【Done】。

4.        创建一些集合
{Part 或 Property} 【Tool】-【Set】-【Creat】
Name:All,【Continue】,选择整个平板部件
{Part 或 Property} 【Tool】-【Set】-【Creat】
Name:bottom,【Continue】,选择平板部件的下面的边
{Part 或 Property} 【Tool】-【Set】-【Creat】
Name:top,【Continue】,选择平板部件的上面的边

5.        定义材料和截面属性
先定义材料:
{Property} 【Material】-【Creat】
Name:elas
【Mechanical】-【Elasticity】-【Elastic】输入杨氏模量和泊松比
【Mechanical】-【Damage for traction-spearation law】-【Maxps Damage】,输入最大主应力。
【Suboption】-【Damege Evolution】,输入损伤演化准则
【Suboption】-【Damege Stabilization cohesive】,输入粘性正则化参数
创建截面属性:
{Property} 【Section】-【Creat】-【Solid】-【Homogeneous】,name:solid,-【continue】

6.        赋给材料和方向
{Property} 【Assign】-【Section】,选择平板,【Done】
{Property} 【Assign】-【Material Orientation】,选择平板,【Done】-【Use Default Orientation or other Method】

7.        划分网格
{Mesh}【Mesh】-【Control】-【Quad】-【Structured】
{Mesh}【Mesh】-【Element Type】- CPE4,选择平面应变4节点单元
{Mesh}Seed-Edge】,选择下面的边,布置30个单元
{Mesh}【Seed】-【Edge】,选择右面的边,布置60个单元

8.        装配模型
{Assembly} 【Instance】-【Creat】,装配plate
同理装配crack。

创建参考点,以用于建立约束关系并施加边界条件。
【Tools】-【Reference Point】,选择右下角的点,创建参考点RP-1。在模型树中将参考点改名为db。

9.        建立约束关系
{interaction} 【Constraint】-【Creat】-【Equation】,name:ce_bot。设置参考点和平板底边的约束关系。
10.     创建分析步,设置输出
采用一般静态分析步。
{Step}【Step】-【Creat】-【Static,General】,name:Static,进入edit step对话框,设置总的分析时间为1s,设置初始时间增量,时间增量,最大时间增量等参数。

11.     施加载荷和边界条件
这里只需要施加位移边界即可。
{Load} 【BC】-【Creat】,命名,选择分析步和边界条件类型,【Continue】,在弹出的界面中输入对应的位移边界条件的数值。三个边界条件的类型相同,设置方法也相同。设置的界面如下图所示:

12.     定义扩充区域和初始裂缝
这是扩展有限元法的比较重要的一步。
{Interaction} 【Special】-【Crack】-【Creat】,命名,选择类型为【XFEM】-【Continue】,选择扩充区域为整个平板,选择【Crack Location】为裂缝部件,定义接触属性(里面可以什么都不设置)并指定给裂缝。

13.     创建Job并提交计算
{Job} 【Job】-【Creat】

Abaqus cae中相对应的建模及提交计算的python 脚本如下:(#后面是注释的语句)
1导入必要的模块,设置一些参数

2创建模型和视图设置

3创建平板部件和裂缝部件

4创建一些基于几何部件的set

5定义材料和截面属性并赋给部件
定义材料,设置材料参数,定义截面属性,将材料赋给部件,定义材料方向
材料的定义对于使用扩展有限元法也很重要,因为我们要计算的是断裂问题,所以除了一般线弹性计算的杨氏模量和泊松比外,还需要设置断裂准则。

6、网格控制和单元划分
设置网格类型,单元剖分技术,网格种子等
Crack部件不需要划分网格,因为它不是计算的求解区域,只是提供了初始裂缝的位置信息,用于计算其他节点的levelset值。

7、装配部件
创建参考点和基于装配体的set,以用于施加边界条件。

8、创建约束方程
创建参考点和几何之间的约束方程,从而可以用参考点来控制几何部件。

9创建分析步,设置输出变量
创建一般静态分析步,由于扩展有限元方法收敛较困难,更改分析步设置以调整收敛的要求,主要是将原本的5次迭代不收敛即结束计算更改为20次迭代不收敛再退出计算。
设置输出变量,为了后处理显式的观察裂缝,需要输出节点的level值,也就是输出变量中的PHILSM,STATUSXFEM输出可以观察扩展有限元的单元状态(是否扩充),这两个变量的输出对扩展有限元计算是很有必要的。

10、设置边界条件
边界条件为平板的上下两边沿相反的方向运动,上面的边向左上方运动,下面的边沿右下方运动。

11定义初始裂缝和扩充
这个是使用扩展有限元法的关键步骤,需要设置扩充区域——即裂缝可以扩展的区域,以及裂缝面的接触和初始裂缝面的位置等。

12创建Job并提交计算
拷贝上面的代码,保存到一个.py为后缀的文件中,保存。在abaqus的界面中,【File】-【Run Script】,运行代码,可以直接建模并提交计算,计算完成后可以通过abaqus viewer查看计算的结果。

13、通过python脚本控制后处理的显示
可以通过python脚本文件可以控制显示的参数设置,下面是几个简单的设置。保存代码到一个文件中,在abaqus cae中运行这个脚本文件既可以查看上面的模型的结算结果。

计算结果如下:
下面是不同时刻(载荷历程,与载荷成正比)的mises应力云图和裂缝的扩展云图。


回复 14 不支持 0

使用道具 举报

发表于 2016-12-7 21:30:32 | 显示全部楼层 来自 亚太地区
wufan3924 发表于 2015-4-24 08:23
我补充上传了python代码,在二楼,你下载下来运行一下就可以得到cae文件了,write inp就可以得到inp文件 ...

python 代码在哪里下载,我看的怎么都是图片
回复 2 不支持 0

使用道具 举报

发表于 2015-3-4 16:02:42 | 显示全部楼层 来自 北京
好贴!不过能否修正一下图片链接~

赞100个!
回复 不支持

使用道具 举报

 楼主| 发表于 2015-3-5 08:36:02 | 显示全部楼层 来自 北京
吴聊SP 发表于 2015-3-4 16:02
好贴!不过能否修正一下图片链接~

赞100个!

已经修正了。
回复 不支持

使用道具 举报

发表于 2015-3-13 08:56:38 | 显示全部楼层 来自 法国
学习了,好贴应该顶
回复 不支持

使用道具 举报

发表于 2015-3-13 12:06:36 | 显示全部楼层 来自 天津
楼主Python用的真是厉害啊 学习了 希望楼主以实例分享更多的经验 谢谢了
回复 不支持

使用道具 举报

发表于 2015-3-14 14:32:20 | 显示全部楼层 来自 美国
给楼主32个赞
回复 不支持

使用道具 举报

发表于 2015-3-17 16:26:58 | 显示全部楼层 来自 江苏南京
谢谢楼主的分享
回复 不支持

使用道具 举报

发表于 2015-3-17 17:44:01 | 显示全部楼层 来自 安徽
谢谢楼主,赞!赞!
回复 不支持

使用道具 举报

发表于 2015-3-17 19:35:21 | 显示全部楼层 来自 陕西西安
感谢楼主分享~~
回复 不支持

使用道具 举报

发表于 2015-3-17 22:08:59 | 显示全部楼层 来自 北京
sublime 果然优美、强大!
回复 不支持

使用道具 举报

发表于 2015-3-18 09:09:32 | 显示全部楼层 来自 天津
这个有用~
回复 不支持

使用道具 举报

发表于 2015-3-18 17:03:42 | 显示全部楼层 来自 江苏南京
好啊
学习啦
回复 不支持

使用道具 举报

发表于 2015-3-19 09:43:03 | 显示全部楼层 来自 湖北武汉
楼主太牛了,但是有些步骤还是有点模糊,可否发个inp或者cae文件于我,我的邮箱是1007947846@qq.com
回复 不支持

使用道具 举报

发表于 2015-3-19 09:55:38 | 显示全部楼层 来自 陕西西安
楼主  这个问题你有遇到过吗?可否帮忙看看~http://xiaozu.renren.com/xiaozu/193402/359189116
回复 不支持

使用道具 举报

发表于 2015-3-28 21:43:02 | 显示全部楼层 来自 天津
必须赞一个
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 19:39 , Processed in 0.059351 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表