YADE离散元法(DEM, Discrete Element Method)仿真的开源软件

YADE(Yet Another Dynamic Engine)是一个用于离散元法(DEM, Discrete Element Method)仿真的开源软件,主要用于模拟颗粒材料(如沙子、岩石、粉末等)的力学行为。它由Václav Šmilauer等人在捷克理工大学(Czech Technical University in Prague)开发,基于C++编写,并提供了Python接口,便于用户进行脚本化建模和后处理。

⚠️ 注意:YADE 有时容易与另一个缩写相同的工具混淆(如用于ETL的YADE),但在此上下文中,我们讨论的是 YADE - Yet Another Dynamic Engine,即用于物理仿真的离散元仿真引擎。


一、YADE 简介

1. 核心功能

YADE 是一个强大的多物理场仿真平台,主要功能包括:

  • 离散元法(DEM):模拟大量刚性颗粒之间的接触力、碰撞、摩擦、滚动阻力等。
  • 刚体动力学:支持复杂几何体的运动和相互作用。
  • 耦合求解器:可与有限元法(FEM)、流体动力学(CFD)耦合(通过LBM等)。
  • 自定义材料模型:支持用户定义接触模型(如Hertz-Mindlin、Linear Elastic、Cohesive等)。
  • 可视化与后处理:内置OpenGL可视化器,支持导出VTK、CSV等格式。
  • 脚本驱动:使用Python控制仿真流程,易于自动化和参数化研究。

2. 技术特点

  • 开源(GPL许可证)
  • 跨平台(支持 Linux、macOS,Windows支持有限)
  • 高性能并行计算(支持OpenMP、MPI)
  • 模块化架构,便于扩展

二、YADE 的安装

1. Ubuntu/Debian 安装(推荐)

sudo add-apt-repository ppa:yade-dev/trunk
sudo apt update
sudo apt install yade

2. 从源码编译(适用于高级用户)

git clone https://gitlab.com/yade-dev/trunk.git yade
cd yade
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install

需要安装依赖:Boost、Eigen3、Qt5、OpenGL、VTK、Python3-dev 等。


三、基本使用示例

以下是一个简单的 YADE 脚本示例,模拟球体在重力作用下落入盒子中:

# example.py
from yade import pack, plot, utils, yade

# 创建空场景
O.materials.append(FrictMat(young=1e8, poisson=0.3, frictionAngle=0.5, density=2000, label='mat'))

# 创建地面
O.bodies.append(utils.wall(position=(0,0,0), axis=2, sense=-1, material='mat'))

# 生成随机球体云
sp = pack.SpherePack()
sp.makeCloud((0,0,1), (1,1,3), rMean=0.05, rRelFuzz=0.5)
for s in sp:
    b = utils.sphere(s[0], s[1], material='mat')
    O.bodies.append(b)

# 设置引擎
O.engines = [
    ForceResetter(),
    InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Wall_Aabb()]),
    InteractionLoop(
        [Ig2_Sphere_Sphere_Dem3DofGeom(), Ig2_Wall_Sphere_Dem3DofGeom()],
        [Ip2_FrictMat_FrictMat_FrictPhys()],
        [Law2_Dem3DofGeom_FrictPhys_CundallStrack()]
    ),
    NewtonIntegrator(gravity=(0,0,-9.81), damping=0.4),
    PyRunner(command='plotData()', iterPeriod=100)
]

# 设置时间步长
O.dt = 0.3 * utils.PWaveTimeStep()

# 收集数据
def plotData():
    plot.addData(time=O.time, energy=utils.kineticEnergy())

# 可视化
O.run(10000, True)  # 运行10000步并显示
plot.plots = {'time': 'energy'}
plot.plot()

运行方式:

yade example.py

四、核心概念解析

概念 说明
O.bodies 存储所有刚体(颗粒、墙壁等)
O.materials 材料属性(弹性模量、摩擦角等)
O.engines 仿真引擎序列(碰撞检测、力计算、积分等)
InteractionLoop 处理接触生成、物理属性赋值、力定律
NewtonIntegrator 牛顿运动方程积分器(含重力、阻尼)
PyRunner 在指定步数执行Python函数(用于监控、输出)

五、应用场景

  • 岩土工程:边坡稳定性、地基沉降
  • 工业过程:料仓排料、搅拌机、破碎机
  • 地质灾害:雪崩、泥石流、落石
  • 制药与食品:粉末混合、压片
  • 新材料研究:颗粒复合材料力学行为

六、优势与局限

✅ 优势

  • 完全开源,可自由修改和扩展
  • Python脚本控制,灵活易用
  • 支持大规模并行计算
  • 社区活跃,文档较完善

❌ 局限

  • 学习曲线较陡(需理解DEM原理)
  • Windows支持较差
  • 图形界面较原始(主要依赖脚本)
  • 内存消耗大(尤其大规模仿真)

七、学习资源

  • 官方网站:https://www.yade-dem.org
  • 文档与教程:https://yade-dem.org/doc/
  • 源码仓库:https://gitlab.com/yade-dev/trunk
  • 用户邮件列表:yade-users@lists.launchpad.net
  • 示例脚本:yade --check-examples 可运行内置示例

八、常见问题

Q: 如何加快仿真速度?

  • 使用 O.dt 设置合理的时间步长
  • 启用 OpenMP 并行:编译时开启 ENABLE_OPENMP=ON
  • 减少碰撞检测频率(调整 InsertionSortColliderverletDist

Q: 如何导出数据?

from yade import export
export.text('output.csv')  # 导出颗粒位置
export.vtk('output.vtk')   # 导出VTK用于Paraview可视化

总结

YADE 是一个功能强大、灵活开放的离散元仿真平台,适用于科研和工程中对颗粒系统动力学行为的研究。虽然入门有一定门槛,但其基于Python的脚本化设计使得建模、参数扫描和自动化极为方便。对于从事岩土、材料、机械等领域的研究人员,YADE 是一个非常有价值的工具。

如果你希望深入学习,建议从官方教程中的 examples/ 目录开始,逐步构建自己的模型。

如需进一步帮助(如建模、接触模型选择、性能优化),欢迎继续提问!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐