首发于PFC学习
PFC6.0 案例-2-Simple Rigid Block Bonded-Block Modeling (BBM)简单刚性粘结块建模(BBM)(翻译自help文件)

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事件,并激活接触的每一侧刚性块周围的全部或部分接触。

图1:初始样本。

用户必须意识到,如果使用基于线性接触模型的接触模型,则必须将属性lin_mode设置为1,以便法向力逐渐累积,否则,初始重叠将导致初始接触力,从而导致不稳定

模拟结果

对试样进行了单向拉伸试验和直接拉伸试验。通过指定整个试件的初始速度,而不仅仅是模板的初始速度,可以减少应力-应变响应中的任何虚假振荡。采用FISH函数计算应力、应变和杨氏模量,并保存了这些量的历史。目标材料为脆性较强的岩石,杨氏模量为50 GPa, UCS强度~ 110 MPa,抗拉强度~ 10 MPa。本仿真采用无任何软化的软粘结接触模型(Soft band contact)。在没有软化的情况下,该模型的响应类似于线性平行粘结( Linear Parallel Bond )模型,但有以下几个显著的例外:

  1. 剪切破坏时,剪切力不是减小到0,而是减小到摩擦滑动极限;
  2. 三维扭转抗力对无粘结刚性块体非常重要;
  3. 只需要一个法向刚度和剪切刚度,而不是分开的平行粘结和线性刚度。

下图显示了UCS结果运行时,残余强度为峰值的80%。达到了期望的峰值,计算的断片显示了试样的彻底破坏,包括拉伸和剪切破坏。

图2:粘结破坏的UCS结果。
图3:计算UCS测试的片段。

下图显示了直接拉伸试验运行的结果,使残余强度是峰值的80%。在用作模板的刚性块的边缘附近有两个不同的破坏平面。达到了预期的抗拉强度。

图4:失效键的直接张力结果。
图5:直接拉伸试验的计算。

代码

; 清除模型状态并创建所有刚性块都存在的域
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'

发布于 2021-09-22 18:09