【PFC6.0】三维Cluster模拟混合料混凝土
0 引言
对于含集料混凝土,集料强度相对于水泥强度高很多,所以一般不会考虑到集料的可破坏性。所以大部分情况下,使用clump来模拟集料混凝土也就够了。但是在一些特别的受集中力的工况下,集料的破坏也不少见,这种情况就需要去考虑集料的破坏了。
本文基于已有的研究成果,提出一种以cluster为集料颗粒的混凝土成样方式,并用单轴实验来进行测试。
1 成样
对于混凝土,集料一般不是很多,这里在空间中生成松散的ball代替集料。
model new
def par
width=2
height=width*2
rdmin=0.2
rdmax=0.4
poro=0.8
end
@par
domain extent [-width*2.0] [width*2.0] [-width*2.0] [width*2.0] ...
[height*2.0]
model random 10001
wall generate box [-width*0.5] [width*0.5] [-width*0.5] [width*0.5] ...
[height*0.5] expand 1.5
ball distribute porosity @poro radius [rdmin] [rdmax] box ...
[width*0.5] [-width*0.5] [width*0.5] [-height*0.5] [height*0.5]
ball attribute density 2e3 damp 0.7
contact cmat default model linear method deform emod 100e6 kratio 1.5
model cycle 2000 calm 50
ball property "fric" 0.5
model solve
model save "sample"
结果如图所示:
2 clump替换
这里还是用的上一个案例【【PFC6.0】三维Cluster碎石三轴模拟】的clump模板,这个工况对模板的要求不高,可以自行生成模板。
model restore "sample"
def importTemplate
loop n(1,4)
stlName="Rock"+string(n)
fileName="Template\\"+stlName+".p3clp"
command
clump template import @fileName name @stlName
endcommand
endloop
end
@importTemplate
def GetTemplateName
rd=math.random.uniform
if rd<0.25 then
GetTemplateName="Rock1"
else if rd<0.5 then
GetTemplateName="Rock2"
else if rd<0.75 then
GetTemplateName="Rock3"
else
GetTemplateName="Rock4"
endif
end
[clump_count=1]
def tihuan
loop foreach bp ball.list
x_pos = ball.pos(bp,1)
y_pos = ball.pos(bp,2)
z_pos = ball.pos(bp,3)
bvol = (4/3.0)*math.pi*ball.radius(bp)^3
template_name=GetTemplateName
ball.delete(bp)
angle= math.random.uniform*180
axis_x=math.random.uniform-0.5
axis_y=math.random.uniform-0.5
axis_z=math.random.uniform-0.5
axis=vector(axis_x,axis_y,axis_z)
command
clump replicate id @clump_count name @template_name ...
pos-x @x_pos pos-y @y_pos pos-z @z_pos ...
volume @bvol angle @angle axis @axis
clump group @template_name range id @clump_count
endcommand
clump_count+=1
endloop
end
@tihuan
clump attribute density 2e3 damp 0.7
cmat default type pebble-facet model linear method deform emod 1000e6 kratio 1.5
clump attribute density 2.3e3 damp 0.7
[yasuo_time=5]
wall delete
wall generate box [-width] [width] [-width] [width] ...
[-height] [height]
wall attribute velocity-z [(height*0.5)/yasuo_time] range id 1
wall attribute velocity-z [-(height*0.5)/yasuo_time] range id 2
wall attribute velocity-x [(width*0.5)/yasuo_time] range id 3
wall attribute velocity-x [-(width*0.5)/yasuo_time] range id 4
wall attribute velocity-y [(width*0.5)/yasuo_time] range id 5
wall attribute velocity-y [-width*0.5/yasuo_time] range id 6
solve time [yasuo_time*0.3] calm 10
solve time [yasuo_time*0.7]
wall attribute velocity 0 0 0
model solve
model save "tihuan_clump"
3 集料区域获取
这里我们把集料的范围进行提取,这里用的是clump export geometry方法。把四个clump形状提取出四个clump geometry。
model restore "tihuan_clump"
geometry delete
clump export geometry set "Rock1" range group "Rock1"
clump export geometry set "Rock2" range group "Rock2"
clump export geometry set "Rock3" range group "Rock3"
clump export geometry set "Rock4" range group "Rock4"
model save "GeoOut"
如图:
4 重生成细颗粒
这里需要把之前的颗粒删除,然后重新生成细颗粒,方便在后面把geometry范围内的颗粒聚合成cluster
model restore "GeoOut"
clump delete
[rdmin=0.04]
[rdmax=0.06]
[poro=0.3]
ball distribute porosity @poro radius [rdmin] [rdmax] box ...
[-width*0.5] [width*0.5] [-width*0.5] [width*0.5] [-height*0.5] [height*0.5]
ball attribute density 2e3 damp 0.7
model cycle 2000 calm 50
ball property "fric" 0.5
model solve
model save "re_sample"
如图:
5 加胶结
这里将不同geometry范围的颗粒进行胶结。
model restore "re_sample"
ball group "Rock1" range geometry-space "Rock1" inside
ball group "Rock2" range geometry-space "Rock2" inside
ball group "Rock3" range geometry-space "Rock3" inside
ball group "Rock4" range geometry-space "Rock4" inside
cmat default model linearpbond method deform emod 1e9 kratio 1.5 pb_deform emod 1e9 kratio 1.5 ...
property pb_coh 10e6 pb_ten 10e6 pb_fa 50 fric 0.1 lin_mode 1
cmat add 1 model linear method deform emod 10e9 kratio 1.5 ...
property lin_mode 1 range contact type "ball-facet"
cmat add 2 model linearpbond method deform emod 5e9 kratio 1.5 pb_deform emod 5e9 kratio 1.5 ...
property pb_coh 15e6 pb_ten 15e6 pb_fa 50 fric 0.1 lin_mode 1 range group "Rock1" match 2
cmat add 3 model linearpbond method deform emod 6e9 kratio 1.5 pb_deform emod 6e9 kratio 1.5 ...
property pb_coh 18e6 pb_ten 18e6 pb_fa 50 fric 0.1 lin_mode 1 range group "Rock2" match 2
cmat add 4 model linearpbond method deform emod 7e9 kratio 1.5 pb_deform emod 7e9 kratio 1.5 ...
property pb_coh 20e6 pb_ten 20e6 pb_fa 50 fric 0.1 lin_mode 1 range group "Rock3" match 2
cmat add 5 model linearpbond method deform emod 8e9 kratio 1.5 pb_deform emod 8e9 kratio 1.5 ...
property pb_coh 22e6 pb_ten 22e6 pb_fa 50 fric 0.1 lin_mode 1 range group "Rock4" match 2
cmat apply
model clean
contact method bond gap [rdmin]
contact property lin_force 0 0 0
ball attribute force-contact 0 0 0 moment-contact 0 0 0
model calm
model cycle 1
model solve
model save "jiaojie"
如图:
仅显示集料颗粒看一下:
显示参数做个剖面,也能比较好的看出效果:
6 加载
model restore "jiaojie"
model mechanical time-total 0
wall delete walls range id 3 6
ball attribute displacement multiply 0
def wall_init
wpUp=wall.find(2)
wpDown=wall.find(1)
end
@wall_init
[IZ0=wall.pos.z(wpUp)-wall.pos.z(wpDown)]
[strainrate=0.01]
wall attribute vel-z [-IZ0*strainrate*0.5] range id 2
wall attribute vel-z [IZ0*strainrate*0.5] range id 1
def jiance
whilestepping
wzss=(wall.force.contact.z(wpUp)-wall.force.contact.z(wpDown))*0.5/(width*width)
wlz=wall.pos.z(wpUp)-wall.pos.z(wpDown)
end
[final_time=2e-2/strainrate]
[baocunpinlv=final_time/40.0]
[time_record=-100]
[count=0]
def savefile
time=mech.time.total
wezz=(wlz-IZ0)/IZ0
if time-time_record >= baocunpinlv then
filename=string.build("jieguo_%1",count)
command
model save @filename
endcommand
time_record=time
count +=1
endif
end
fish callback add @savefile -1.0
program call "fracture.p3fis"
history delete
history id 1 @wzss
history id 2 @wezz
@track_init
model solve time @final_time
model save "result"
首先看一下整体情况:
基本上是一个标准的胶结材料单轴的力学特性。
那再看点好玩的东西。
写了一个简单的接触分组代码,可以筛选出当前接触中的强接触,分界的阈值时平均力的1.5倍。
首先单轴工况下,竖向接触受力,横向接触基本不受力。所以这里认为横向接触都是弱接触。强弱的区分只考虑在竖向接触中
model restore "jieguo_6"
def GetAverageForce
allForce=0
num=0
loop foreach ct contact.list("ball-ball")
forceVec=math.unit(contact.normal(ct))
dip=math.dip.from.normal(forceVec)
if dip<math.pi*0.25 | dip>math.pi*0.75 then
allForce+=math.mag(contact.force.global(ct))
num+=1
contact.group(ct,"dirt")="shuxiang"
else
contact.group(ct,"dirt")="hengxiang"
contact.group(ct,"mag")="ruo"
endif
endloop
AverageForce=allForce/float(num)
end
@GetAverageForce
def ContactGroup
test_num=0
loop foreach ct contact.list("ball-ball")
if contact.group(ct,"dirt")="hengxiang" then
continue
endif
if math.mag(contact.force.global(ct))> AverageForce*1.5 then
contact.group(ct,"mag")="qiang"
else
contact.group(ct,"mag")="ruo"
endif
test_num+=1
endloop
end
@ContactGroup
区分完后显示强接触和geometry,就可以发现集料在混凝土中的骨架性作用了。
通过切剖面也可以:
再看破坏,质地比较脆的rock1和rock2在破碎面上还是有一些破坏的
取一个剖面分析。对于集料,需要有两点认识了。在当前参数情况下,水泥参数比较软,所以力主要由集料承担,所以集料也控制着破坏。材料失稳必然是集料发生了破坏。第二是破坏后,破裂面其实是会在集料边缘绕行的。
这里应该可分析的东西挺多的,精力有限,暂不做深入的分析。
还是按老规矩,集赞50可得当前项目包。
查看更多评论 >