PFC 学习笔记-002
本文最后更新于:2022年9月8日 晚上
认识篇,PFC 基本建模
PFC 模型生成及预平衡
PFC 项目文件夹构成
PFC 6.0 支持以命令流、Fish 语言、Python 语言三种方式编写模型代码,并且三类方式可以在一定程度上交叉使用,灵活度很高,一个完整的 PFC 6.0 项目文件夹一般包括如下几类文件:
1 |
|
PFC 6.0 一般在文件后缀中采用 3 和 2 来标识该文件是三维还是二维的项目文件,如*.p3dat
、*.p3prj
等表示的就是三维的项目文件。
由于 PFC 是允许 Fish 代码与命令流相互嵌套使用的,所以在模型比较简单的情况下,Fish 函数可以直接写在*.*dat
的命令流文件中;但当模型比较复杂时,还是建议将 Fish 函数单独提取到*.*fis
文件中,方便调试和管理。
此外,PFC 命令流和 Fish 代码也可以直接写在*.txt
文本文档中,程序也能识别和运行;PFC 6.0 也加入了对 python 的支持,可以将模型代码写在*.py
文件中。
使用 Python 时,命令流或 Fish 代码是以字符串的形式作为参数使用的,具体在后面的 Python 部分介绍。
PFC 模型生成
1.基本设置
打开软件新建项目后,再新建一个*.*dat
格式的 Datafile,即可开始编写模型代码。建立新模型前,如果内存中还保存着之前运行的模型或者函数,就有可能与新模型发生冲突,所以程序的开始一般用model new
命令来清空程序内存,为建立新模型做准备。
接下来就是为新模型指定一个合适生成空间,能容纳下新模型即可,不宜过大。命令为model domain
,其中extent
关键字指明模型x
、y
、z
方向上的范围,缺省就和前一项取相同范围;关键字condition
指明颗粒超出domain
后的操作,destory
表示颗粒超出domain
后就销毁,以上命令的具体说明可参见程序文档。
此外,由于 PFC 的颗粒是随机生成的,每次的结果都不同,为了模拟的可重复性和调试的准确性,需要在颗粒生成前为模型指定一个随机种子,命令为model random
,一般设置为一个大于 10000 的正整数。
1 |
|
2.约束设置
模型的生成空间设置好后,就可以设置模型的物理结构了,通常是墙体的设置。PFC 6.0 中创建墙体有如下几种方式,具体使用参见程序文档中的相关命令说明:
1 |
|
另外,PFC 6.0 自带与 FLAC 耦合,还可以使用wall-structure create
命令以 FLAC 中的structure
单元为模板创建墙体。
3.颗粒生成
墙体设置好后就可以生成颗粒了,PFC 中的颗粒对象有 Ball 和 Clump。由多个 Ball 组成的刚性整体就是 Clump,它不会发生变形;而多个 Ball 通过一定的强度的黏结组合成的整体叫做 Cluster,当 Ball 间的黏结破坏后,Cluster 便退化为 Ball。
此外 PFC 中还有一类对象 Rigid Blocks —— 可以看作是填满 Ball 的具有封闭边界的小单元,一般用来模拟各种封闭的凸多面体/多边形。
这里主要介绍 Ball 和 Clump 的生成,因为其他两类对象我没用过 😂,命令如下:
1 |
|
create
命令主要用于需要精确控制颗粒半径和位置的情况,如柔性三轴中生成颗粒膜;generate
命令生成颗粒时会确保颗粒间无重叠,因此平衡后的孔隙率会略大于设定值;distribute
命令生成颗粒时不会检查颗粒是否重叠,导致生成后的颗粒间可能存在大量的重叠,产生较大的内力,因此成样后需要将颗粒充分地弹开,以减小不平衡力。
此外,还可以通过 Clump 模板生成 Clump 颗粒,这种方法需要首先创建 Clump 模板,然后再配合generate
或distribute
命令的templates
关键字指定要使用的模板就可以了。
一般生成颗粒时,我们还希望控制颗粒的级配,这可以通过distribute
命令中的bin
关键字实现,一个bin
对应于一小段粒径范围;使用generate
命令中的fish-distribution
关键字还可以按自定义的 Fish 函数返回值确定颗粒粒径。
4.颗粒参数和接触模型设置
颗粒和墙体生成完毕后,需要设置颗粒和墙体的基本参数,如颗粒的密度、摩擦系数和墙体的速度等;另外还需要设置颗粒间以及颗粒和墙体间的接触模型——可以理解为颗粒相互作用时两者接触面上的力和弯矩等的计算规则。
在 PFC 中颗粒的基本参数包括两类,一类是颗粒内在的属性,如密度、速度、位移、受到的力和弯矩等,通过attribute
命令设置;另一类是颗粒与接触相关的属性,如摩擦系数、法向刚度和切向刚度等,通过property
命令设置。
PFC 中接触模型的设置有两种方式,首先是通过 CMAT (Contact Model Assign Table) 命令进行设置,命令格式如下:
1 |
|
default
关键字表示设置默认的接触模型,tpye
关键字用来限制接触的类型,如颗粒与颗粒的ball-ball
接触和颗粒与墙体的ball-facet
接触等;add
关键字表示向接触模型表中添加一类接触模型,其后跟的整数越小,表明该接触模型的优先级越高。当有新的接触生成时,PFC 会优先遍历add
命令设置的接触模型(有多个则根据其后数字的优先级来确定遍历顺序),如果新接触满足该接触模型的限制条件,则为新接触设置该接触模型,如果不满足则继续判断下一个接触模型,如果均不满足,则使用default
命令设置接触模型。
第二种方式是使用contact
命令直接设置接触模型,用法如下。两种方式的区别在于:第二种方式仅对当前模型中存在的接触生效,而第一种方式对于模型之后新生成的接触也有效。
1 |
|
最后需要说的是,这里只是介绍了接触模型的基本设置方法,具体的命令使用说明可以参考官方文档。并且进行接触设置时通常会用到Range
命令来限制要设定的范围,它是 PFC 中的一个很重要也很常用的命令,后面放到常用命令里说。
PFC 模型预平衡
由于颗粒是随机在模型区域中生成的,因此颗粒生成完毕后模型内部的应力处于混乱的状态,并未达到完全平衡,不符合实际的试验条件。在 PFC 中一般通过不平衡力比(Unbalanced Force Ratio,PFC6.0 中关键字为ratio-average
,PFC5.0 中关键字为 aratio)来评价模型内部应力是否达到平衡,它是指模型中所有颗粒所受到的力的矢量和与这些力的标量和之比,一般当模型的不平衡力比求解到 1e-5 或更小就认为模型已经达到平衡状态了。
有些情况下,模型预平衡时不平衡力比无法收敛到 1e-5,而是在一个大于 1e-5 的值附近波动,这可能是因为模型中存在一些悬浮的颗粒,它们处于自由运动的状态,从而导致不平衡力不收敛,这种情况下可以删掉悬浮颗粒或者适当放大悬浮颗粒的半径再进行预平衡。预平衡耗时较长时,可以采取一些技巧来提高效率,比如对于孔隙率较小的模型给颗粒设置适当大的摩擦系数,比如 0.5,对于孔隙率较大的模型则设置较小的摩擦系数。
最后,当颗粒是在由墙体围成的区域内生成时,预平衡前一般会先将颗粒的位置适当放缩,使所有颗粒位于墙体的内部,防止预平衡时有颗粒飞出墙体之外,导致不平衡力比不收敛,可以通过multiply
关键字实现这个操作。
1 |
|