【PFC6.0】三维真实边坡落石轨迹追踪
0 引言
目前离散元的三维应用主要聚焦于单元实验,因为受限制于颗粒数目和模型尺寸。所以离散元理论上的优势很难在工程应用中得到体现,这个情况也必将持续五年以上。
本案例以一个比较实际的工况来进行模拟,可以反映离散元在运动学意义上的优势。
1 边坡导入
本部分使用了MicrosStation软件进行了边坡的生成。首先是找到了一个边坡的等高线图。这个是dwg格式的,很多地形数据都会以这种格式保存下来。
参照进来后是这个样子的:里面有等高线和高程点数据。
Mircostation只能识别自身的元素,所以需要把这些线点合并到主文件中。然后隐藏掉等高线以外的元素。:
之后使用Microstation中网格--从等高线创建网格。
创建好后如图,将其保存为“dixing.stl”即可。
2 导入地形
导入地形的命令比较简单,这里用到了geo_tools来进行图形的一些处理,主要是把图形移动到原点位置。然后网格划分比较细的话,可能会导致有一些小面片有问题,用skip-errors跳过即可。
model new
model domain extent -600 600 -600 600 -200 200
geometry import "dixing.stl"
program call "geo_tools"
@MoveToOrigin("dixing")
wall import from-geometry "dixing" skip-errors
model save "dixing"
geo-tools的代码如下:
def get_min_max(id)
global x_min=1e100
global x_max=-1e100
global y_min=1e100
global y_max=-1e100
global z_min=1e100
global z_max=-1e100
local gs = geom.set.find(id)
loop foreach local gn geom.node.list(gs)
local pos = geom.node.pos(gn)
if x_min > comp.x(pos)
x_min = comp.x(pos)
endif
if y_min > comp.y(pos)
y_min = comp.y(pos)
endif
if z_min > comp.z(pos)
z_min = comp.z(pos)
endif
if x_max < comp.x(pos)
x_max = comp.x(pos)
endif
if y_max < comp.y(pos)
y_max = comp.y(pos)
endif
if z_max < comp.z(pos)
z_max = comp.z(pos)
endif
endloop
end
def MoveToOrigin(id)
get_min_max(id)
x_center=(x_max+x_min)*0.5
y_center=(y_max+y_min)*0.5
z_center=(z_max+z_min)*0.5
local gs = geom.set.find(id)
loop foreach local gn geom.node.list(gs)
-x_center+geom.node.pos.x(gn) =
-y_center+geom.node.pos.y(gn) =
-z_center+geom.node.pos.z(gn) =
endloop
get_min_max(id)
end
def MoveZ(id,z_add)
local gs = geom.set.find(id)
loop foreach local gn geom.node.list(gs)
z_add+geom.node.pos.z(gn) =
endloop
end
导入成功的地形为三角面片的wall,如图:
3 生成落石
这里落石考虑到形状,用了一个rblock来生成:
model restore "dixing"
geometry import "kuaishi.stl"
rblock template create "kuaishi" from-geometry "kuaishi"
rblock replicate "kuaishi" position -121 331 80
contact cmat default model linear method deform emod 10e7 kratio 1.5 property fric 0.5
rblock attribute density 3e3 damp 0.2
model gravity 9.8
[baocunpinlv=1]
[time_record=mech.time.total-100]
[count=0]
def savefile
if mech.time.total-time_record >= baocunpinlv then
filename=string.build("jieguo%1",count)
command
model save @filename
endcommand
time_record=mech.time.total
count +=1
endif
end
fish callback add @savefile -1.0
model mechanical timestep fix 1e-4
rblock trace id 1
model solve time 70
rbock的形状如图:
这里计算结束后,显示rblock的轨迹如图:
边坡正面:
侧面:
这里也给出落石的动图:
正面:
侧面:
文章中的地形数据和块石数据可以自行替换。
转发朋友圈收集30赞发公众号后台,可得本文包括地形和块石形状在内的整个项目包。
点赞 10 评论 2 收藏 9