6.3. 碎屑流¶
本算例展示如何使用CuDEM模拟滑坡碎屑流。如 图 6.3 所示,地形通过数字高程模型构建,而滑动体则由滑动前后的数字高程数据之差求得。本例子我们直接提供了相应数据,如果用户需要更换地形等,则需要自行预先处理相应数据。
图 6.3 碎屑流模型构建:地形由12万三角面片组成,滑动体由160万颗粒组成¶
6.3.1. 导入基础包¶
导入pycudem和pySudoMath:
1import sys,os,math,random
2import numpy as np
3from dem.core import *
4from dem.cudem import *
5from pySudoMath import *
6# 设置随机种子
7random.seed(1234343)
6.3.2. 设置GUI或命令行运行¶
为了让脚本既能在GUI中运行,又能直接通过命令行运行,我们做如下设置:
1gui = True
2sim = None
3if gui:
4 app.core.setAnalysisType(AnalysisType="CUDEM")
5 sim=app.core.sim
6else:
7 sim = DEMSim()
6.3.3. 通用设置¶
1#########general setting##########
2sim.setOutputDir("./")
3sim.setFilePrefix("testmesh_")
4#################Digital elevation mesh
5#put your stl file here for the terrain
6if gui:
7 app.frame.scene.openSTL("./tmp1.stl")
6.3.4. 设置地形模型¶
设置数字高程
1de = DigitalElevation()
2data = np.loadtxt("dc7_dem_1411slide.txt", skiprows = 6) - 1597.4
3data = np.flip(data,0)
4de.loadData2d(data)
5de.setCellSize(1.0)
设置地形材料属性
1demat = Material()
2demat.kn = 1e7
3demat.ks = 1e7
4demat.friction = 0.5
5demat.density = 1000.0
6demat.vdamping = 0.5
7de.material = demat
加入到模拟
1sim.digitalElevation = de
6.3.5. 设置滑动体¶
定义滑动体颗粒函数
1def PointSpawn(points, radius = 0.25, spawn = True):
2 pos = list()
3 par_num = 0
4 for p in points:
5 delta = [-radius, radius]
6 par_num += 1
7 if not spawn:
8 pos.append(Vector3f(p[0],p[1],p[2]))
9 else:
10 for i in range(2):
11 for j in range(2):
12 for k in range(2):
13 pos.append(Vector3f(p[0]+delta[i],p[1]+delta[j],p[2]+delta[k]))
14 return pos
生成滑动体颗粒信息
1psize = 0.125#0.25
2aabb_centers = np.loadtxt("../pos_list.txt")
3aabb_centers += np.array([115.5, 130.5-1,-1597.4]) #shift data
4pos = PointSpawn(aabb_centers, radius = 0.25)
5pos = PointSpawn(pos, radius = 0.125)
6
7rs_p = np.ones(len(pos))*psize
8rs = rs_p #np.hstack((rs_w,rs_p))
6.3.6. 设置模拟域¶
设置模拟域大小
设置模拟域的AABB大小以及模拟域中分域大小(采用基于cell的算法需要此设置):
1sim.domain.setAABB(0,230,0,260,0,1714-1597.4)#domain size should be large enough
2sim.domain.setCellSize(psize*4.0)
设置墙作为模拟域边界
1sim.walls.addWall(Vector3f(0,0,0), 1, 2) #bottom
2# sim.walls.addWall(Vector3f(0,0,1714-1597.4), -1, 2) #top
3sim.walls.addWall(Vector3f(0,0,0), 1, 0) #left
4sim.walls.addWall(Vector3f(230,0,0), -1, 0) #right
5sim.walls.addWall(Vector3f(0,0,0), 1, 1) #front
6sim.walls.addWall(Vector3f(0,260,0), -1, 1) #back
设置墙的材料,采用线弹性模型
1wmat = Material()
2wmat.kn = 1e7 #法向刚度
3wmat.ks = 1e7 #切向刚度
4wmat.friction = 0.5 #摩擦系数
5sim.walls.material = wmat #把材料赋值到所有墙
6.3.7. 设置默认材料¶
颗粒采用默认材料,参考墙的材料:
1sim.material.kn = 1e5
2sim.material.ks = 1e5
3sim.material.friction = 0.5
4sim.material.density = 2000.0
5sim.material.vdamping = 0.5
6.3.8. 求解器设置¶
设置运动求解器
设置阻尼,重力加速度及 alpha 。其中, alpha 将会影响邻居列表的更新频率。
1sim.integrator.damping = 0.1
2sim.integrator.gravity = Vector3f(0.0, 0.0, -10.0)
3sim.integrator.alpha = 1.2
设置邻居列表属性
颗粒运动超过 delta 倍颗粒粒径后更新邻居列表; 光追接触检测时放大的AABB大小为 ORTextend 。
1sim.nlist.delta = 1.2
2sim.nlist.ORTextend = 2.0*psize*1.2
设置内存动态优化
设置颗粒重新内存从新排列频率 reorderInterval (以时步计);设置是否开启光追接触计算 useORT ; 设置计算时间步长 dt 。
1sim.reorderInterval = 500 #2000
2sim.useORT = RTflag
3sim.dt = 1e-3
6.3.9. 生成颗粒¶
生成颗粒位置和大小,本例子采用单一粒径颗粒:
1aabb_centers = np.loadtxt("../pos_list.txt")
2par_num = 0
3aabb_centers += np.array([115.5, 130.5-1,-1597.4]) #shift data
4pos = PointSpawn(aabb_centers, radius = 0.25)
5pos = PointSpawn(pos, radius = 0.125)
6
7rs_p = np.ones(len(pos))*psize
8rs = rs_p #np.hstack((rs_w,rs_p))
根据颗粒位置和半径生成颗粒:
1sim.createParticles(pos,rs)
6.3.10. 运行程序¶
GUI中命令行
1app.run(10000)
终端命令行
1sudosim -i -f packing.py
然后在Python解释器中运行:
1sim.RunPthread(10000)