首页/文章/ 详情

三维砂土边坡的模拟

2年前浏览4212

二维的砂土前面已经做过了,这里介绍一下三维砂土边坡的过程,顺便将方格染色功能升级成三维的方块染色。


    整个建模思路和二维一样,首先成样,之后预压,加重力沉降,切坡平衡。


    首先是成样:
































new def par    width=1.0    height=width*0.5      length=width*0.5    rdmax=0.009    rdmin=0.006end@pardomain extent -1 1

wall generate box [-width*0.5] [width*0.5] [-length*0.5] [length*0.5] [-height*0.5] [height*0.5] expand 1.5

ball distribute porosity 0.4 radius @rdmin @rdmax box [-width*0.5 rdmin] [width*0.5-rdmin] ...                                                        [-length*0.5 rdmin] [length*0.5-rdmin] ...                                                        [-height*0.5 rdmin] [height*0.5-rdmin]cmat default model linear method deformability emod 100e6 kratio 1.5ball attribute density 2.7e3 damp 0.7cycle 2000 calm 50solve save sample


成样后的模型如图:

image.png

预压代码如图:











































































































restore sample ball property fric 0.5[txx=-12.5e3][tyy=-12.5e3][tzz=-12.5e3]

[sevro_factor=0.1][do_xSevro=true][do_ySevro=true][do_zSevro=true]

[sevro_freq=100][timestepNow=global.step-1]def sevro_walls    compute_stress     if timestepNow<global.step then        get_g(sevro_factor)        timestepNow =sevro_freq    endif    if do_xSevro=true then        Xvel=gx*(wxss-txx)        wall.vel.x(wpRight)=-Xvel        wall.vel.x(wpLeft)=Xvel    endif    if do_zSevro=true then        Zvel=gz*(wzss-tzz)        wall.vel.z(wpUp)=-Zvel        wall.vel.z(wpDown)=Zvel    endif     if do_ySevro=true then        Yvel=gy*(wyss-tyy)        wall.vel.y(wpFront)=Yvel        wall.vel.y(wpBack)=-Yvel    endifenddef wp_ini    wpDown=wall.find(1)    wpUp=wall.find(2)    wpLeft=wall.find(3)    wpRight=wall.find(4)    wpFront=wall.find(5)    wpBack=wall.find(6)end@wp_inidef computer_chiCun    wlx=wall.pos.x(wpRight)-wall.pos.x(wpLeft)    wlz=wall.pos.z(wpUp)-wall.pos.z(wpDown)    wly=-wall.pos.y(wpFront) wall.pos.y(wpBack)enddef compute_stress    computer_chiCun    wxss=-(wall.force.contact.x(wpRight)-wall.force.contact.x(wpLeft))*0.5/(wly*wlz)    wzss=-(wall.force.contact.z(wpUp)-wall.force.contact.z(wpDown))*0.5/(wlx*wly)    wyss=(wall.force.contact.y(wpFront)-wall.force.contact.y(wpBack))*0.5/(wlx*wlz)enddef get_g(fac)    gx=0    gy=0    gz=0    zongKNX=1e6    zongKNY=1e6    zongKNZ=1e6    loop foreach ct wall.contactmap(wpLeft)        zongKNX =contact.prop(ct,"kn")    endloop    loop foreach ct wall.contactmap(wpRight)        zongKNX =contact.prop(ct,"kn")    endloop    loop foreach ct wall.contactmap(wpUp)        zongKNZ =contact.prop(ct,"kn")    endloop    loop foreach ct wall.contactmap(wpDown)        zongKNZ =contact.prop(ct,"kn")    endloop    loop foreach ct wall.contactmap(wpFront)        zongKNY =contact.prop(ct,"kn")    endloop    loop foreach ct wall.contactmap(wpBack)        zongKNY =contact.prop(ct,"kn")    endloop    gx=fac*wly*wlz/(zongKNX*global.timestep)    gy=fac*wlx*wlz/(zongKNY*global.timestep)    gz=fac*wlx*wly/(zongKNZ*global.timestep)end@get_g(@sevro_factor)@compute_stressset fish callback -1.0 @sevro_wallsdef addbond    command        contact method bond gap [MH_smalaradius*0.5]    endcommandendhistory id 1 @wxsshistory id 2 @wysshistory id 3 @wzss

cycle 1solvesave yuya


预压后的应力为:

image.png

第三步加地应力,到这里为止除了维度,和二维是一样的:












restore yuya

set gravity [9.8*80.0/wlx]wall delete walls range id 2wall attribute vel 0set fish callback -1.0 remove @sevro_wallscycle 1 solvesave zizhong


地应力力链分布为:

image.png

第四步对二维的方格染色升级到三维,代码为:





















































































restore zizhongdef sousuoFanwei    local xyzMinMax=array.create(3,2)     local x_min=1e100    local y_min=1e100    local z_min=1e100    local x_max=-1e100    local y_max=-1e100    local z_max=-1e100     loop foreach bp ball.list        if x_min>ball.pos.x(bp)-ball.radius(bp) then            x_min=ball.pos.x(bp)-ball.radius(bp)         endif        if x_max<ball.pos.x(bp) ball.radius(bp) then            x_max=ball.pos.x(bp) ball.radius(bp)         endif         if y_min>ball.pos.y(bp)-ball.radius(bp) then            y_min=ball.pos.y(bp)-ball.radius(bp)         endif        if y_max<ball.pos.y(bp) ball.radius(bp) then            y_max=ball.pos.y(bp) ball.radius(bp)         endif         if z_min>ball.pos.z(bp)-ball.radius(bp) then            z_min=ball.pos.z(bp)-ball.radius(bp)         endif        if z_max<ball.pos.z(bp) ball.radius(bp) then            z_max=ball.pos.z(bp) ball.radius(bp)         endif    endloop    xyzMinMax(1,1)=x_min    xyzMinMax(1,2)=x_max    xyzMinMax(2,1)=y_min    xyzMinMax(2,2)=y_max    xyzMinMax(3,1)=z_min    xyzMinMax(3,2)=z_max    sousuoFanwei=xyzMinMaxend



def ranse    local xyz_min_max=sousuoFanwei    local NWidth=10.0 ;横向方块数目    local NLength=5.0    local NHeight=5.0;纵向数目    local stepwidth=(xyz_min_max(1,2)-xyz_min_max(1,1))/NWidth    local steplength=(xyz_min_max(2,2)-xyz_min_max(2,1))/NLength    local stepheight=(xyz_min_max(3,2)-xyz_min_max(3,1))/NHeight    loop local n (1,NWidth)        local minwidth=xyz_min_max(1,1) stepwidth*(n-1)                loop local m (1,NHeight)            local minlength=xyz_min_max(2,1) steplength*(m-1)            loop k(1,NHeight)                 local minheight=xyz_min_max(3,1) stepheight*(k-1)                if (n m k)/2-(n m k)/2.0=0 then                    command                        ball group gg1 slot 5 range x [minwidth] [minwidth stepwidth] ...                                        y [minlength] [minlength steplength] ...                                        z [minheight] [minheight stepheight]                    endcommand                else                    command                        ball group gg2 slot 5 range x [minwidth] [minwidth stepwidth] ...                                        y [minlength] [minlength steplength] ...                                        z [minheight] [minheight stepheight]                    endcommand                endif            endloop        endloop    endloopend@ranse

save ranse


染色后的试样为:


image.png

最后一步进行切坡;



















restore ranseball attribute displacement multiply 0set mech age 0[kengjiaoX=wlx*0.5*0.1][kengjiaoZ=-wlz*0.5*0.1][pojiao=70]ball delete range plane origin @kengjiaoX 0 @kengjiaoZ dip @pojiao dd 90 above ...        plane origin @kengjiaoX 0 @kengjiaoZ dip 0 dd 90 above

cycle 1solve time 10save qiepo


切坡前的状态为:

image.png

运算完后的状态为:

image.png

可以从染色图中比较明显的看出滑裂面的位置。


当然位移图也可以:

image.png

代码&命令科普PFC
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-07-21
最近编辑:2年前
lobby
硕士 |擅长颗粒流PFC
获赞 880粉丝 4980文章 83课程 22
点赞
收藏
作者推荐
未登录
3条评论
MANU
签名征集中
2年前
谢谢大哥
回复
MANU
签名征集中
2年前
谢谢大哥
回复
MANU
签名征集中
2年前
请问成样的第16行命令提示extraneous material 是啥原因啊
回复 2条回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈