7.7. 极端二元级配堆积

../_images/bigpacking.png

图 7.8 粒径比1:100极端二元砂颗粒堆积

7.7.1. 基本堆积脚本

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

7.7.2. 生成颗粒

  • 生成大颗粒

 1psize = 0.2
 2
 3# 1个大颗粒的信息
 4Num = 1
 5Num_z = 1
 6pos = GridInitial(psize,num_x=Num,num_y=Num,num_z=Num_z,shift = [1.5*psize,1.1*psize,-0.5*psize])
 7pnum = len(pos)
 8ori = list()
 9for i in range(pnum):
10    ori.append(Quaternionr(-3.1415926/4, Vector3f(0, 1.0, 1.0)))
11
12poly=PolyhedronData()
13poly.setPosOri( pos,  ori)
14poly.loadSTL("./sand.stl", 0.0015*2*10)#0.001
15poly.computGeometry()
16sim.pdata.addObject(poly)
  • 生成小颗粒

 1# 约20万小颗粒的信息
 2pos2 = GridInitial(psize*0.1,num_x=70,num_y=70,num_z=40,shift = [-6.0*psize,-6.0*psize,10*psize])
 3pnum2 = len(pos2)
 4ori2 = list()
 5for i in range(pnum2):
 6    #ang = random.uniform(0,np.pi)
 7    #vec = Vector3f()
 8    ori2.append(Quaternionr(-3.1415926/4, Vector3f(0, 1.0, 1.0)))
 9
10poly2=PolyhedronData()
11poly2.setPosOri( pos2,  ori2)
12poly2.loadSTL("./sand.stl", 0.00015*2)#0.001
13poly2.computGeometry()
14sim.pdata.addObject(poly2)
  • 生成容器

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

7.7.3. 其它模型设置

 1# 大颗粒材料
 2mat1 = Material()
 3mat1.density = 2650.0
 4mat1.kn = 1e5*1e3
 5mat1.ks = 1e5
 6mat1.friction = 0.3
 7sim.pdata.material = mat1 #default material for particles
 8# 小颗粒材料
 9mat2 = Material()
10mat2.density = 2650.0
11mat2.kn = 1e4
12mat2.ks = 1e4
13mat2.friction = 0.3
14# 容器材料
15wmat = Material()
16wmat.density = 1000.0
17wmat.kn = 1e5 *1e3
18wmat.ks = 1e5 *1e3
19wmat.friction = 0.3
20sim.pdata.wallMaterial = wmat
21
22sim.integrator.gravity = Vector3f(0,0,-10.0)
23sim.integrator.damping = 0.3
24sim.integrator.viscousDamping = -0.01
25
26# 将材料赋给颗粒组
27poly.material = mat1
28poly2.material = mat2
29
30sim.init()
31
32sim.dt = 1e-4