2025年PFC双轴案例

PFC双轴案例目录 双轴压缩 伺服原理 参数化成样 应力计算并预压 加围压 重定义函数与加载 双轴压缩 伺服原理 通过位移给墙体施加一个力 墙体没有质量 只能根据重叠量来受力 使用墙给一个颗粒施加力 new domain extent 10 10 ball

大家好,我是讯享网,很高兴认识大家。

目录

双轴压缩

伺服原理

参数化成样

应力计算并预压

加围压

重定义函数与加载


双轴压缩


伺服原理


        通过位移给墙体施加一个力。(墙体没有质量,只能根据重叠量来受力)

        使用墙给一个颗粒施加力

new domain extent -10 10 ball create position 0 0 radius 1.0 ball attribute density 2e3 damp 0.7 ball fix vel spin cmat default model linear property kn 1e7 wall create vertices -1 1 1 1 def cal_chongdie chongdieliang=1e4/1e7 end @cal_chongdie ;计算重叠量 wall attribute yvel -1.0 range id 1 ;给一个y方向的速度 set timestep fix 1e-5 solve time [chongdieliang]

讯享网

        使用墙给多个颗粒施加力

讯享网new domain extent -10 10 ball create position -2 0 radius 0.5 ball create position -1 0 radius 0.5 ball create position -0 0 radius 0.5 ball create position 1 0 radius 0.5 ball create position 2 0 radius 0.5 ball attribute density 2e3 damp 0.7 ball fix vel spin cmat default model linear property kn 1e7 wall create vertices -3 0.5 3 0.5 def cal_chongdie chongdieliang=1e4/(1e7*5) end @cal_chongdie ;重叠量为力除以刚度,墙体的力为1e4N ;一般不给试样施加力,施加应力 wall attribute yvel -1.0 range id 1 set timestep fix 1e-5 solve time [chongdieliang] 

        对上面的加载进行优化,使得cycle 1 步就能得到目标值。


讯享网

new domain extent -10 10 ball create position -2 0 radius 0.5 ball create position -1 0 radius 0.5 ball create position -0 0 radius 0.5 ball create position 1 0 radius 0.5 ball create position 2 0 radius 0.5 ball attribute density 2e3 damp 0.7 ball fix vel spin cmat default model linear property kn 1e7 wall create vertices -3 0.5 3 0.5 def cal_chongdie chongdieliang=(1e4-0)/(1e7*5) sudu=chongdieliang/global.timestep command wall attribute yvel [-sudu] range id 1 endcommand end ;对墙底施加速度 set fish callback 1.0 @cal_chongdie ;在时步计算之后进行回调 cycle 1 

        球体串联情况

讯享网new domain extent -10 10 ball create position 0 0 radius 1.0 ball create position 0 2 radius 1.0 ball attribute density 2e3 damp 0.7 ball fix vel spin range id 1 cmat default model linear property kn 1e7 wall create vertices -1 3 1 3 ;k=k1*k2/(k1+k2) ;k=k1/2 ;串联时两个球体刚度计算 def cal_chongdie chongdieliang=1e4/(1e7*0.5) end @cal_chongdie wall attribute yvel -1.0 range id 1 set timestep fix 1e-5 solve time [chongdieliang] wall attribute yvel -0.0 range id 1 solve

        三角形分布球体伺服

        whilestepping,stop_me

new domain extent -10 10 ball create position -1 0 radius 1.0 ball create position 1 0 radius 1.0 ball create position 0 [math.sqrt(3)] radius 1.0 ;生成三个颗粒,根号3 ball attribute density 2e3 damp 0.7 ball fix vel spin range id 1 ball fix vel spin range id 2 cmat default model linear property kn 1e7 wall create vertices -1 [math.sqrt(3)+1] 1 [math.sqrt(3)+1] ;1、力小的时候,下压 ;2、力大了,上浮 [wp=wall.find(1)] ;定义墙体指针 def get_force whilestepping wall_force=wall.force.contact.y(wp) end ;whilestepping的效果和回调函数一样,即函数结果将会随着计算的更新而更新 def apply_vel whilestepping if wall_force<1e4 then wall.vel.y(wp)=-1.0 else wall.vel.y(wp)=1.0 endif end ;wall_force向上,为正值 ;力小的话则墙体下压,否则墙体上浮 [stop_me=0] def stop_me if math.abs(wall_force-1e4)<1 then stop_me=1 endif end ;stop_me函数判断截止条件,被solve调用,solve fishhalt @stop_me调用了停止函数 ;当值为0时继续运行,当为1时停止运行 set timestep fix 1e-5 ;时步不能太大,否则容易使得力来回变动 ;solve fishhalt @stop_me cycle 1 ;使用cycle 1 来打破平衡 solve ;两个要求,一施加力达到要求,二达到平衡 ;cycle 2.2w 

        伺服优化(速度+伺服系数)

讯享网new domain extent -10 10 ball create position -1 0 radius 1.0 ball create position 1 0 radius 1.0 ball create position 0 [math.sqrt(3)] radius 1.0 ball attribute density 2e3 damp 0.7 ball fix vel spin range id 1 ball fix vel spin range id 2 cmat default model linear property kn 1e7 wall create vertices -1 [math.sqrt(3)+1] 1 [math.sqrt(3)+1] ;1、力小的时候,下压 ;2、力大了,上浮 [wp=wall.find(1)] def get_force whilestepping wall_force=wall.force.contact.y(wp) end [g=5e-4] def apply_vel whilestepping vel=g*math.abs(wall_force-1e4) ;速度=伺服系数乘以力的差值 if wall_force<1e4 then wall.vel.y(wp)=-vel else wall.vel.y(wp)=vel endif end [stop_me=0] def stop_me if math.abs(wall_force-1e4)<1 then stop_me=1 endif end set timestep fix 1e-5 ;solve fishhalt @stop_me cycle 1 solve ;g=1e-3 cycle 5k8 ;g=1e-2 波动 不平衡 伺服系数g不能太大 ;g=5e-3 cycle 1w4 ;g=2e-3 cycle 2w2 ;g=5e-4 cycle 1w4 ;伺服系数需要试算 

        试算伺服系数

new domain extent -10 10 ball create position -1 0 radius 1.0 ball create position 1 0 radius 1.0 ball create position 0 [math.sqrt(3)] radius 1.0 ball attribute density 2e3 damp 0.7 ball fix vel spin range id 1 ball fix vel spin range id 2 cmat default model linear property kn 1e7 wall create vertices -1 [math.sqrt(3)+1] 1 [math.sqrt(3)+1] ;1、力小的时候,下压 ;2、力大了,上浮 [wp=wall.find(1)] def get_force whilestepping wall_force=wall.force.contact.y(wp) end ;重叠量=力除以刚度 ;速度=重叠量除以时步 [servo_factor=0.8] def get_g ct_wp=contact.find("ball-facet",1) gangdu=contact.prop(ct_wp,"kn") g=1.0*servo_factor/(gangdu*global.timestep) end set fish callback 1.0 @get_g def apply_vel whilestepping vel=g*math.abs(wall_force-1e4) if wall_force<1e4 then wall.vel.y(wp)=-vel else wall.vel.y(wp)=vel endif end [stop_me=0] def stop_me if math.abs(wall_force-1e4)<1 then stop_me=1 endif end set timestep fix 1e-5 ;solve fishhalt @stop_me cycle 10 solve 

参数化成样


        加载板和试样之间的摩擦力为0,而颗粒与颗粒之间为0.5。(两者摩擦力取最小值)

讯享网new def par width=0.4 height=width*2 rdmin=0.006 rdmax=0.009 poro=0.12 end @par ;给出需要的参数 domain extent [-width*2.0] [width*2.0] ... [-height*2.0] [height*2.0] set random 10001 ;给定一个random的数值,使得每次运行得到的结果相同 wall generate box [-width*0.5] [width*0.5] ... [-height*0.5] [height*0.5] expand 1.5 ;把边缘坐标进行放大(把加载板稍微加大一点) ball distribute porosity @poro radius [rdmin] [rdmax] box ... [-width*0.5] [width*0.5] [-height*0.5] [height*0.5] ball attribute density 2e3 damp 0.7 cmat default model linear method deform emod 100e6 kratio 1.5 ;method可以用来定义一些宏观的参数,但emod即弹性模量,但是弹性模量也会自动被计算为刚度 cycle 2000 calm 50 ;让cycle尽量大,使得颗粒散开 ball property fric 0.5 ;最好给出fric solve save sample 

应力计算并预压


        预压模拟的是土体的先前条件。伺服频率

        对于墙体和颗粒接触,模量乘以2对应kn的数值。

restore sample [txx=1e4] [tyy=1e4] def wall_ini wpup=wall.find(3) wpdown=wall.find(1) wpleft=wall.find(4) wpright=wall.find(2) end @wall_ini ;使用指针找到墙体 def computer_chicun wlx=wall.pos.x(wpright)-wall.pos.x(wpleft) wly=wall.pos.y(wpup)-wall.pos.y(wpdown) end ;计算尺寸 def computer_stress computer_chicun wyss=0.5*(wall.force.contact.y(wpdown)-wall.force.contact.y(wpup))/wlx wxss=0.5*(wall.force.contact.x(wpleft)-wall.force.contact.x(wpright))/wly end ;计算应力,两侧应力的平均值 ;伺服 [servo_factor=0.8] def get_g zongKNY=100e6*2.0 ;假设初始时有一定的约束,防止颗粒过于松散,kn为0 loop foreach ct wall.contactmap(wpup) ;遍历,ct为临时变量,它会把墙体接触依次定义 zongKNY+=contact.prop(ct,"kn") ;总的竖向刚度, endloop loop foreach ct wall.contactmap(wpdown) zongKNY+=contact.prop(ct,"kn") endloop zongKNX=100e6*2.0 loop foreach ct wall.contactmap(wpleft) zongKNX+=contact.prop(ct,"kn") endloop loop foreach ct wall.contactmap(wpright) zongKNX+=contact.prop(ct,"kn") endloop gx=1.0*servo_factor*wly/(zongKNX*global.timestep) ;wly表示对应的面积,把应力转化为力 gy=1.0*servo_factor*wlx/(zongKNY*global.timestep) ;当试样特别松散的时候,刚度可能出现为0的情况 ;时步正比于(质量/刚度) end [sevro_freq=100] ;定义伺服频率,以步数作为跨度,隔一定步数计算函数 [time_record=global.step-1] def sevro_walls computer_stress if global.step>time_record then get_g time_record=global.step+sevro_freq ;每100步计算一次get_g endif yvel=gy*math.abs(math.abs(wyss)-tyy) ;竖向速度 if math.abs(wyss)<tyy then wall.vel.y(wpup)=-yvel wall.vel.y(wpdown)=yvel else wall.vel.y(wpup)=yvel wall.vel.y(wpdown)=-yvel endif xvel=gx*math.abs(math.abs(wxss)-txx) ;横向速度 if math.abs(wxss)<txx then wall.vel.x(wpleft)=xvel wall.vel.x(wpright)=-xvel else wall.vel.x(wpleft)=-xvel wall.vel.x(wpright)=xvel endif end set fish callback -1.0 @sevro_walls history id 1 @wxss history id 2 @wyss ;记录x和y方向应力的变化 cycle 10 ;多运行几下,打破平衡 solve save yuya

加围压


        利用callback和fish函数。

讯享网restore yuya ;采用伺服原理 [txx=100e3] [tyy=100e3] ;设置为100kpa ;改变txx和tyy会直接代入yuya命令部分的函数进行计算 ;因为callback存在,所以运行过程中会不断更新数值 cycle 1 solve save weiya

重定义函数与加载


        对于预压部分的伺服函数进行重定义,删掉竖向伺服,添加竖向墙体速度。同时设定hist并添加加载截止条件。

restore weiya ball attribute displacement multiply 0 ;将位移进行清零 def sevro_walls computer_stress if global.step>time_record then get_g time_record=global.step+sevro_freq endif ;获得g这个伺服系数 xvel=gx*math.abs(math.abs(wxss)-txx) if math.abs(wxss)<txx then wall.vel.x(wpleft)=xvel wall.vel.x(wpright)=-xvel else wall.vel.x(wpleft)=-xvel wall.vel.x(wpright)=xvel endif ;关掉竖向伺服,给竖向一个速度,墙体的下压与上浮 end [strainRate=1e-2] wall attribute yvel [strainRate*wly] range id 1 wall attribute yvel [-strainRate*wly] range id 3 ;用应变率×尺寸作为速度 [Iy0=wly] [Ix0=wlx] ;记录初始的宽度和高度 def computer_strain weyy=(Iy0-wly)/Iy0 wexx=(Ix0-wlx)/Ix0 wevol=weyy+wexx ;体变等于两个方向应变相加 end set fish callback -1.0 @computer_strain history delete ;删除之前的一些历史记录然后重新定义 history id 1 @wxss history id 2 @wyss history id 3 @weyy history id 4 @wexx history id 5 @wevol [stop_me=0] def stop_me if weyy>0.2 then stop_me=1 endif end solve fishhalt @stop_me ;人工定义截止条件,当应变大于0.2时就停止
小讯
上一篇 2025-03-16 17:10
下一篇 2025-01-05 22:20

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/73099.html