使用颗粒模拟整个边坡,可以在不知道滑动面的情况下预知比较真实的滑动体的形态。但这个方法对于颗粒数的要求是比较高的,如果已经知道滑动面了,比如结构面、软弱层、基岩面都可以作为预知的滑动面,就可以直接使用wall来模拟滑动面,而使用ball来模拟即将滑动的土体便可。
整个模拟步骤分为两步:形成堆载体、滑动
一、形成堆载体
这一步其实包括两个内容,一是需要使用ball模拟堆载体,二是需要使用wall模拟滑动面。这里使用外部导入的轮廓模拟滑动面,还有两个wall来约束边界。这里可以使用之前讲过的geometry的处理方法(使用fish操作导入的geometry)来调整导入形状的大小和位置。
new
domain extent -100 100
geometry import bianpo.dxf set 1
def get_min_max(id)
global x_min=1e100
global x_max=-1e100
global y_min=1e100
global y_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 x_max < comp.x(pos)
x_max = comp.x(pos)
endif
if y_max < comp.y(pos)
y_max = comp.y(pos)
endif
endloop
end
def moveToOrigin(id)
get_min_max(id)
local gs = geom.set.find(id)
loop foreach local gn geom.node.list(gs)
geom.node.pos.x(gn)=geom.node.pos.x(gn)-x_min
geom.node.pos.y(gn)=geom.node.pos.y(gn)-y_min
endloop
end
def sacle(id,n)
local gs = geom.set.find(id)
loop foreach local gn geom.node.list(gs)
geom.node.pos.x(gn)=geom.node.pos.x(gn)*n
geom.node.pos.y(gn)=geom.node.pos.y(gn)*n
endloop
end
@moveToOrigin(1)
@sacle(1,0.1)
wall import geometry 1
wall generate plane position 0 0 dip 0
wall generate plane position 60 0 dip 90
ball generate radius 0.04 0.06 number 20000 box 61 78 53 80 tries 2000000
set gravity 9.8
cmat default model linear method deformability emod 100e6 kratio 1.5 property fric 0.5
ball attribute density 3e3 damp 0.7
solve
save sample
平衡后的模型如图所示:
二、滑动
这一步只需要删除挡土结构就可以了,这里使用了trace来监测颗粒的运动,使用trace_rep设置间隔可以提高计算速度。同时使用了按时间保存文件的命令来保存sav文件方便后处理。
restore sample
set trace_rep 50
trace add id 1 ball id 555
trace add id 2 ball id 1000
trace add id 3 ball id 5000
trace add id 4 ball id 10000
trace add id 5 ball id 15000
trace add id 6 ball id 16285
ball attribute damp 0.2
ball attribute displacement multiply 0
wall delete walls range id 3
set mech age 0
[time_record=mech.age-100]
[baocunpinlv=5]
def savefile
if mech.age-time_record > baocunpinlv then
filename=string.build("jieguo_damp2_%1",count)
command
save @filename
endcommand
time_record=mech.age
count =1
endif
end
set fish callback -1.0 @savefile
solve time 250
滑动后的状态如图:
当然也可以做成动图(这个可能图片比较多,颜色比较丰富,底色变了,读者可以使用别的做gif的软件绘制):
定义的五个颗粒的迹图如下:
做成动图效果更好,可以明显的发现堆载体中上缘的颗粒滑动的比前沿颗粒要远。前沿颗粒虽然先滑动,但是之后成为底部的垫层了。
我们也可以显示颗粒的接触图,可以发现最后边坡颗粒的稳定情况。
放大前缘的颗粒接触图,可以明显的发现接触的方向,表面的颗粒偏向于右上方的方向。
这里给出了预定滑动面滑坡的二维情况,模拟结果还是值得参考的,对于堆载体的滑动形态趋势都有很大的参考价值。离散元是基于牛顿第二定律的,对于时间也有很好的模拟效果,以上的模拟在250s内完成,也就是说上部堆载体在4分钟左右滑下来并趋于稳定状态。