本文摘要(由AI生成):
本文介绍了itasca库中与FLAC3D和Numpy数据交换相关的函数。文中首先列举了与动态时间、流体时间、热传导时间等相关的`itasca.zone`模块函数,接着详细介绍了`itasca.zonearray`模块的函数,这些函数允许与Numpy直接交互,包括获取和设置单元属性、坐标、应力、应变等。最后,作者通过一个示例展示了FLAC3D和Numpy之间数据交换的过程,并鼓励读者点赞和转发以分享这一有用的材料。
《FLAC3D与Python的集成 (1)---简述》一文简要描述了如何在FLAC3D环境中使用Python获取模型单元的属性值,在此基础上,本文描述FLAC3D与Python的数据交换过程,具体来说就是如何把FLAC3D的数据传输到Numpy的应用中。此外也将描述如何在FLAC3D中使用py文件以及使用Numpy的数据在matplotlib作图的流程。应当意识到,Python和Numpy并没有增强FLAC3D自身的计算功能,只是通过数据交换扩展了FLAC3D的计算能力,这表现在两方面:一方面Python和Numpy的数据处理能力比FISH语言要快得多,另一方面通过与Pyhton的数据交换,可以在FLAC3D环境下直接进行一些以前我们可能需要使用Tecplot或者Mtalab来作的数据处理。
如同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, 按回车即开始运行代码。
在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范围,在此不再唠叨了。
画出的图形如下所示。
在这个例子中,我们仅用到了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()
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()
这个笔记借助一个没有实际意义的例子演示了FLAC3D和Numpy的数据交换过程,尽管只演示了单元坐标的交换,事实上其它属性的交换过程是相同的,以后我们将逐渐深入剖析其它知识点的使用方法。Last but not least, 如果感觉这个材料对你有帮助,不妨点个赞,转发一下。