使用命令BALL和GENERATE 可以生成颗粒。BALL命令只能单个生成的颗粒,且可
以相互重叠;GENERATE 命令可以生成颗粒组,但自动生成的一组颗粒间没有重叠。
生成的颗粒组有两种,一种是规则的排列,用于模拟结构部件,这种阵列的初始接触力
可以精确的预测;另一种是不规则的排列,用于模拟实体或内部结构无序的粒状材料,要预
估其初始接触力量值是不可能的。对于第二种颗粒组,尽管颗粒排列是任意的,但某些特性
还是需要在颗粒生成后添加,比如弱面或各向异性强度等。
规则排列
通过用户自定义FISH 函数,在循环体内使用BALL命令生成。示例如下
loop row (1,n_row)
loop col (1,n_col)
command
ball id=idc x=xc y=yc rad=rc
end_command
idc = idc + 1
xc = xc + r2
end_loop
yc = yc + yinc
xc = x0 + radius * (row - (row/2) * 2)
end_loop
不规则排列
一般,边界都是由墙定义好的,要在给定空间内生成颗粒,既要保证孔隙比符合要求,
又要使组合达到平衡。显然,孔隙比不能任意的小。
无法将圆颗粒在紧密堆积时将他们设置在任意紧密的区域(低孔隙比)。这里讨论两种方
法来以给定的半径和孔隙比生成颗粒,这两种方法都是先固定边界,即半径扩大法和颗粒排
斥法。还有一种方法是移动边界法,可以得到精确的孔隙比,但这种方法有三个缺点:边界
条件改变了;达到平衡的时间很慢;最终分布很不均匀。
半径扩大法和颗粒排斥法中,颗粒半径按照某种概率分布生成,如均匀分布或高斯分布,
也可以通过FISH自定义其分布形式。
BALL和GENERATE 的具体用法,参考《PFC2D 学习笔记之命令篇》。
半径扩大法
其基本FISH函数语句如下:
mult = 1.6 ; initial radius multiplication factor
n0 = 1.0 - (1.0 - poros) / multˆ2
r0 = sqrt(height*width*(1.0 - n0)/(pi*num))
rlo = 2.0 * r0 / (1.0 + rat)
rhi = rat * rlo
... ...
gen id=1,num rad=rlo,rhi x=0,width y=0,height
prop dens=1000 ks=s_stiff kn=n_stiff
... ...
sum = 0.0
bp = ball_head
loop while bp # null
sum = sum + pi * b_rad(bp)ˆ2
bp = b_next(bp)
end_loop
pmeas = 1.0 - sum / (width * height)
mult = sqrt((1.0 - poros) / (1.0 - pmeas))
ini rad mul mult
cycle 1000
prop fric 0.2
cycle 2000
注意,为了使颗粒组在比较快的时间内达到平衡,必须设置在CYCLE 前使用FRIC 设置摩擦系
数,用于消散颗粒能量,但这种干预方式阻碍了颗粒的自由运动,对其最终组合状态有影响。因
此,需要根据经验来设置FRIC 的大小,以在计算机时间和颗粒组合状态之间找到一个平衡。
可以通过设置测量圆,来观察颗粒局部参数,并判断是否达到平衡状态。
颗粒排斥法
该方法在颗粒半径的上下限之间随即生成颗粒半径,并随即生成球心坐标,再FISH 函
数的循环体中采用BALL命令不断创建颗粒,直至得到所要的孔隙比。BALL命令允许颗粒
发生重叠,以至于当重叠部分比颗粒半径还大的时候,其初始速度很大,甚至有些颗粒会穿
过边界墙体飞出。如果颗粒飞出墙体空间,则其孔隙比将发生变化,为了防止这种情况的发
生,在刚开始的CYCLE 中,每隔几个时间步就把动能归零(通过设置平动和转动速度为零
来实现),然后正常收敛到平衡状态。
其核心程序如下:
loop n (1,n_max)
r_ball = rlo + urand * (rhi - rlo)
pvol_new = pvol_sum + pi * r_ballˆ2
if (1.0 - pvol_new / tot_vol) < poros then
exit section ; (new porosity will be < that specified)
end_if
rb2 = r_ball * 2.0
x_ball = r_ball + urand * (width - rb2)
y_ball = r_ball + urand * (height - rb2)
command
ball x=x_ball y=y_ball rad=r_ball
end_command
pvol_sum = pvol_new
count = count + 1
end_loop
··· ···
loop n (1,4)
command
cycle 5
ini xvel 0 yvel 0
end_command
end_loop
颗粒半径非均匀分布
有时候,需要在空间的不同部分生成不同大小的颗粒。这时,可以用WALL 将空间区
域分隔成多个区域,在每个区域按照单区域形式生成颗粒组(其方法即前面介绍的规则排列
法和不规则排列法中的两种方法)。当每个区域都生成颗粒组并分别达到平衡后,使用命令
DEL WALL ID 将隔墙删除。也可以不设隔墙,采用坐标控制颗粒的生成区域,但这种方法
生成颗粒组后,若经过CYCLE 平衡后,颗粒将不能完全停留在各自的原始区域。
其核心程序并无特别之处,参考前面介绍的颗粒生成方法。
复杂形状区域内生成颗粒组
有时,颗粒分布区的边界条件并非矩形或圆形区域,而是很复杂的,例如大区域内部
有空洞,相交边界墙非正交,环形区域等。这种情况下就要通过几个步骤来实现颗粒组的生
成。
可以在适当的地方设置临时WALL,在GENERATE 命令中使用关键字NO_SHADOW
来限制生成的颗粒不会出现在WALL的影子区。当生成完颗粒组以后,使用命令DELWALL
ID 将临时WALL删除。
另一种通用的方法是写一个FISH 函数作为生成过滤器,并调用GENERATE 命令的
FILTER 关键字。FILTER 的用法参考《PFC2D 学习笔记之命令篇》。
以矩形环区域为例,说明生成过滤器的核心程序:
_brad = fc_arg(0)
_bx = fc_arg(1)
_by = fc_arg(2)
_skip = 0
······
if _rx < ff_r1 then
if _ry < ff_r1 then
_skip = 1
end_if
end_if
ff_rect = _skip
······
generate x=(@_xlo, @_xhi) y=(@_ylo, @_yhi) &
rad=(0.09, 0.11) filter=ff_rect id=(1,250)
创建复杂颗粒——颗粒簇
可以将几个颗粒粘结在一起,形成颗粒簇,其行为用于模拟一个非均匀形态的颗粒。
可以使用FISH 函数在给定空间中创建这种粘结性的颗粒簇。“爆炸—排斥”法(即前文所
述的颗粒排斥法)可以用于将这种颗粒簇压缩到稳定排列形式;另一种方法是通过FISH 函
数将这些颗粒簇放置在预定位置。颗粒簇在受到大于其粘结强度的外力时,形成颗粒簇的颗
粒间的粘结会破坏,以致颗粒簇内部的颗粒会分离,这也常用来模拟颗粒的破碎行为。
以ROCKFALL为例,说明其核心程序如下:
问题的提出:在落石过程中,边坡堆积层的行为取决于许多因素,包括单元几何形状
及其特性,粘聚性及其破坏等。该模拟可以用于研究陡立坡的稳定性、堆积层防护结构设计
以及边坡不同滑动面组合。
mcbp = ball_head ; local ball pointer storage
b_max_id = max_bid
mc_start_id = b_max_id + 1 ; start id for this group of clusters
num_range = end_id-start_id+1 ; number of main particles involved
num_done = 0 ; number of main particles completed
section
loop while mcbp # null ; this way we step thru balls once
next_mcbp = b_next(mcbp) ; need to collect now before ball deleted
if b_id(mcbp) >= start_id ; is current ball in required range?
if b_id(mcbp) <= end_id
b_max_id = b_max_id + 1 ; will be id for new main ball
clust_start_id = b_max_id ; start id of cluster balls
mb_id = b_id(mcbp) ; main ball id
mb_rad = b_rad(mcbp) ; main ball radius
mb_x = b_x(mcbp) ; main ball x coord
mb_y = b_y(mcbp) ; main ball y coord
command
del ball range id mb_id mb_id ; make contiguous id range for cluster
ball id clust_start_id x mb_x y mb_y rad mb_rad
endcommand
start_ang = urand * 2.0 * pi ; random orientation for cluster
if cl_tight <= 0.0 ; governs overlap of cluster particles
cl_tight = 1.0
endif
pc_rad = 2.0 * mb_rad * cl_tight
if cl_balls >= 7 ; limit of 7 particles
cl_balls = 7
endif
if cl_pack = 1
inc_ang = 2.0 * pi / (float(cl_balls) - 1.0)
else
inc_ang = pi / 3.0
endif
loop j (1, cl_balls - 1)
b_max_id = b_max_id + 1
xx = pc_rad * cos(start_ang) + mb_x
yy = pc_rad * sin(start_ang) + mb_y
command
ball id b_max_id x xx y yy rad mb_rad
endcommand
start_ang = start_ang + inc_ang
endloop
command
range name temp id clust_start_id b_max_id
prop pb_s cl_pbs pb_n cl_pbn range temp
prop pb_kn cl_pbkn pb_ks cl_pbks pb_r cl_pbr range temp
prop kn cl_kn ks cl_ks n_b cl_nb s_b cl_sb range temp
prop fric cl_fric dens cl_dens range temp
endcommand
num_done = num_done + 1
endif
endif
if num_done = num_range ; jump off the train
exit section
endif
mcbp = next_mcbp
endloop
endsection
mc_end_id = b_max_id ; last id for this collection
······
loop i (1, cl_damp) ; ... while we let the cluster settle
command ; down a bit (user sets iterations) ...
cycle 10
ini xvel 0 yvel 0
endcommand
endloop
创建聚粒
另一种形成非均匀形态颗粒的方法就是是使用聚粒。聚粒和颗粒簇的不同之处在于,形
成聚粒的颗粒之间的粘结不会发生破坏,即整个聚粒可以看做一个超级颗粒。
首先,在一个空间中生成指定孔隙比的圆颗粒组;然后每个颗粒转化成同体积同质量
的聚粒;最后聚粒组逐步达到平衡。
其核心程序就是,先分别生成某聚粒的各个组员,然后使用命令
clumpclp= cl_add(null,_b1)
ii = cl_add(clp,_b2)
形成CLUMP,然后通过以下语句使聚粒组达到平衡状态:
loop i (1,100)
command
cyc 5
end_command
clp = clump_head
loop while clp # null
cl_xvel(clp) = 0.0
cl_yvel(clp) = 0.0
cl_rvel(clp) = 0.0
clp = cl_next(clp)
end_loop
end_loop
优化
为了不用搜索全部颗粒组就能探测到潜在接触,PFC2D将所有颗粒都纳入“细胞空间”。
用户可以在数据文件的最开始就使用命令SET MAX_BALLS N,这个N 只是用户预期的颗
粒数目,而不需要很精确;后面对MAX_BALL的重定义将被忽视。该数字N 有助于PFC2D
确定最优细胞数。
可以通过PRINT CELL 或PLOT CELL命令确定细胞数目。每个细胞中颗粒数以5 到
20 个为宜,过多过少都会影响程序执行效率。
关于CELL SPACE:
PFC2D 中,每个物理实体,如球、墙、接触,都会用一个数据单元表示。该数据单元
是C++语言中的动态数据结构,在列表内用指针将数据单元与数据结构连接。不再需要的数
据单元会放入堆里,并且在需要新数据单元的时候,会在分配内存之前首先在堆里寻找废弃
的数据单元再利用。连接表更新所需的计算时间很少,每次只需要添加或删除两三个整数而
已,而不用重新排序。
每个数据单元包括其所属实体的几何和物理数据,以及指向下一个相似单元(该单元
可以在连接表的任何位置)的指针。每个BALL 单元包括指向它的接触列表的一个指针。
每个接触单元包括一个指向该接触涉及的两个实体的指针。
需要注意的是,每个实体连接图和搜索函数所需要的计算时间取决于实体的大小和形
状,而不是系统中实体的个数。假定细胞面积和平均实体面积成比例,邻居探测多需要的总
计算时间与实体数成比例。
很难用一个公式来计算最优细胞大小。如果只用一个细胞,则整个搜索时间将是二次
方。随着细胞数的增加,相邻实体间调用某实体的次数将减少。但是随着细胞数的继续增加,
MAPING和SEARCHING所需要的时间可能会随之增加。PFC2D 使用一种试探性算法来确
定最优细胞密度。如果在一个模型中哟大量颗粒,在生成颗粒之前使用命令SET
MAX_BALLS 会有助于程序提高效率。
每个实体的累积位移将被记录下来,当任何一个累积位移超过设定的CTOL 时,程序
将对系统内的实体进行REMAPPING,并激活接触探测。接触探测将在比实体封装体增大
的区域内进行搜索。如果任何实体运动超出了细胞空间的范围,则细胞空间将
重新定义,将影响尺寸再增大10%,并且所有实体将重新MAP。
CTOL的值也用来判断接触是重建还是删除。如果两个实体之间的间距小于等于CTOL,
则重建接触,反之则删除接触。这种逻辑确保物理接触发生前就已经形成潜在接触的数据结
构,并确保接触搜索只在运动实体间发生,而不会在相对活动很小的实体上浪费时间。因此,
花费时间较长的接触探测并非每个力学步都要进行。
以相互重叠;GENERATE 命令可以生成颗粒组,但自动生成的一组颗粒间没有重叠。
生成的颗粒组有两种,一种是规则的排列,用于模拟结构部件,这种阵列的初始接触力
可以精确的预测;另一种是不规则的排列,用于模拟实体或内部结构无序的粒状材料,要预
估其初始接触力量值是不可能的。对于第二种颗粒组,尽管颗粒排列是任意的,但某些特性
还是需要在颗粒生成后添加,比如弱面或各向异性强度等。
规则排列
通过用户自定义FISH 函数,在循环体内使用BALL命令生成。示例如下
loop row (1,n_row)
loop col (1,n_col)
command
ball id=idc x=xc y=yc rad=rc
end_command
idc = idc + 1
xc = xc + r2
end_loop
yc = yc + yinc
xc = x0 + radius * (row - (row/2) * 2)
end_loop
不规则排列
一般,边界都是由墙定义好的,要在给定空间内生成颗粒,既要保证孔隙比符合要求,
又要使组合达到平衡。显然,孔隙比不能任意的小。
无法将圆颗粒在紧密堆积时将他们设置在任意紧密的区域(低孔隙比)。这里讨论两种方
法来以给定的半径和孔隙比生成颗粒,这两种方法都是先固定边界,即半径扩大法和颗粒排
斥法。还有一种方法是移动边界法,可以得到精确的孔隙比,但这种方法有三个缺点:边界
条件改变了;达到平衡的时间很慢;最终分布很不均匀。
半径扩大法和颗粒排斥法中,颗粒半径按照某种概率分布生成,如均匀分布或高斯分布,
也可以通过FISH自定义其分布形式。
BALL和GENERATE 的具体用法,参考《PFC2D 学习笔记之命令篇》。
半径扩大法
其基本FISH函数语句如下:
mult = 1.6 ; initial radius multiplication factor
n0 = 1.0 - (1.0 - poros) / multˆ2
r0 = sqrt(height*width*(1.0 - n0)/(pi*num))
rlo = 2.0 * r0 / (1.0 + rat)
rhi = rat * rlo
... ...
gen id=1,num rad=rlo,rhi x=0,width y=0,height
prop dens=1000 ks=s_stiff kn=n_stiff
... ...
sum = 0.0
bp = ball_head
loop while bp # null
sum = sum + pi * b_rad(bp)ˆ2
bp = b_next(bp)
end_loop
pmeas = 1.0 - sum / (width * height)
mult = sqrt((1.0 - poros) / (1.0 - pmeas))
ini rad mul mult
cycle 1000
prop fric 0.2
cycle 2000
注意,为了使颗粒组在比较快的时间内达到平衡,必须设置在CYCLE 前使用FRIC 设置摩擦系
数,用于消散颗粒能量,但这种干预方式阻碍了颗粒的自由运动,对其最终组合状态有影响。因
此,需要根据经验来设置FRIC 的大小,以在计算机时间和颗粒组合状态之间找到一个平衡。
可以通过设置测量圆,来观察颗粒局部参数,并判断是否达到平衡状态。
颗粒排斥法
该方法在颗粒半径的上下限之间随即生成颗粒半径,并随即生成球心坐标,再FISH 函
数的循环体中采用BALL命令不断创建颗粒,直至得到所要的孔隙比。BALL命令允许颗粒
发生重叠,以至于当重叠部分比颗粒半径还大的时候,其初始速度很大,甚至有些颗粒会穿
过边界墙体飞出。如果颗粒飞出墙体空间,则其孔隙比将发生变化,为了防止这种情况的发
生,在刚开始的CYCLE 中,每隔几个时间步就把动能归零(通过设置平动和转动速度为零
来实现),然后正常收敛到平衡状态。
其核心程序如下:
loop n (1,n_max)
r_ball = rlo + urand * (rhi - rlo)
pvol_new = pvol_sum + pi * r_ballˆ2
if (1.0 - pvol_new / tot_vol) < poros then
exit section ; (new porosity will be < that specified)
end_if
rb2 = r_ball * 2.0
x_ball = r_ball + urand * (width - rb2)
y_ball = r_ball + urand * (height - rb2)
command
ball x=x_ball y=y_ball rad=r_ball
end_command
pvol_sum = pvol_new
count = count + 1
end_loop
··· ···
loop n (1,4)
command
cycle 5
ini xvel 0 yvel 0
end_command
end_loop
颗粒半径非均匀分布
有时候,需要在空间的不同部分生成不同大小的颗粒。这时,可以用WALL 将空间区
域分隔成多个区域,在每个区域按照单区域形式生成颗粒组(其方法即前面介绍的规则排列
法和不规则排列法中的两种方法)。当每个区域都生成颗粒组并分别达到平衡后,使用命令
DEL WALL ID 将隔墙删除。也可以不设隔墙,采用坐标控制颗粒的生成区域,但这种方法
生成颗粒组后,若经过CYCLE 平衡后,颗粒将不能完全停留在各自的原始区域。
其核心程序并无特别之处,参考前面介绍的颗粒生成方法。
复杂形状区域内生成颗粒组
有时,颗粒分布区的边界条件并非矩形或圆形区域,而是很复杂的,例如大区域内部
有空洞,相交边界墙非正交,环形区域等。这种情况下就要通过几个步骤来实现颗粒组的生
成。
可以在适当的地方设置临时WALL,在GENERATE 命令中使用关键字NO_SHADOW
来限制生成的颗粒不会出现在WALL的影子区。当生成完颗粒组以后,使用命令DELWALL
ID 将临时WALL删除。
另一种通用的方法是写一个FISH 函数作为生成过滤器,并调用GENERATE 命令的
FILTER 关键字。FILTER 的用法参考《PFC2D 学习笔记之命令篇》。
以矩形环区域为例,说明生成过滤器的核心程序:
_brad = fc_arg(0)
_bx = fc_arg(1)
_by = fc_arg(2)
_skip = 0
······
if _rx < ff_r1 then
if _ry < ff_r1 then
_skip = 1
end_if
end_if
ff_rect = _skip
······
generate x=(@_xlo, @_xhi) y=(@_ylo, @_yhi) &
rad=(0.09, 0.11) filter=ff_rect id=(1,250)
创建复杂颗粒——颗粒簇
可以将几个颗粒粘结在一起,形成颗粒簇,其行为用于模拟一个非均匀形态的颗粒。
可以使用FISH 函数在给定空间中创建这种粘结性的颗粒簇。“爆炸—排斥”法(即前文所
述的颗粒排斥法)可以用于将这种颗粒簇压缩到稳定排列形式;另一种方法是通过FISH 函
数将这些颗粒簇放置在预定位置。颗粒簇在受到大于其粘结强度的外力时,形成颗粒簇的颗
粒间的粘结会破坏,以致颗粒簇内部的颗粒会分离,这也常用来模拟颗粒的破碎行为。
以ROCKFALL为例,说明其核心程序如下:
问题的提出:在落石过程中,边坡堆积层的行为取决于许多因素,包括单元几何形状
及其特性,粘聚性及其破坏等。该模拟可以用于研究陡立坡的稳定性、堆积层防护结构设计
以及边坡不同滑动面组合。
mcbp = ball_head ; local ball pointer storage
b_max_id = max_bid
mc_start_id = b_max_id + 1 ; start id for this group of clusters
num_range = end_id-start_id+1 ; number of main particles involved
num_done = 0 ; number of main particles completed
section
loop while mcbp # null ; this way we step thru balls once
next_mcbp = b_next(mcbp) ; need to collect now before ball deleted
if b_id(mcbp) >= start_id ; is current ball in required range?
if b_id(mcbp) <= end_id
b_max_id = b_max_id + 1 ; will be id for new main ball
clust_start_id = b_max_id ; start id of cluster balls
mb_id = b_id(mcbp) ; main ball id
mb_rad = b_rad(mcbp) ; main ball radius
mb_x = b_x(mcbp) ; main ball x coord
mb_y = b_y(mcbp) ; main ball y coord
command
del ball range id mb_id mb_id ; make contiguous id range for cluster
ball id clust_start_id x mb_x y mb_y rad mb_rad
endcommand
start_ang = urand * 2.0 * pi ; random orientation for cluster
if cl_tight <= 0.0 ; governs overlap of cluster particles
cl_tight = 1.0
endif
pc_rad = 2.0 * mb_rad * cl_tight
if cl_balls >= 7 ; limit of 7 particles
cl_balls = 7
endif
if cl_pack = 1
inc_ang = 2.0 * pi / (float(cl_balls) - 1.0)
else
inc_ang = pi / 3.0
endif
loop j (1, cl_balls - 1)
b_max_id = b_max_id + 1
xx = pc_rad * cos(start_ang) + mb_x
yy = pc_rad * sin(start_ang) + mb_y
command
ball id b_max_id x xx y yy rad mb_rad
endcommand
start_ang = start_ang + inc_ang
endloop
command
range name temp id clust_start_id b_max_id
prop pb_s cl_pbs pb_n cl_pbn range temp
prop pb_kn cl_pbkn pb_ks cl_pbks pb_r cl_pbr range temp
prop kn cl_kn ks cl_ks n_b cl_nb s_b cl_sb range temp
prop fric cl_fric dens cl_dens range temp
endcommand
num_done = num_done + 1
endif
endif
if num_done = num_range ; jump off the train
exit section
endif
mcbp = next_mcbp
endloop
endsection
mc_end_id = b_max_id ; last id for this collection
······
loop i (1, cl_damp) ; ... while we let the cluster settle
command ; down a bit (user sets iterations) ...
cycle 10
ini xvel 0 yvel 0
endcommand
endloop
创建聚粒
另一种形成非均匀形态颗粒的方法就是是使用聚粒。聚粒和颗粒簇的不同之处在于,形
成聚粒的颗粒之间的粘结不会发生破坏,即整个聚粒可以看做一个超级颗粒。
首先,在一个空间中生成指定孔隙比的圆颗粒组;然后每个颗粒转化成同体积同质量
的聚粒;最后聚粒组逐步达到平衡。
其核心程序就是,先分别生成某聚粒的各个组员,然后使用命令
clumpclp= cl_add(null,_b1)
ii = cl_add(clp,_b2)
形成CLUMP,然后通过以下语句使聚粒组达到平衡状态:
loop i (1,100)
command
cyc 5
end_command
clp = clump_head
loop while clp # null
cl_xvel(clp) = 0.0
cl_yvel(clp) = 0.0
cl_rvel(clp) = 0.0
clp = cl_next(clp)
end_loop
end_loop
优化
为了不用搜索全部颗粒组就能探测到潜在接触,PFC2D将所有颗粒都纳入“细胞空间”。
用户可以在数据文件的最开始就使用命令SET MAX_BALLS N,这个N 只是用户预期的颗
粒数目,而不需要很精确;后面对MAX_BALL的重定义将被忽视。该数字N 有助于PFC2D
确定最优细胞数。
可以通过PRINT CELL 或PLOT CELL命令确定细胞数目。每个细胞中颗粒数以5 到
20 个为宜,过多过少都会影响程序执行效率。
关于CELL SPACE:
PFC2D 中,每个物理实体,如球、墙、接触,都会用一个数据单元表示。该数据单元
是C++语言中的动态数据结构,在列表内用指针将数据单元与数据结构连接。不再需要的数
据单元会放入堆里,并且在需要新数据单元的时候,会在分配内存之前首先在堆里寻找废弃
的数据单元再利用。连接表更新所需的计算时间很少,每次只需要添加或删除两三个整数而
已,而不用重新排序。
每个数据单元包括其所属实体的几何和物理数据,以及指向下一个相似单元(该单元
可以在连接表的任何位置)的指针。每个BALL 单元包括指向它的接触列表的一个指针。
每个接触单元包括一个指向该接触涉及的两个实体的指针。
需要注意的是,每个实体连接图和搜索函数所需要的计算时间取决于实体的大小和形
状,而不是系统中实体的个数。假定细胞面积和平均实体面积成比例,邻居探测多需要的总
计算时间与实体数成比例。
很难用一个公式来计算最优细胞大小。如果只用一个细胞,则整个搜索时间将是二次
方。随着细胞数的增加,相邻实体间调用某实体的次数将减少。但是随着细胞数的继续增加,
MAPING和SEARCHING所需要的时间可能会随之增加。PFC2D 使用一种试探性算法来确
定最优细胞密度。如果在一个模型中哟大量颗粒,在生成颗粒之前使用命令SET
MAX_BALLS 会有助于程序提高效率。
每个实体的累积位移将被记录下来,当任何一个累积位移超过设定的CTOL 时,程序
将对系统内的实体进行REMAPPING,并激活接触探测。接触探测将在比实体封装体增大
的区域内进行搜索。如果任何实体运动超出了细胞空间的范围,则细胞空间将
重新定义,将影响尺寸再增大10%,并且所有实体将重新MAP。
CTOL的值也用来判断接触是重建还是删除。如果两个实体之间的间距小于等于CTOL,
则重建接触,反之则删除接触。这种逻辑确保物理接触发生前就已经形成潜在接触的数据结
构,并确保接触搜索只在运动实体间发生,而不会在相对活动很小的实体上浪费时间。因此,
花费时间较长的接触探测并非每个力学步都要进行。
周四 四月 17, 2014 11:00 pm 由 violinn
» 求助~询问。。PFC2D 求助ing
周五 一月 10, 2014 8:26 pm 由 Ms.Yang
» 求助~询问。。PFC2D
周五 一月 10, 2014 8:25 pm 由 Ms.Yang
» PFC是怎么用颗粒模拟岩体的
周五 十一月 08, 2013 11:25 pm 由 求实engineer
» 希望大家踊跃发言,积极讨论PFC 技术与问题~
周三 六月 19, 2013 9:14 pm 由 yuanyuekafu
» PFC2D学习笔记之流固耦合
周二 四月 23, 2013 11:15 pm 由 yuanyuekafu
» PFC2D学习笔记之使用细则
周二 四月 23, 2013 11:12 pm 由 yuanyuekafu
» PFC学习初期总结
周二 四月 23, 2013 11:07 pm 由 yuanyuekafu
» PFC2D学习笔记之颗粒生成
周二 十月 16, 2012 4:37 pm 由 黄亮岩土