首页/文章/ 详情

Update---在FLAC3D中使用Python

2年前浏览1169

1 引言

这个笔记是对大约一年半前《FLAC3D与Python的集成》系列的更新,当时是在FLAC3D 6.0环境下进行的,尽管基本的操作流程和6.0版本相同,但目前的FLAC3D 7.0发生了很大变化,不仅增强了Python的运行环境(Jupyter QtConsole 4.3.1,Python 3.6.1, IPython 6.2.1,matplotlib backend: Qt5Agg), 而且改进了自身的函数功能,因此对过去的笔记作了部分更新。

2 运行设置

FLAC3D集成了IPython的控制台,当进入FLACD3D的运行环境后,从主菜单Panes > IPython Console, 进入到IPython Console。为了建立FLAC3D和Python的联系,首先需要导入itasca模块,itasca模块定义了Python和FLAC3D之间的交互(from itasca import gridpointarray as gpa > gpa.pos())。






















import itasca as itit.command("python-reset-state false")it.command("""program load module 'zone'program load guimodule 'zone'program load module 'body'program load guimodule 'body'program load module 'extruder'program load guimodule 'extruder'program load module 'sel'program load module 'zonesel'program load module 'selpython'program load module 'wallsel'program load guimodule 'sel'program load module 'pfcsel'program load module 'rblocksel'program load module 'dfnzone'program load module 'ballzone'program load module 'zonepython'program load module 'wallzone'""")

所有的FLAC3D都将封装在it.command函数内,python-reset-state false命令能够确保FLAC3D使用New或Restore命令后python变量不会删除。接下来便可以输入FLAC3D命令。









it.command("""model newmodel large-strain offzone create brick size 10 10 10zone cmodel assign elasticzone property density 2950 young 12e9 poisson 0.25cycle 1""")

3 FLAC3D单元(Zone)

单元zone是FLAC3D最基本的几何属性,下面使用Python操作zone的属性。

(1) 使用it.zone.count()函数检查模型单元总数;

(2) 使用it.zone.find命令来返回某个单元对象, z = it.zone.find(1)获取了ID=1的单元对象(it.zone.Zone),以变量z表示;

(3) Zone对象有许多方法,例如z.pos()获得该单元中心点的坐标(itasca.zone.Zone.pos);

(4) 一旦获得了一个对象,本质上可以获得该对象的所有属性,例如: z.id(), z.model(), z.pos()等;

(5) 下面的代码通过对整个模型中所有的单元体积相加来得到整个模型的体积。这个功能非常有用,因为有时我们需要比较模型变形前后的体积变化量。







volume_sum = 0.0for z in it.zone.list():    volume_sum += z.vol()print(volume_sum)print(z.vol() * it.zone.count())assert volume_sum == z.vol() * it.zone.count()

(6) z = it.zone.near((5,5,5))是另一种获取单元对象的方式;

(7) z.props()方法可以返回该单元所有的材料参数; 由于这是一个字典对象,因此也可以单独取出材料参数,例如z.props()['bulk']或z.prop('shear');反过来,可以使用z.set_prop('bulk', 8.5e9)方法进行赋值(itasca.zone.Zone.set_prop)。


必须注意的是,itasca.zone模块是针对整个模型的,而itasca.zone.Zone类是针对特定单元的。下面列出itasca.zone模块所有可使用的函数。这些函数分为两种类型,一种是取值的(get),另一种是赋值的(set),赋值的函数中都有set的字样,很好区别。



































itasca.zone.containing()itasca.zone.count() itasca.zone.create_ratio()itasca.zone.creep_time_total() itasca.zone.creep_timestep() itasca.zone.dynamic_time_total() itasca.zone.dynamic_timestep() itasca.zone.find()itasca.zone.fluid_ratio() itasca.zone.fluid_stress_normal() itasca.zone.fluid_time_total() itasca.zone.fluid_timestep() itasca.zone.fluid_unbal_avg() itasca.zone.fluid_unbal_max() itasca.zone.force_update() itasca.zone.list() itasca.zone.maxid() itasca.zone.mech_convergence() itasca.zone.mech_ratio() itasca.zone.mech_ratio_avg() itasca.zone.mech_ratio_local() itasca.zone.mech_ratio_max() itasca.zone.near(point: vec)itasca.zone.set_creep_time_total(value: float)itasca.zone.set_creep_timestep(value: float)itasca.zone.set_dynamic_time_total(value: float)itasca.zone.set_dynamic_timestep(value: float)itasca.zone.set_fluid_timestep(value: float)itasca.zone.set_thermal_time_total(value: float)itasca.zone.set_thermal_timestep(value: float)itasca.zone.thermal_ratio() itasca.zone.thermal_time_total() itasca.zone.thermal_timestep() itasca.zone.unbal()

如果运行下面的代码: 



zone_maxid = it.zone.find(it.zone.maxid())print(type(zone_maxid))

可以发现, zone_maxid的类型是<class 'itasca.zone.Zone'>,这是一个类,不是一个字典或列表,因此我们必须使用方法来返回或赋予该单元的值。下面是试验的一些例子:








print(zone_maxid.density())print(zone_maxid.geom_test()) print(zone_maxid.id()) print(zone_maxid.vol_deformed()) print(zone_maxid.vol()) print(zone_maxid.type())print(zone_maxid.props())

itasca.zone.Zone 类下的方法非常多,参看【FLAC3D与Python的集成 (4)---zone.Zone类和方法】。

来源:计算岩土力学
pythonFLAC3D材料控制试验
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-11-26
最近编辑:2年前
计算岩土力学
传播岩土工程教育理念、工程分析...
获赞 150粉丝 1102文章 1782课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈