首页/文章/ 详情

Numpy与PFC的数据交换---ballarray

1年前浏览977

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.createba.dampba.densityba.dispba.eulerba.extraba.fill_dampba.fill_densityba.fill_dispba.fill_eulerba.fill_force_appba.fill_force_contactba.fill_force_unbalba.fill_massba.fill_mass_realba.fill_moment_appba.fill_moment_contactba.fill_moment_unbalba.fill_posba.fill_radiusba.fill_spinba.fill_velba.force_appba.force_contactba.force_unbalba.idsba.in_groupba.massba.mass_realba.moment_appba.moment_contactba.moment_unbalba.posba.radiusba.set_dampba.set_densityba.set_dispba.set_eulerba.set_extraba.set_force_appba.set_force_contactba.set_groupba.set_moment_appba.set_moment_contactba.set_posba.set_radiusba.set_spinba.set_velba.spinba.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.75ba.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

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

            课程
            培训
            服务
            行家

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