1 引言
Numpy是在Python基础上开发的数值计算工具,主要用来操作数组,许多基于Python的科学计算软件包都使用了Numpy,包括深度学习应用。Itasca软件通过Itasca模块提供了与Numpy数据交换的能力,主要优点表现在两个方面,一方面Numpy的数组处理比内置的FISH语言要快得多,甚至比Python本身的循环处理要快得多,另一方面通过Numpy可以在Itasca软件环境下直接进行数据处理,而不需要使用其它外部工具。很久以前讨论过FLAC3D与Numpy的数据交换【FLAC3D与Python的集成 (2)---数据交换至Numpy】,通过itasca.zonearray模块对单元进行操作。这个笔记简要讨论了PFC与Numpy的数据交换方法。
Numpy的最新版本是1.22.0(12/31/2021),Itasca软件目前使用的版本是1.13.0, 是2018年以前的版本,理论上可以把Numpy升级到目前的最新版本,但由于担心Numpy会受到Python版本的影响导致破坏Itasca模块,因此没有升级。
2 Numpy试验
如果不与Itasca模块交互,则不需要输入Itasca模块(import itasca as it)。在岩土工程中,经常使用的是正态分布和对数正态分布【岩体统计模型---对数正态分布(log-normal distribution)】。正态分布的应用最广泛,其特征是数据对称地分布,而对数正态分布是正偏态分布,在零点附近有很大的尖峰值而且只允许正值,例如剪切强度的统计分布就只能使用对数正态分布(Lognormal)或Gamma分布,因为这些分布只定义为正值,确保随机生成的剪切强度值总是正值。下面显示的是在Itasca环境下产生的正态分布图(numpy.random.normal)和对数正态分布图(numpy.random.lognormal)。
其它几种常用的概率分布形式使用下面的函数产生:
numpy.random.uniform
numpy.random.exponential
numpy.random.gamma
numpy.random.beta
numpy.random.triangular
3 ballarray方法和属性
Itasca模块的数组接口不是处理单个ball对象,而是利用Numpy的数组处理所有ball的属性和特性【PFC 之 attribute & property】,接口通过调用ballarray子模块实现。
from itasca import ballarray as ba
一旦产生了ball的集 合,便可以使用ba实例对其操作,包括方法和属性:
ba.create
ba.damp
ba.density
ba.disp
ba.euler
ba.extra
ba.fill_damp
ba.fill_density
ba.fill_disp
ba.fill_euler
ba.fill_force_app
ba.fill_force_contact
ba.fill_force_unbal
ba.fill_mass
ba.fill_mass_real
ba.fill_moment_app
ba.fill_moment_contact
ba.fill_moment_unbal
ba.fill_pos
ba.fill_radius
ba.fill_spin
ba.fill_vel
ba.force_app
ba.force_contact
ba.force_unbal
ba.ids
ba.in_group
ba.mass
ba.mass_real
ba.moment_app
ba.moment_contact
ba.moment_unbal
ba.pos
ba.radius
ba.set_damp
ba.set_density
ba.set_disp
ba.set_euler
ba.set_extra
ba.set_force_app
ba.set_force_contact
ba.set_group
ba.set_moment_app
ba.set_moment_contact
ba.set_pos
ba.set_radius
ba.set_spin
ba.set_vel
ba.spin
ba.vel
4 ballarray应用
下面显示了ba的简单应用。
(1) ba.radius()---用来获取所有ball的半径radii,如果ball的半径不一样,可以使用上面讨论的分布形式作出ball大小的分布概率分布图。
(2) it.ball.count---用来获取所有ball的数目。
(3) ba.set_radius(radii)---以set_开头的方法用来把新的数值返回到PFC,假如要把所有球的半径缩小至原来的75%,并更新其半径值。
radii *= 0.75
ba.set_radius(radii)
radii = ba.radius()
(4) ba.pos()---用来获取所有ball的位置[positions = ba.pos()],ba.radius()是一个一维数组,而ba.pos()是一个三维数组。如果需要获得每个轴上的一维坐标,使用代码:
x, y, z = positions.T
(5) ba.set_force_app(force)---用来把对每个ball施加力,这首先通过ba.pos()获取每个ball的位置,然后一个新的数组force,最后把力施加到每个ball上。
force = -5e-3 * (positions.T/np.linalg.norm(positions,axis=1)).T
ba.set_force_app(force)
(6) Ballarray模块使用ba.create可以用来快速创建模型中的球。这个方法的第一个参数是一维的半径数组,第二个参数是二维或三维的位置数组。此外,该函数还接受可选的参数,允许指定所创建的球的属性和特性。
ba.create(brad,bpos,density=bdens,damp=0.7,
props={'kn':1e4,'ks':1e4,'myprop':'george'})
5 参考文档
(1) Using SciPy and Other Third-party Python Packages
(2) Array Style Programming with PFC and NumPy
(3) Modeling Flow in Porous Media with Darcy’s Law
(4) UCS Test With Imported Geometry