7.2. 颗粒堆积¶
本算例将介绍如何使用RTDEM进行任意形状颗粒的堆积模拟,并以单一粒径香蕉颗粒堆积为例,如 图 7.3 所示。
图 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 )。
图 7.4 梨子颗粒堆积¶
注:如果用户导入其它STL文件,用户可能需要更改其它建模参数,比如材料刚度、时步等。