首页/文章/ 详情

FLAC3D与Python的集成 (2)---数据交换至Numpy

1年前浏览5367

1. 引言

FLAC3D与Python的集成 (1)---简述》一文简要描述了如何在FLAC3D环境中使用Python获取模型单元的属性值,在此基础上,本文描述FLAC3D与Python的数据交换过程,具体来说就是如何把FLAC3D的数据传输到Numpy的应用中。此外也将描述如何在FLAC3D中使用py文件以及使用Numpy的数据在matplotlib作图的流程。应当意识到,Python和Numpy并没有增强FLAC3D自身的计算功能,只是通过数据交换扩展了FLAC3D的计算能力,这表现在两方面:一方面Python和Numpy的数据处理能力比FISH语言要快得多,另一方面通过与Pyhton的数据交换,可以在FLAC3D环境下直接进行一些以前我们可能需要使用Tecplot或者Mtalab来作的数据处理。

2. 使用py文件

如同FLAC3D,FLAC,UDEC,3DEC,PFC等软件,既可以使用交互式命令来运行,也可以把一系列命令保存成一个文件批处理运行,IPython也可以交互式使用命令(IPython术语称之为cell)。不过这样做效率太低,使用文件运行更方便一些。

首先在工作目录下建一个空的py文件,比如在这个例子中命名为fitting.py,然后在FLAC3D中新建一个项目(File->New Project), 然后把fitting.py导入到新建的项目(File->Open into Project)中, 如下图所示。

 接下来便可以往这个文件中填写代码了。在IPython中运行py代码需要使用 %run命令,例如%run fitting.py, 按回车即开始运行代码。

3. 试验例子

在fitting.py文件中,首先需要输入关键模块,代码如下图所示。

在这个例子中,我们输入Itasca模块,这是FLAC3D的核心模块;numpy和matplotlib模块是为了作图用的,而random模块为了产生随机数。it.command函数用来封装FLAC3D命令。it.zone.count()函数用来返回整个模型所有的单元数目。


如本文开头所说, 这个例子没有什么实际意义,其目的是演示FLAC3D与Python的数据交换过程。首先我想随机从FLAC3D生成的1000个单元中获取id前101个之中的10个单元,然后对每个单元取出它的(x,y)坐标值。然后把这10对坐标保存在一个列表zone_position中。这个过程使用下面的代码实现。

这段代码的运行结果如下:


此时,我们可以检验一下这段代码运行的结果是否正确,比如想检查一下第72个单元的坐标,使用如下代码

    zone_specific = it.zone.find(72)print(zone_specific.pos())

    得出的结果是 vec3(( 1.500000e 00, 7.500000e 00, 5.000000e-01 ), 比较上面第72个单元的坐标是(1.5,7.5), 二者的结果一样,由此可以说明上面的代码编写正确。


    下面这步就是把FLAC3D的数据传输到Numpy。通过Numpy把zone_position列表中坐标值转化为np的数组, 使用下面的代码

      points = np.array(zone_position)

      至此,我们实现了FLAC3D与Numpy的数据交换,也就是说已经把单元坐标输入到Numpy中进行处理的。

      接下来的代码与FLAC3D已经没有关系了,纯粹是Python的操作。把这10个点画出来,然后用多项式拟合,超出了FLAC3D范围,在此不再唠叨了。

      画出的图形如下所示。

      4. itasca.zone模块的函数

      在这个例子中,我们仅用到了itasca.zone.count()这个函数,其它的函数调用方式与之一样。下面列出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()

        5. itasca.zonearray模块的函数

        itasca.zonearray模块的函数直接与Numpy交互,其使用方法与itasca.zone的使用方法一样。它是通过导入zonearray模块实现的。

          from itasca import zonearray as za

          下面列出所有zonearray模块的函数:

            itasca.zonearray.extra(slot: int)itasca.zonearray.faces() itasca.zonearray.fill_pos(data: array float{zone, 3}) itasca.zonearray.flow() itasca.zonearray.fluid_prop(prop_name: str)itasca.zonearray.gridpoints()itasca.zonearray.ids() itasca.zonearray.in_group(group_name: str, slot="default") itasca.zonearray.live_mechanical() itasca.zonearray.neighbors() itasca.zonearray.overlay_stresses() itasca.zonearray.pos() itasca.zonearray.prop_scalar(prop_name: str, fill_value=0.0)itasca.zonearray.set_extra(slot: int, data: array float{zone} or float{zone, 3})itasca.zonearray.set_fluid_prop(prop_name:str,data:array double{nzone})itasca.zonearray.set_group(membership: array bool{nzone}, group_name: str, slot="default") itasca.zonearray.set_prop_scalar(prop_name: str, array) itasca.zonearray.set_stress(array double{nzone, 3, 3}) itasca.zonearray.set_stress_flat(array double{nzone, 6}) itasca.zonearray.strain() itasca.zonearray.strain_flat() itasca.zonearray.stress() itasca.zonearray.stress_flat() itasca.zonearray.stress_max() itasca.zonearray.stress_min() itasca.zonearray.temperature()

            6. 结束语

            这个笔记借助一个没有实际意义的例子演示了FLAC3D和Numpy的数据交换过程,尽管只演示了单元坐标的交换,事实上其它属性的交换过程是相同的,以后我们将逐渐深入剖析其它知识点的使用方法。Last but not least, 如果感觉这个材料对你有帮助,不妨点个赞,转发一下。

            来源:计算岩土力学
            科普TecplotPFCFLAC3D3DEC材料试验
            著作权归作者所有,欢迎分享,未经许可,不得转载
            首次发布时间:2022-09-27
            最近编辑:1年前
            计算岩土力学
            传播岩土工程教育理念、工程分析...
            获赞 119粉丝 866文章 1721课程 0
            点赞
            收藏
            未登录
            还没有评论

            课程
            培训
            服务
            行家

            VIP会员 学习 福利任务 兑换礼品
            下载APP
            联系我们
            帮助与反馈