PFC6.0 案例-2-Simple Rigid Block Bonded-Block Modeling (BBM)简单刚性粘结块建模(BBM)(翻译自help文件)
问题描述
这个例子展示了如何有效地使用刚性块进行简单的粘结块建模(BBM)。创建的样本如下所示。这个样本是使用rblock construct命令创建的。这个命令需要一个几何体集并将其网格化,创建一个刚性块的零孔隙填充。然后对刚性块进行缩放,使它们最初重叠。这对于BBM建模很重要,因为当刚性块粘结时,计算的接触位置只会增量更新。换句话说,接触位置不响应重叠区域的变化。相反,你可以把接触位置想象成一个胶水元件的位置,它被固定在刚性块的表面,直到失效。
为了显著提高计算性能,使用rblock erode命令将刚性块四舍五入。这个命令减少了核心形状并引入了舍入。该操作对于具有零孔隙度初始填料的刚性块体建模非常重要,因为侵蚀去除了许多顶点和边缘接触,从某种意义上说,它们将不激活。事实上,在该模型中,有~7700块刚性块,刚性块之间有~ 13000个面-面接触,而顶点-顶点和边-边接触超过225000个。这些接触对测试结果的贡献微不足道,但却极大地增加了计算时间。在这个模型中,通过contact inhibit命令抑制这些接触,这意味着从所有计算中跳过它们。如果人们对非常大的应变感兴趣,这些接触可能是重要的,可以很容易地将FISH函数连接到bond_break事件,并激活接触的每一侧刚性块周围的全部或部分接触。
用户必须意识到,如果使用基于线性接触模型的接触模型,则必须将属性lin_mode设置为1,以便法向力逐渐累积,否则,初始重叠将导致初始接触力,从而导致不稳定。
模拟结果
对试样进行了单向拉伸试验和直接拉伸试验。通过指定整个试件的初始速度,而不仅仅是模板的初始速度,可以减少应力-应变响应中的任何虚假振荡。采用FISH函数计算应力、应变和杨氏模量,并保存了这些量的历史。目标材料为脆性较强的岩石,杨氏模量为50 GPa, UCS强度~ 110 MPa,抗拉强度~ 10 MPa。本仿真采用无任何软化的软粘结接触模型(Soft band contact)。在没有软化的情况下,该模型的响应类似于线性平行粘结( Linear Parallel Bond )模型,但有以下几个显著的例外:
- 剪切破坏时,剪切力不是减小到0,而是减小到摩擦滑动极限;
- 三维扭转抗力对无粘结刚性块体非常重要;
- 只需要一个法向刚度和剪切刚度,而不是分开的平行粘结和线性刚度。
下图显示了UCS结果运行时,残余强度为峰值的80%。达到了期望的峰值,计算的断片显示了试样的彻底破坏,包括拉伸和剪切破坏。
下图显示了直接拉伸试验运行的结果,使残余强度是峰值的80%。在用作模板的刚性块的边缘附近有两个不同的破坏平面。达到了预期的抗拉强度。
代码
; 清除模型状态并创建所有刚性块都存在的域
model new
model domain extent -10 10
;为UCS和直接拉伸测试创建高2.5倍宽的圆柱形几何集
geometry set 'specimen'
[specRadius = 1.5]
[specHeight = 7.0]
geometry generate cylinder base 0 0 [-specHeight/2.0] radius [specRadius] ...
height [specHeight] axis 0 0 1 resolution 0.4
; 创建刚性块作为四面体。这个命令网格几何集,创建刚性块。
rblock construct from-geometry 'specimen' maximum-edge 0.4
;缩放刚性块,使它们最初是重叠的。这是需要的接触位置是正确的,当粘接。
;当调用键合方法时,接触位置只是增量更新。
rblock scale relative 1.01
;腐蚀刚性块,引入圆角。
;这允许剔除大量对模型响应没有贡献的边-边和顶点-顶点接触。
;这有时可能会失败,所以最好使用skip-errors关键字
rblock erode relative skip-errors 0.05
;将顶部和模板组合在一起,这些模板是由刚性块组成的固定块。
rblock group 'top-platen' range position-z [specHeight/2.0 - 0.3] 10
rblock group 'bottom-platen' range position-z [0.3 - specHeight/2.0] -10
;设置阻尼和密度
rblock attribute density 2650 damp 0.7
;粘结抗拉强度
[tensileStrength = 4.7e6]
;内聚力与抗拉强度之比
[cohesionFactor = 2.4]
;目标弹性模量放入键中
[emod = 7.25e10]
;指定软粘结模型属性。
contact cmat default model softbond method deformability emod [emod] ...
kratio 2.0 ...
property sb_ten [tensileStrength] ...
sb_coh [cohesionFactor*tensileStrength] ...
sb_fa 30.0 fric 0.5 sb_mode 1
; Create the contacts and bond them. Note that no softening is used in this
; example so the softbond contacts act essentially as parallel bond contacts
; except that there is only 1 set of stiffnesses and the shear stress is not
; nulled if shear failure occurs.
model clean all
contact method bond
; Make the platen contacts have the null contact model. This is to reduce
; computation and to ensure that they do not contribute to the stress
; computation. The match keyword is used to specify that contacts fall within
; the range if both of the ends have the specified group.
contact model null range group 'top-platen' match 2
contact model null range group 'bottom-platen' match 2
; Inhibit the contacts that are not bonded. This is VERY important for
; efficient bonded ; block models. This means that the force-displacement law
; for edge-edge and vertex-vertex contacts is skipped along with updating the
; contact positions. You can compare the results and runtimes with and without
; the vertex-vertex and edge-edge contacts. If in small strain these contacts
; can actually be deleted with the contact delete command and contact
; detection can be turned off.
contact inhibit range contact gap 0 100
; Fix the velocity and spin of the top and bottom platens
rblock fix vel spin range group 'top-platen'
rblock fix vel spin range group 'bottom-platen'
; Make maps of the rigid blocks in the platens
[topMap = rblock.groupmap('top-platen')]
[botMap = rblock.groupmap('bottom-platen')]
; Define a FISH function to compute the stress and elastic modulus.
; Histories of these quantities will be kept for display.
fish define stress
local stressTop = 0.0
local stressBot = 0.0
strain = 0.0
loop foreach b topMap
stressTop = stressTop + math.abs(rblock.force.contact(b,3))
strain = 2.*math.abs(rblock.disp(b,3))
endloop
loop foreach b botMap
stressBot = stressBot + math.abs(rblock.force.contact(b,3))
endloop
local st = (stressTop + stressBot)/(2.0 * math.pi*specRadius^2);
strain = strain/specHeight
if strain > 0
modulus = st / strain
endif
stress = st
end
fish history @stress
fish history @strain
fish history @modulus
; Set up a FISH halt to end cycling when the stress is 80% of the maximum
[maxStress = 0.0]
[peakPercentage = 0.8]
fish define halt
halt = 0
maxStress = math.max(maxStress,stress)
if stress < peakPercentage * maxStress
halt = 1
endif
end
; Register for fragment computation
fragment register rblock-rblock
; Save the specimen
model save 'specimen'