首页/文章/ 详情

三维砂土边坡的模拟

1年前浏览3490

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


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


    首先是成样:






    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
            最近编辑:1年前
            lobby
            硕士 |擅长颗粒流PFC
            获赞 834粉丝 4505文章 84课程 21
            点赞
            收藏
            作者推荐
            未登录
            3条评论
            MANU
            签名征集中
            1年前
            谢谢大哥
            回复
            MANU
            签名征集中
            1年前
            谢谢大哥
            回复
            MANU
            签名征集中
            1年前
            请问成样的第16行命令提示extraneous material 是啥原因啊
            回复 2条回复
            课程
            培训
            服务
            行家
            VIP会员 学习 福利任务 兑换礼品
            下载APP
            联系我们
            帮助与反馈