首页/文章/ 详情

给 PFC 写了个开真裂隙的技能

42分钟前浏览0

先说结论:我给 PFC 6.0 写了一个新技能 pfc-flaw,专门做预制裂隙。给它四个数——位置、角度、长度、厚度——它就在试样里开出一条真正的矩形空腔:能一次开多条,能在加载前把量测该查的都查一遍,也能一键生成整套脚本链去扫参数。下面讲这个技能是怎么做的、能干什么、怎么用;最后顺手用它跑了一次裂隙倾角扫描。

1. 这个技能能做什么


  • 四个参数定义一条裂隙:位置、角度、长度、厚度。想开几条就写几行,共面、平行、交叉都行。
  • 开出来的是空腔,不是弱面:裂隙内的颗粒被真的删掉了,两侧之间没有任何接触。
  • 开凿过程可控:裂隙面的颗粒会被压平,洞的尺寸等于设计值,不是一堆球面围出来的毛边洞。
  • 每一步都有自检:六个闸门,跑完直接看数,不用自己写探查脚本。
  • 一条命令出整套脚本链:生成 → 跑 → 出报告,还带批量扫参数(共用一份成样,只变裂隙)。
  • 支持完整试样对照:加一个开关就生成不含裂隙的对照组,和裂隙组共用同一份成样。

2. 为什么需要它:弱面法做不出"洞"

做含裂隙岩石数值试验的人绕不开一个问题:试样里那条裂隙,到底该怎么"放"进去。

主流做法是弱面法:不动几何,只在裂隙经过的位置,把颗粒之间的接触换成一套"易坏"的接触模型(PFC 自带的 smoothjoint,或者用分组配不同的胶结参数)。我之前的层理技能走的就是这条路——层理面不切几何,只是给不同层的颗粒配不同的胶结参数。

这条路很好用,但它做出来的东西本质上是一个面:还在传压,只是传得弱一点。加载时它先坏,看起来像裂隙。

可真实的预制裂隙不是面,是洞。你不删颗粒,裂隙两侧始终贴着,法向还传着压应力。裂隙试样那些经典现象——尖端起裂、翼型裂纹从尖端往外长、岩桥贯通——前提都是"这里真的空着"。

所以这个技能走另一条路:真的把裂隙内的颗粒删掉。

3. 四步,把洞开出来

难点在于,直接删颗粒,删出来的洞边缘是毛的——洞壁是一堆球面,凹凸不平,厚度也没法控制。你没法说"我开了个 20 毫米长、2 毫米厚的矩形洞"。

所以真正要做的是先修边、再开洞。

第一步,插墙。 在裂隙的位置,用 wall create 建一个刚性的矩形墙环——不是一整块板,是四条边围成的一个框。

第二步,压平。 让模型跑几千步。颗粒被框推开,紧紧压在框的内外两侧。因为墙是刚性的、框是矩形的,贴上去的颗粒球心到墙面正好差一个半径,裂隙面就规整了。

第三步,删球。 把球心落在矩形框内的颗粒全部删掉。留下的就是一个尺寸完全等于设计值的矩形空腔,洞壁由一层排列整齐的颗粒构成。

alt  

图1:插墙压平、删球之后的试样。中间那道 45° 的白条就是裂隙空腔,洞壁颗粒被压得很整齐。这是技能里 2flaw 阶段结束时的状态。

第四步,胶结,然后才拆墙。

4. 拆墙必须放在胶结之后

这是整条链上最要命的一个先后顺序,也是我在设计这个技能时花时间最多的地方。

墙环是唯一撑着那个洞的东西。提前拆掉,两侧颗粒立刻贴回来,洞就没了——而且更糟:下一步加胶结时,contact method bond 会把它们直接焊死,裂隙彻底消失,你还什么都看不出来。

反过来,先加胶结:颗粒被键锁住,这时再拆墙,洞只会发生一点点弹性回弹,不会闭合。

alt  

图2:胶结完成、墙环拆掉之后的同一个试样。墙没了,洞还在,周围颗粒由键网络撑着。

代价是脚本链里多了一步:拆墙被单独做成一个阶段,排在胶结后面。好处也很实在——"胶结时墙还在"和"胶结后墙已拆"这两件事可以分别验证,出了问题能立刻定位是哪一步。

5. 每一步都埋了自检

这是我认为这个技能最值得说的部分:能不能用不靠"跑通没跑通",靠几个数。

查什么      
判据      
试样有没有被撑胀      
越界颗粒数 = 0      
到底删掉了多少颗      
> 0,且与解析估算同量级      
洞有没有被"焊住"
跨洞的键 = 0      
墙有没有误成键      
承压板/裂隙墙的键 = 0      
墙拆干净没有      
墙数从 4+N 回到 4      
收敛没有      
残速回落到静定      

第三行那个"跨洞的键"是我最在意的:它专门用来拦"厚度给太小、两侧颗粒隔着洞还碰得到、于是被胶结焊上"的情况。判据是 0,不满足就说明参数有问题。

6. 怎么用

bash# 生成算例(默认就是中心 45 度、长 20 mm、厚 2 mm 的基准裂隙)
python ~/.claude/skills/pfc-flaw/code/gen_flaw_case.py --case-dir "单轴压缩/预制裂隙45"

# 跑
python ~/.claude/skills/pfc-run/code/run_pfc.py "单轴压缩/预制裂隙45/main.p2dat" --timeout 21600

一次做多条,把 --flaw 重复写:

bashpython ~/.claude/skills/pfc-flaw/code/gen_flaw_case.py --case-dir "工况/双裂隙" \
  --flaw 0,0.01,0.02,0.002,45 --flaw 0,-0.01,0.02,0.002,45

加 --dry-run 只校验不写文件,它会把每条裂隙的角点、厚度相对粒径的倍数、离边界的余量都打出来——几何错了当场报错,不用等 PFC 跑起来。

扫参数(倾角、长度、厚度都行):

bashpython ~/.claude/skills/pfc-flaw/code/run_flaw_sweep.py \
  --root "单轴压缩/预制裂隙-倾角扫描" --dips 0,15,30,45,60,75,90

这个驱动会让所有算例共用同一份成样:先跑一次成样,再把那个快照复 制到每个算例。初始状态逐位相同,最后结果的差异就只可能来自裂隙本身。后面再跟一个汇总脚本,把每个算例日志里的数据抓成表、出图、生成一份 HTML 报告。

7. 顺手做的一次演示:裂隙倾角扫描

技能写完,总得拿它做点东西。四个参数里"角度"最好调,就扫了一遍。

七个角度,每个试样中央一条裂隙,长 20 mm、厚 2 mm,位置不变,只转角度。七个算例共用同一份成样,另外跑了一个完整试样作对照(UCS 92.5 MPa)。

这里的"倾角"指裂隙长轴与水平方向的夹角。所以 0° 是水平躺着的一道缝(垂直于加载方向),90° 是竖直的一道缝(平行于加载方向)。

alt  

图3:七个角度实际开出来的裂隙。每一格是试样中心 24×24 mm 的窗口,颗粒按真实半径绘制——中间那道白色条带就是裂隙空腔。红色虚线是该角度的设计轮廓(20×2 mm),可以看到开出来的洞和设计值基本完全重合。

裂隙倾角      
UCS (MPa)      
相比完整试样      
累计裂纹      
0°      
41.8      
−55%      
1065      
15°      
44.1      
−52%      
1235      
30°      
46.8      
−49%      
1466      
45°      
56.2      
−39%      
1455      
60°      
70.5      
−24%      
1672      
75°      
87.0      
−6%      
3123      
90°      
84.0      
−9%      
2886      
alt  

图4:UCS 随裂隙倾角的变化。虚线是完整试样的 92.5 MPa。

趋势很干净:裂隙越"躺平",试样越弱。水平裂隙把试样横向切开,荷载只能通过裂隙尖端那点材料往下传,强度掉一半还多;竖直裂隙则相反,两侧岩桥仍完整承担荷载,试样几乎是"绕开"了这条缝。

alt  

图5:七条应力-应变曲线叠在一起。弹性段几乎完全重合(同一个材料),差别全在峰值高度和峰后的跌落位置上。

顺带一个有意思的现象:越强的试样,破坏前积累的微裂纹反而越多。90° 那根掉了 2886 条裂纹,0° 只有 1065 条。0° 试样是被那条水平缝直接劈开的,破坏来得干脆;接近完整的试样要撑到更高应力,过程中不断产生微裂纹,最后才崩。

七个算例的六个闸门全部通过,跨洞键无一例外是 0。

两个必须说清的限制:
一、删球判据是"球心落在矩形内",所以裂隙厚度得容得下至少一层半颗粒。这次用的 2 mm 厚约等于 2.2 倍最大粒径,能做出一条干净的缝,但算不上细裂纹。想要更薄的裂纹得走随机 DFN + smoothjoint 那条路——那也做不出空腔,是另一种东西。
二、扫描的七个算例里,30° 那一个第一次跑在求解阶段静默退出了(PFC 这类概率性崩溃偶有发生,重跑一次就过)。所有给出的数据都是重跑通过后的结果。


—— 关于作者:超级大的Lobby ——


来源:超级大的lobby
ACTpython裂纹PFC材料控制试验
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-10-27
最近编辑:42分钟前
lobby
硕士 | 无 擅长颗粒流PFC
获赞 963粉丝 5951文章 109课程 23
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈