7.2. 颗粒堆积

本算例将介绍如何使用RTDEM进行任意形状颗粒的堆积模拟,并以单一粒径香蕉颗粒堆积为例,如 图 7.3 所示。

../_images/bananapacking.png

图 7.3 香蕉颗粒堆积

7.2.1. 导入基础包

1import numpy as np
2import sys, random
3randSeed = 12345654 #to keep the same config.
4random.seed(randSeed)
5from dem.core import *
6from dem.rtdem import *
7from pySudoMath import *

7.2.2. 设置GUI或命令行运行

为了让脚本既能在GUI中运行,又能直接通过命令行运行,我们做如下设置:

1gui = True
2sim = None
3if gui:
4    app.core.setAnalysisType(AnalysisType="RTDEM", randSeed = randSeed)
5    sim=app.core.sim
6else:
7    sim = DEMSim()

7.2.3. 定义一些辅助函数

  • 定义生成栅格的函数,我们将在栅格点的位置生成颗粒:

 1#define a lattice grid
 2#R: distance between two neighboring nodes
 3#num_x: number of nodes along x axis
 4#num_y: number of nodes along y axis
 5#num_z: number of nodes along z axis
 6#return a list of the postions of all nodes
 7scales = list()
 8def GridInitial(R,num_x=10,num_y=10,num_z=20, shift=[0,0,0]):#this part is slow, but just for test
 9    pos = list()
10    for k in range(num_z):
11        for j in range(num_y):
12            for i in range(num_x):
13                x = i*R*2.0*1.2+R+shift[0]+random.uniform(0, 0.1*R)
14                y = j*R*2.0*1.2+R+shift[1]+random.uniform(0, 0.1*R)
15                z = k*R*2.0*1.2+R+shift[2]
16                pos.append(Vector3f(x,y,z))
17                scales.append(random.uniform(0.6,1.2))
18    return pos

7.2.4. 生成颗粒

  • 生成颗粒位置和方向数据

 1psize = 0.09
 2Num = 5
 3Num_z = 20
 4pos = GridInitial(psize,num_x=Num,num_y=Num,num_z=Num_z,shift = [0.0*psize,0.0*psize,3.0*psize])
 5pnum = len(pos)
 6ori = list()
 7for i in range(pnum):
 8    #ang = random.uniform(0,np.pi)
 9    #vec = Vector3f()
10    ori.append(Quaternionr(-3.1415926/4, Vector3f(0, 1.0, 1.0)))
  • 生成颗粒

利用形状模板生成一系列颗粒,参考 颗粒形状模板

1poly=PolyhedronData()
2poly.setPosOri( pos, ori)
3poly.loadSTL("./Banana-lowResol.stl", 0.002)
4poly.computGeometry()
5span = poly.bounds.span()
6print(span)
7#poly.setScaleFactors(np.array( scales ))
8sim.pdata.addObject(poly)

7.2.5. 生成容器

1box=PolyhedronData()
2box.loadSTL("./box.stl", Vector3f(0.6,0.6,0.6), False)
3box.setPosition( [Vector3f(0.5,0.5,1.7)] )
4box.setMovable(False)
5sim.pdata.addObject(box)

7.2.6. 加入材料

 1#Material
 2mat = Material()
 3mat.density = 2650.0
 4mat.kn = 1e4*1e2
 5mat.ks = 1e5
 6mat.friction = 0.3
 7sim.pdata.material = mat
 8
 9wmat = Material()
10wmat.density = 1000.0
11wmat.kn = 1e5*1e3
12wmat.ks = 1e5
13wmat.friction = 0.3
14sim.pdata.wallMaterial = wmat

7.2.7. 设置求解器及时步

1sim.integrator.gravity = Vector3f(0,0,-10.0)
2sim.integrator.damping = 0.3
3sim.integrator.viscousDamping = 0.01
4sim.dt = 1e-4

7.2.8. 模型初始化

1sim.init()

7.2.9. 运行模拟

1app.run(30000)

7.2.10. 其它形状颗粒堆积

如需将上述例子中的香蕉换成其它形状颗粒,比如梨子,我们只需要更改生成香蕉颗粒这一段 脚本

1poly=PolyhedronData()
2poly.setPosOri( pos, ori)
3poly.loadSTL("./Pear.stl", 0.02)
4poly.computGeometry()
5span = poly.bounds.span()
6print(span)
7#poly.setScaleFactors(np.array( scales ))
8sim.pdata.addObject(poly)

更改完成后,执行模拟即可实现梨子堆积模拟( 图 7.4 )。

../_images/pearpacking.png

图 7.4 梨子颗粒堆积

注:如果用户导入其它STL文件,用户可能需要更改其它建模参数,比如材料刚度、时步等。