1 引言
免费的二维有限元分析软件ADONIS在V3.50.1(7/16/2022)的基础之上,发布了V3.75.0 (08/15/2022),新的版本增加了与Python的集成,同时修正了javascript setter/getter函数的一些错误。ADONIS在软件设计上,模仿了RS2和FLAC的部分功能,在与Python的集成上模仿了Itasca软件的交互方式。ADONIS的部分应用参看如下链接,本文仅强调了与Python相关的内容。
相关文章,在仿真秀官网搜索:
边坡剪切强度折减分析(Shear Strength Reduction Analysis)
二维有限元分析软件ADONIS新功能评述
ParaView在ADONIS, Plaxis, FLAC3D和3DEC中的应用
二维FEM分析软件ADONIS(V3.50.1)命令流
板桩墙(Sheet Pile Wall)模拟---FEM中的界面元
Ubiquitous节理岩体模拟(Ubiquitous Joint Rock Mass Modelling)
2 模块
Python的安装版本是3.9.13,三个附加安装的模块是numpy, scipy和XlsxWriter。首先需要输入模块:
import adonis as ad
接着可以使用下面3个子模块:
ad.command() #命令
ad.set_path() #修改当前工作路径
adonis.fos() #获得安全系数
3 节点
函数:ad.node.list() 获得节点对象列表
类:itasca.node.ElemNode
对象:
(1) id() 获得节点的ID
(2) pos() 获得节点的位置
(3) disp() 获得节点的位移
(4) unbal() 获得节点的不平衡力
4 单元
函数:adonis.element.list() 获得单元对象列表
类: itasca.element.Element
对象:
(1) id() 获得单元的ID
(2) num_node() 获得与单元相关的节点数
(3) num_gauss() 获得与单元相关的高斯点数
(4) gauss_pos() 获得一个ID单元的高斯点位置,3节点的三角形有1个高斯点,6节点的三角形有3个高斯点
(5) strain() 获得一个ID单元的高斯点应变增量,3节点的三角形有1个高斯点,6节点的三角形有3个高斯点
(6) pp() 获得给定高斯点的单元孔隙压力,3节点的三角形有1个高斯点,6节点的三角形有3个高斯点
(7) prop() 获得给定高斯点的单元属性值,3节点的三角形有1个高斯点,6节点的三角形有3个高斯点
此外还有vect2 Class和vect3 Class两个类。
5 试验
演示的例子用来自动化计算软弱夹层变化的不排干剪切强度对安全系数的影响(T10.py):
代码如下:
import adonis as ad
import xlsxwriter
cu1 = 50000
fos_array = [-1,-1,-1,-1,-1]
coh_ratio_array = [0.2,0.4,0.6,0.8,1.0]
cmd = "material('create','Mohr-Coulomb','matid',2,'matname','Material 2','density',2038,'shear',3.84615e07,'bulk',8.33333e+07,'coh',{coh},'fric',0,'dil',0,'tens',0)"
for i in range(0, 5):
ad.command("""
newmodel()
set('unit','stress-pa')
line('startPoint',0,0,'endPoint',0,20)
line('startPoint',0,20,'endPoint',20,20)
line('startPoint',20,20,'endPoint',40,10)
line('startPoint',40,10,'endPoint',60,10)
line('startPoint',60,10,'endPoint',60,0)
line('startPoint',60,0,'endPoint',0,0)
line('startPoint',6,20,'endPoint',38,4)
line('startPoint',38,4,'endPoint',48,4)
line('startPoint',48,4,'endPoint',54,10)
line('startPoint',8,20,'endPoint',36,6)
line('startPoint',36,6,'endPoint',48,6)
line('startPoint',48,6,'endPoint',52,10)
triangle('elemtype','T3')
discretize('maxedge',1)
segment('id',14,11,'numedge',60)
segment('id',15,12,'numedge',20)
segment('id',16,13,'numedge',15)
triangle('maxedge',1)
set('useNMD','on')
material('create','Mohr-Coulomb','matid',1,'matname','Material 1','density',2038,'shear',3.84615e+07,'bulk',8.33333e+07,'coh',50000,'fric',0,'dil',0,'tens',0)
""")
new_coh = coh_ratio_array[i] * cu1
ad.command(cmd.format(coh=new_coh))
ad.command("""
material('assign','matid',1,'region',42,8)
material('assign','matid',2,'region',42,5)
material('assign','matid',1,'region',42,2)
applybc('xfix','xlim',59.743,61.035,'ylim',-1.499,10.698)
applybc('xfix','xlim',-1.654,0.103,'ylim',-1.499,20.621)
applybc('xyfix','xlim',-1.602,61.035,'ylim',-1.240,0.103)
set('gravity',0,9.8)
solve('fos','fosLBLimit',0.25,'fosUBLimit',2.0,'dispinfodlg','off')
""")
fos_array[i] = ad.fos()