【PFC6.0】子*弹穿墙模拟
0 引言
最近刚好刷到《战狼1》的短视频,里面有一个经典的子*弹穿墙镜头,想着或许可以使用离散元的方法进行模拟。对于弹道分析、穿墙速度损失等方面应该会有一定的指导意义。案例中使用到了很多技术方法,比如子*弹的形状是用圆锥二次化后生成的,墙体的边界处理等。
1 成样
破碎方面一般只在被击中的砖周边,所以我们只建了三行三列的砖墙,其余的边界用有限元的zone模拟。砖头采用240*115*90mm尺寸,粒径在2-3mm之间,生成了20w左右的颗粒。由于后面是想用力清零的方式来形成胶结物,所以这里对模型的平衡度要求不高,ratio到1e-2停止。
model newdef zhuan_parzhuan_length=240e-3zhuan_width=115e-3zhuan_height=90e-3rdmin=2e-3rdmax=3e-3end@zhuan_parmodel domain extent [-zhuan_length*2] [zhuan_length*2]wall generate box [-zhuan_length*1.5] [zhuan_length*1.5] ...[-zhuan_width*0.5] [zhuan_width*0.5] [-zhuan_height*1.5] [zhuan_height*1.5]ball distribute porosity 0.3 radius @rdmin @rdmax box [-zhuan_length*1.5] [zhuan_length*1.5] ...[-zhuan_width*0.5] [zhuan_width*0.5] [-zhuan_height*1.5] [zhuan_height*1.5]ball attribute density 3.8e3 damp 0.7contact cmat default type ball-ball model linear method deform emod 1e9 kratio 1.5contact cmat default type ball-facet model linear method deform emod 10e9 kratio 1.5model mechanic timestep scalemodel cycle 1model solve ratio-average 1e-2model save "sample"
2 砖墙边界
模拟混凝土墙的话,使用一整个式样即可。对于砖墙的话一般是错开排列的,使用水泥等进行粘结。这里首先建立每块砖边界上的形状,然后导入墙体进行边界平整,然后赋予参数成样。
model restore "sample"geometry set "fenjie"geometry polygon create by-positions [-zhuan_length*1.5] [-zhuan_width*0.5] [zhuan_height*0.5] ...[-zhuan_length*1.5] [zhuan_width*0.5] [zhuan_height*0.5] ...[zhuan_length*1.5] [zhuan_width*0.5] [zhuan_height*0.5] ...[zhuan_length*1.5] [-zhuan_width*0.5] [zhuan_height*0.5]geometry polygon create by-positions [-zhuan_length*1.5] [-zhuan_width*0.5] [-zhuan_height*0.5] ...[-zhuan_length*1.5] [zhuan_width*0.5] [-zhuan_height*0.5] ...[zhuan_length*1.5] [zhuan_width*0.5] [-zhuan_height*0.5] ...[zhuan_length*1.5] [-zhuan_width*0.5] [-zhuan_height*0.5]def gen_on_layer(x_pos_qi,z_pos_qi,num)loop n(1,num)x_pos=x_pos_qi+(n-1)*zhuan_lengthcommandgeometry polygon create by-positions @x_pos [-zhuan_width*0.5] [z_pos_qi] ...@x_pos [zhuan_width*0.5] [z_pos_qi] ...@x_pos [zhuan_width*0.5] [z_pos_qi+zhuan_height] ...@x_pos [-zhuan_width*0.5] [z_pos_qi+zhuan_height]endcommandendloopend@gen_on_layer([-zhuan_length*1.0],[zhuan_height*0.5],3)@gen_on_layer([-zhuan_length*0.5],[-zhuan_height*0.5],2)@gen_on_layer([-zhuan_length*1.0],[-zhuan_height*1.5],3)def create_wall_from_geogeo_pt=geom.set.find("fenjie")loop foreach pg geom.poly.list(geo_pt)n1= geom.poly.node(pg,1)n2= geom.poly.node(pg,2)n3= geom.poly.node(pg,3)n4= geom.poly.node(pg,4)commandwall generate group "fenjie" polygon [geom.node.pos(n1)] ...[geom.node.pos(n2)] ...[geom.node.pos(n3)] ...[geom.node.pos(n4)]endcommandendloopend@create_wall_from_geomodel cycle 1model solve ratio-average 1e-2model save "wall_ball"
3 加胶结
这里为了弱化边界的影响,使用了zone来模拟周边的墙体来传递应力应变。给了砖头比较强的接触,边界给了弱一倍的参数,这里是随便给的,如果是专门做的话,需要进行参数标定。
model restore "wall_ball"[emod=1e9][pb_coh=3e6]wall deletezone create brick size (4,1,11) point 0 ([zhuan_length*1.5],[-zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 1 ([zhuan_length*5.5],[-zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 2 ([zhuan_length*1.5],[zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 3 ([zhuan_length*1.5],[-zhuan_Width*0.5],[zhuan_height*5.5])zone create brick size (4,1,11) point 0 ([-zhuan_length*5.5],[-zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 1 ([-zhuan_length*1.5],[-zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 2 ([-zhuan_length*5.5],[zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 3 ([-zhuan_length*5.5],[-zhuan_Width*0.5],[zhuan_height*5.5])zone create brick size (3,1,4) point 0 ([-zhuan_length*1.5],[-zhuan_Width*0.5],[zhuan_height*1.5]) ...point 1 ([zhuan_length*1.5],[-zhuan_Width*0.5],[zhuan_height*1.5]) ...point 2 ([-zhuan_length*1.5],[zhuan_Width*0.5],[zhuan_height*1.5]) ...point 3 ([-zhuan_length*1.5],[-zhuan_Width*0.5],[zhuan_height*5.5])zone create brick size (3,1,4) point 0 ([-zhuan_length*1.5],[-zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 1 ([zhuan_length*1.5],[-zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 2 ([-zhuan_length*1.5],[zhuan_Width*0.5],[-zhuan_height*5.5]) ...point 3 ([-zhuan_length*1.5],[-zhuan_Width*0.5],[-zhuan_height*1.5])zone cmodel assign elasticzone property young [emod] poisson 0.25zone gridpoint fix velocity range pos-x [-zhuan_length*5.6] [-zhuan_length*5.4]zone gridpoint fix velocity range pos-x [zhuan_length*5.4] [zhuan_length*5.6]zone gridpoint fix velocity range pos-z [-zhuan_height*5.6] [-zhuan_height*5.4]zone gridpoint fix velocity range pos-z [zhuan_height*5.4] [zhuan_height*5.6]wall-zone create name 'bianjie1' skip-errors range pos-x [-zhuan_length*1.6] [-zhuan_length*1.4] ...pos-z [-zhuan_height*1.6] [zhuan_height*1.6]wall-zone create name 'bianjie2' skip-errors range pos-x [zhuan_length*1.4] [-zhuan_length*1.6] ...pos-z [-zhuan_height*1.6] [zhuan_height*1.6]wall-zone create name 'bianjie3' skip-errors range pos-x [-zhuan_length*1.6] [zhuan_length*1.6] ...pos-z [zhuan_height*1.4] [zhuan_height*1.6]wall-zone create name 'bianjie4' skip-errors range pos-x [-zhuan_length*1.6] [zhuan_length*1.6] ...pos-z [-zhuan_height*1.6] [zhuan_height*1.4]contact cmat default type ball-ball model linearpbond method deform emod @emod kratio 1.5 ...pb_deform emod @emod kratio 1.5 property pb_coh [pb_coh] pb_ten [pb_coh*3] pb_fa 50contact cmat default type ball-facet model linearpbond method deform emod @emod kratio 1.5 ...pb_deform emod @emod kratio 1.5 property pb_coh [pb_coh] pb_ten [pb_coh*3] pb_fa 50contact cmat add 1 model linearpbond method deform emod [emod*0.5] kratio 1.5 ...pb_deform emod [emod*0.5] kratio 1.5 property pb_coh [pb_coh*0.5] pb_ten [pb_coh*1.5] pb_fa 30 range ...geometry-distance "fenjie" gap [rdmin*0.2]contact cmat applymodel cleancontact method bond gap [rdmax]contact property lin_force 0.0 0.0 0 lin_mode 1ball attribute force-contact multiply 0.0 moment-contact multiply 0.0ball attribute damp 0.1model calmmodel cycle 1model solvemodel save "model_qiang"
到这里为止,砖墙模型就形成了,如下图:
胶结情况如图:
4 造子*弹
懒得画子*弹图形,并且参数控制也比较容易来研究子*弹形状对结果的影响。这里是首先生成一个圆锥cone作为基本图形,然后将其y坐标二次化,其实是将圆锥给不均匀拉长成一个子*弹的形状。需要注意的cone本身y向是只有一段的,所以需要将其加密才可以获得多段y坐标的cone,然后改变其y坐标。
model restore "model_qiang"def zidan_parzidan_zhijing=9.5e-3zidan_changdu=67.7e-3end@zidan_pargeometry set "zidan"geometry generate cone base 0 [-zhuan_Width*0.5-zidan_zhijing*0.5] 0 ...axis 0 1 0 ...height [zidan_zhijing*0.5] ...radius [zidan_zhijing*0.5] ...cap true res 0.8geometry refine 4def extend_geogeo_zidan=geo.set.find("zidan")loop foreach nd geo.node.list(geo_zidan)y_dist=(geo.node.pos.y(nd)+zhuan_Width*0.5)*2000y_dist_new=(-1/2000.0)* math.abs(y_dist)^(2)-zhuan_Width*0.5=y_dist_newendloopend@extend_geodef get_min_maxglobal x_min=1e100global x_max=-1e100global y_min=1e100global y_max=-1e100local gs = geom.set.find("zidan")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)endifif y_min > comp.y(pos)y_min = comp.y(pos)endifif x_max < comp.x(pos)x_max = comp.x(pos)endifif y_max < comp.y(pos)y_max = comp.y(pos)endifendloopend@get_min_maxdef scale_geolength_now=y_max-y_minscale_factor=zidan_changdu/length_nowgeo_zidan=geo.set.find("zidan")loop foreach nd geo.node.list(geo_zidan)=-zhuan_Width*0.5+(geo.node.pos.y(nd)+zhuan_Width*0.5)*scale_factorendloopend@scale_georblock create from-geometrymodel save "add_zidan"
子*弹用rblock来模拟,如图:
5 冲击
最后一步就是给子*弹一个速度,来冲击砖墙。在子*弹冲击墙的时候,把时步设置的比较小,防止因为速度过大引起的计算问题。子*弹冲击完后,可以将时步放大,来研究墙体的破碎情况。注意动力问题阻尼要缩小。
model restore "add_zidan"model domain extent [-zhuan_length*2] [zhuan_length*2] condition destroymodel mech time-total 0contact cmat default type ball-rblock model linear method deform emod 10e9 kratio 1.5model mechanic timestep fix 1e-8ball attribute density 2e3 damp 0.01rblock attribute density 11e3 damp 0.01rblock attribute velocity-y [800][time_record=mech.time.total-100][baocunpinlv=5e-5]def savefileif mech.time.total-time_record > baocunpinlv thenfilename=string.build("jieguo_%1",count)commandmodel save @filenameendcommandtime_record=mech.time.totalcount +=1endifendfish callback add @savefile -1.0[rb_zidan=rblock.find(1)]def jiancewhilesteppingzidan_vel_y=rblock.vel.y(rb_zidan)endhistory deletehistory id 1 @zidan_vel_yrblock trace id 1model solve time 0.75e-3[baocunpinlv=1e-2]model mechanic timestep fix 1e-6def jianceendmodel solve time 1model save "result"
【0.75um以内的状态】
zi弹刚接触和刚穿过的状态。
下面动图为zi弹穿过墙体的过程:
如图为正面接触的破坏图:
下图为周边砖墙的位移图,可以看到刚开始的时候竖向位移比较大,后面的时候横向位移比较大。
下图为zi弹轨迹图,不清楚是颗粒效应问题还是什么,其在穿入一半的时候轨迹偏向下:
【0.75um之后的状态】
zi弹穿过后的墙体破碎渐变情况:
接触渐变情况
下图为周围砖墙边界的位移场变化。这里截取的不够密,应当是以波的形势来传递的。
7结语
本文仅提供zi弹穿墙案例所需要的技术条件,其中的参数标定、结果分析可在本文基础上完成。
工程师必备
- 项目客服
- 培训客服
- 平台客服
TOP




















