7.5. 级配颗粒堆积¶
前述例子介绍了单粒径颗粒的堆积,包括单一形状( 颗粒堆积 )和多个形状( 混合颗粒堆积 )。本算例演示用一个砂颗粒形状模板(参考 颗粒对象 )生成级配颗粒进行堆积( 图 7.6 )。
图 7.6 均匀级配砂颗粒堆积¶
相对前述例子,只需要在生成颗粒是把缩放系数数组考虑进来即可,其它脚本保持不变,以下为具体脚本。
7.5.1. 基本堆积脚本¶
以下脚本和上一个例子基本保持一致。我们首先在格子点上生成颗粒的位置信息,同时将随机缩放系数考虑进来。
1import numpy as np
2import sys, random
3gui = True
4sim = None
5randSeed = 12345654 #to keep the same config.
6random.seed(randSeed)
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 # 缩放系数
33 scales.append(random.uniform(0.8,1.6))
34 return pos
35
36psize = 0.09
37Num = 5
38Num_z = 20
39pos = GridInitial(psize,num_x=Num,num_y=Num,num_z=Num_z,shift = [0.*psize,1.0*psize,3.0*psize])
40pnum = len(pos)
41ori = list()
42for i in range(pnum):
43 ang = random.uniform(0,np.pi)
44 vec = Vector3f(random.uniform(0,1),random.uniform(0,1),random.uniform(0,1))
45 #ori.append(Quaternionr(-ang/2, vec))
46 ori.append(Quaternionr(-3.1415926/4, Vector3f(1.0, 0, 0)))
7.5.2. 生成颗粒和容器¶
生成颗粒,并施加缩放系数
1poly=PolyhedronData()
2poly.setPosOri( pos, ori)
3poly.loadSTL("./sand.stl", 0.001)
4poly.computGeometry()
5span = poly.bounds.span()
6print(span)
7# 添加缩放系数
8poly.setScaleFactors(np.array( scales ))
9sim.pdata.addObject(poly)
生成容器
1box=PolyhedronData()
2box.loadSTL("./box.stl", Vector3f(0.6,0.6,0.6), False)
3box.setPosition( [Vector3f(0.5,0.5,1.8)])
4box.setMovable(False)
5sim.pdata.addObject(box)
7.5.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
20sim.init()
21
22sim.dt = 1e-4