7.4. 混合颗粒堆积

接着上一个香蕉颗粒堆积算例 颗粒堆积 , 我们加入梨子颗粒混在一起进行混合堆积 (图 7.5),即两种不同形状颗粒的堆积。因此,我们需要引入两个形状模板,并分别构建颗粒。以下为具体的建模脚本。

../_images/banapearpacking.png

图 7.5 香蕉梨子混合堆积

7.4.1. 基本堆积脚本

以下脚本和上一个例子保持一致。我们首先在格子点上生成颗粒的位置信息。

 1import numpy as np
 2import sys, random
 3randSeed = 12345654 #to keep the same config.
 4random.seed(randSeed)
 5gui = True
 6sim = None
 7from dem.core import *
 8from dem.rtdem import *
 9from pySudoMath import *
10if gui:
11    app.core.setAnalysisType(AnalysisType="RTDEM", randSeed = randSeed)
12    sim=app.core.sim
13else:
14    sim = DEMSim()
15
16#define a lattice grid
17#R: distance between two neighboring nodes
18#num_x: number of nodes along x axis
19#num_y: number of nodes along y axis
20#num_z: number of nodes along z axis
21#return a list of the postions of all nodes
22scales = list()
23def GridInitial(R,num_x=10,num_y=10,num_z=20, shift=[0,0,0]):#this part is slow, but just for test
24    pos = list()
25    for k in range(num_z):
26        for j in range(num_y):
27            for i in range(num_x):
28                x = i*R*2.0*1.2+R+shift[0]+random.uniform(0, 0.1*R)
29                y = j*R*2.0*1.2+R+shift[1]+random.uniform(0, 0.1*R)
30                z = k*R*2.0*1.2+R+shift[2]
31                pos.append(Vector3f(x,y,z))
32                scales.append(random.uniform(0.6,1.2))
33    return pos
34
35psize = 0.09
36Num = 5
37Num_z = 20
38pos = GridInitial(psize,num_x=Num,num_y=Num,num_z=Num_z,shift = [0.0*psize,0.0*psize,3.0*psize])
39pnum = len(pos)
40ori = list()
41for i in range(pnum):
42    #ang = random.uniform(0,np.pi)
43    #vec = Vector3f()
44    ori.append(Quaternionr(-3.1415926/4, Vector3f(0, 1.0, 1.0)))

7.4.2. 生成颗粒和容器

首先,我们随机打乱颗粒位置信息(在数组pos中的位置);然后选择前一部分作为香蕉颗粒的位置信息,后一部分作为梨子颗粒的位置信息。

  • 生成颗粒
     1# 随机打乱位置信息
     2pos = random.sample(pos,len(pos))
     3
     4# 生成香蕉颗粒
     5poly=PolyhedronData()
     6poly.setPosOri( pos[:400],  ori[:400])
     7poly.loadSTL("./Banana-lowResol.stl", 0.002)
     8poly.computGeometry()
     9span = poly.bounds.span()
    10print(span)
    11#poly.setScaleFactors(np.array( scales ))
    12sim.pdata.addObject(poly)
    13
    14# 生成梨子颗粒
    15poly2=PolyhedronData()
    16poly2.setPosOri( pos[400:],  ori[400:])
    17poly2.loadSTL("./Pear.stl", 0.02)
    18poly2.computGeometry()
    19span = poly2.bounds.span()
    20print(span)
    21#poly.setScaleFactors(np.array( scales ))
    22sim.pdata.addObject(poly2)
    
  • 生成容器
    1# 生成容器
    2box=PolyhedronData()
    3box.loadSTL("./box.stl", Vector3f(0.6,0.6,0.6), False)
    4box.setPosition( [Vector3f(0.5,0.5,1.7)])
    5box.setMovable(False)
    6sim.pdata.addObject(box)
    

7.4.3. 其它模型设置

与上一个例子类似。

 1# 颗粒材料
 2mat = Material()
 3mat.density = 2650.0
 4mat.kn = 1e4*1e2
 5mat.ks = 1e4
 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
15
16sim.integrator.gravity = Vector3f(0,0,-10.0)
17sim.integrator.damping = 0.3
18sim.integrator.viscousDamping = 0.01
19
20
21sim.init()
22
23sim.dt = 1e-4