简介:这份资源面向岩石力学、地下工程与地热开发方向的科研人员和研究生,提供PFC2D5.0颗粒流离散元在热力耦合作用下岩石热损伤的案例代码与解析材料,适合已具备离散元基础、希望深入理解热传导、热膨胀与热应力耦合机制的中高级学习者。压缩包共10个文件,约23KB,包含4个txt说明、4个html网页文档与2个doc分析文档,分别用于代码注释、理论梳理与案例讲解,便于按模块查阅。内容围绕空心圆盘岩样轴心受热损伤这一典型场景,涵盖材料属性定义、模型初始化、热载荷施加及温度场与热应力响应分析等环节,并延伸至热损伤萌生与扩展的空间分布讨论。已有130人学习下载,可帮助读者快速掌握热力耦合建模思路、理解岩石热损伤演化规律,并为支护设计与施工安全评估提供参考。
1. 热力耦合下的岩石热损伤,为什么值得用 PFC2D5.0 颗粒流重做一遍
岩石在温度梯度下开裂,这件事在实验室里不好直接看。你只能看到最终裂纹形态,看不到颗粒之间什么时候开始脱开、热应力在哪一步超过胶结强度、微裂纹怎么从均匀分布突然聚集成宏观裂缝。PFC2D5.0 的颗粒流离散元把岩石打散成一颗颗圆盘,胶结模型负责把它们粘住,热力学模块负责让颗粒热胀冷缩,两者一耦合,热损伤的全过程就能在时间步里逐帧回放。这套思路适合做岩石力学、地热开采、核废料处置库围岩稳定性、高温岩体工程的研究人员和工程师。空心圆在这里不是装饰,它是颗粒生成阶段控制孔隙率与粒径分布的关键几何参数,也是热力耦合案例里最容易被忽略却直接影响初始应力场的一环。下面按“先立住理论、再跑通代码、最后避开坑”的顺序拆开讲。
2. 热力耦合在 PFC2D5.0 里到底耦合了什么:从热传导到胶结断裂
2.1 温度场与力学场的双向传递路径
PFC2D5.0 的热力耦合不是把两个物理场简单叠在一起。它的基本流程是:热学模块先根据颗粒间的热阻网络求解温度场,每个颗粒获得一个温度值;然后热膨胀系数把温度变化转换成颗粒半径的增量;半径变化挤压相邻颗粒,通过接触模型产生接触力;接触力再反馈到力学求解器,更新颗粒位置和接触状态;如果胶结键的应力超过强度,键断裂,产生微裂纹。整个过程在每个时间步内交替执行,热学步和力学步可以设置不同的步长比例。
这里的关键参数是热膨胀系数alpha、热阻thermal resistance和热学时间步thermal timestep。热膨胀系数直接决定同样温升下颗粒能胀多大,岩石类材料一般在 1e-5 到 1e-6 每摄氏度量级。热阻控制热量在颗粒间传递的快慢,数值越大温度梯度越明显。热学时间步必须小于临界值,否则温度场会震荡发散。我一般先用model solve thermal ratio检查热学步是否稳定,再开始正式加载。
2.2 平行胶结模型为什么是热损伤的“裁判”
热损伤的本质是胶结键在热应力下断裂。PFC2D5.0 里常用的平行胶结模型(parallel bond)在颗粒接触点附近形成一个有限尺寸的胶结块,同时传递力和力矩。它有两个关键强度参数:法向强度pb_ten和切向强度pb_coh,以及刚度pb_kn、pb_ks。温度升高时,颗粒膨胀导致胶结块受拉或受剪,一旦某个方向的应力超过对应强度,胶结键就断了。
这里有个容易翻车的地方:平行胶结模型的强度是正态分布的,不是固定值。你设pb_ten 10e6只是均值,实际每个键的强度在均值附近随机波动。热损伤案例里,如果强度离散太大,裂纹会随机出现在低强度键上,掩盖热应力集中的真实位置。我一般把强度标准差控制在均值的 10% 以内,先跑纯力学加载验证模型,再加温度场。
2.3 空心圆颗粒生成:孔隙率和粒径分布怎么定
空心圆在 PFC2D5.0 里通过ball generate命令的radius范围控制,但“空心”不是指颗粒内部有空腔,而是指颗粒生成时按圆环区域分布,中心留空。常见做法是用range限定一个圆环区域,只在这个区域内生成颗粒。这样做的好处是初始模型就带有可控的孔隙率,热传导路径更接近真实岩石。
粒径分布一般用distribute关键字指定均匀分布或高斯分布。热损伤案例里,粒径太均匀会导致热应力分布过于理想化,裂纹路径不自然;粒径差异太大又会让接触数波动剧烈,热学求解容易不收敛。我一般用 1:1.5 到 1:2 的粒径比,最小粒径根据模型尺寸定,保证整个模型有 2000 到 5000 个颗粒,接触数在 8000 到 15000 之间。空心圆区域的半径取模型总半径的 0.6 到 0.8 倍,留出外围颗粒作为约束边界。
3. 从零跑通一个热力耦合岩石热损伤案例:代码逐段拆解
3.1 模型初始化与颗粒生成
; 热力耦合岩石热损伤案例 - 初始化 model new model large-strain on model thermal on ; 定义模型域 domain extent -0.05 0.05 -0.05 0.05 ; 设置随机种子,保证可复现 model random 10001 ; 生成空心圆区域颗粒 ; 外半径 0.04,内半径 0.024,粒径 0.0008-0.0016 ball generate radius 0.0008 0.0016 ... box -0.04 0.04 -0.04 0.04 ... range annulus 0.024 0.04 ; 设置颗粒密度和热学参数 ball attribute density 2600 ... damp 0.7 ... thermal-expansion 8e-6 ... thermal-conductivity 2.5 ... specific-heat 900这段代码先打开热学模块model thermal on,这是热力耦合的前提。model random固定随机种子,保证每次生成的颗粒位置一致,否则你调参数时根本分不清是参数变了还是随机分布变了。ball generate的range annulus就是空心圆区域,内半径 0.024、外半径 0.04,颗粒只在这个环带里生成。颗粒属性里thermal-expansion是热膨胀系数,thermal-conductivity是导热系数,specific-heat是比热容,这三个是热学求解的核心参数。密度和阻尼是力学参数,阻尼 0.7 是局部阻尼,用于耗散动能,热损伤这种准静态过程一般用 0.7 到 0.8。
3.2 接触模型与胶结参数设置
; 设置接触模型为平行胶结 contact cmat default model linearpbond ... method deformability emod 30e9 kratio 2.0 ... property pb_ten 12e6 pb_coh 15e6 ... pb_kn 1e11 pb_ks 0.5e11 ... fric 0.5 ; 在颗粒间建立胶结 contact method bond gap 0.0002 contact method property pb_ten 12e6 pb_coh 15e6 ... pb_kn 1e11 pb_ks 0.5e11 ; 初始化接触 model cycle 1contact cmat default定义默认接触材料,linearpbond是线性平行胶结模型。emod 30e9是颗粒弹性模量,对应硬岩的 30 GPa 量级。kratio 2.0是法向刚度与切向刚度比,岩石类材料一般在 1.5 到 3 之间。pb_ten和pb_coh是胶结键的抗拉和抗剪强度,这里设 12 MPa 和 15 MPa,属于中等强度岩石。fric 0.5是摩擦系数,胶结断裂后颗粒间靠摩擦接触。contact method bond gap 0.0002表示颗粒间距小于 0.2 mm 时才建立胶结,这个值要略大于最小粒径,否则很多接触点不会生成胶结。
3.3 热学边界与温度加载
; 设置热学边界条件 ; 内圈固定温度 20 度,外圈固定温度 200 度 ball attribute temperature 20 range annulus 0.024 0.026 ball attribute temperature 200 range annulus 0.038 0.04 ; 固定热学边界颗粒 ball fix thermal range annulus 0.024 0.026 ball fix thermal range annulus 0.038 0.04 ; 设置热学时间步 model thermal timestep fix 0.05 ; 记录温度监测点 history thermal temperature ... ball position 0.032 0.0这段是热损伤案例的核心。内圈颗粒温度固定 20 度,外圈固定 200 度,中间颗粒自由传热。ball fix thermal把边界颗粒的温度锁死,不让它们参与热学更新,否则边界温度会漂移。model thermal timestep fix 0.05是手动指定热学时间步,这个值需要根据颗粒热扩散系数和粒径估算,一般取粒径平方 / (热扩散系数 * 10)量级。如果设太大,温度场会震荡;设太小,计算时间成倍增加。history thermal temperature在半径 0.032 处放一个监测点,记录温度随时间变化,用来判断温度场是否达到稳态。
3.4 力学求解与热损伤演化监测
; 设置力学求解参数 model mechanical timestep scale model solve ratio-average 1e-5 ; 记录裂纹数量 history mechanical cracks ; 分阶段加载:先热传导,再力学平衡 model solve thermal time 100.0 model solve mechanical ratio-average 1e-5 ; 输出裂纹分布 plot export bitmap filename 'thermal_damage.png'model mechanical timestep scale让力学时间步自动缩放,保证求解稳定。model solve ratio-average 1e-5是力学收敛标准,平均不平衡力与平均接触力之比小于 1e-5 时认为平衡。history mechanical cracks记录裂纹数量随时间的变化,这是判断热损伤程度最直接的指标。先model solve thermal time 100.0让温度场传导 100 秒,再model solve mechanical让力学场平衡。实际案例里这两个求解是交替进行的,PFC2D5.0 会自动在热学步和力学步之间切换,但手动分阶段更容易观察每个阶段的变化。
4. 热力耦合案例里最容易翻车的五个地方
4.1 温度场震荡发散:现象、原因与解决
现象:温度监测曲线上下跳动,不收敛,甚至出现负温度。原因:热学时间步超过临界值,或者热阻参数设置不合理。热学求解的稳定性条件是时间步小于R * C量级,其中 R 是热阻,C 是热容。解决:先用model thermal timestep fix设一个很小的值,比如 0.001,跑几步看温度是否单调变化,然后逐步放大到刚好不震荡的值。另外检查thermal-conductivity是否设得太大,导热系数越大,热阻越小,临界时间步也越小。
4.2 胶结键全部断裂:现象、原因与解决
现象:加载初期裂纹数量就飙升,模型直接散架。原因:胶结强度设得太低,或者颗粒膨胀系数太大,温度稍微升高就产生超过强度的热应力。解决:先做纯力学单轴压缩模拟,确认胶结强度能承受预期应力水平。热膨胀系数从 1e-6 开始试,逐步增加到 8e-6。另外检查contact method bond gap是否太大,导致部分接触点没有胶结,应力集中到少数胶结键上。
4.3 空心圆区域颗粒飞散:现象、原因与解决
现象:空心圆内边界颗粒在热加载过程中向外飞散。原因:内圈边界颗粒只固定了温度,没有固定力学位移,热膨胀时它们自由移动。解决:如果内圈代表孔洞,颗粒飞散是正常的;如果内圈代表约束边界,需要用ball fix velocity固定内圈颗粒的力学自由度。我一般在内圈加一层固定颗粒,只让中间区域自由膨胀。
4.4 温度场达到稳态太慢:现象、原因与解决
现象:跑了很久温度监测点还是没到目标值。原因:热学时间步太小,或者导热系数太低。解决:先估算热扩散时间L^2 / alpha,其中 L 是模型特征尺寸,alpha 是热扩散系数。如果模型半径 0.04 m,热扩散系数 1e-6 m²/s,扩散时间约 1600 秒。热学时间步 0.05 秒意味着需要 32000 步,计算量很大。可以适当放大时间步,或者用model thermal timestep scale让软件自动缩放。
4.5 裂纹分布与预期不符:现象、原因与解决
现象:裂纹随机分布,没有出现预期的热应力集中区。原因:颗粒粒径分布太宽,或者胶结强度离散太大。解决:把粒径比控制在 1:1.5 以内,胶结强度标准差降到均值的 5% 到 10%。另外检查model random种子是否固定,不同种子生成的颗粒排列不同,裂纹路径也会不同。做参数研究时固定种子,做统计研究时至少跑 5 个不同种子取平均。
5. 让热损伤案例从“能跑”到“可信”:三个进阶技巧
5.1 用温度梯度驱动代替固定温度边界
固定温度边界虽然简单,但温度梯度是突变的,和真实岩石加热过程有差距。更接近实际的做法是用热源颗粒,让热量从内圈向外圈传导。具体做法是在内圈放一圈高温颗粒,不固定温度,只给初始温度,然后让热学求解自然传导。这样温度梯度是连续的,热应力分布也更真实。代价是达到稳态的时间更长,需要更大的热学时间步或更多的计算步数。
5.2 用history和plot做热损伤演化曲线
光看最终裂纹图不够,热损伤是一个过程。我一般同时记录四个量:监测点温度、裂纹总数、胶结断裂率、模型总动能。温度曲线判断热学是否稳定,裂纹曲线判断损伤阶段,断裂率判断损伤程度,动能曲线判断力学是否平衡。把这四个量画在同一张图上,能清楚看到温度传到某个位置时裂纹开始萌生,温度梯度稳定后裂纹停止扩展。这个曲线比单张裂纹图有说服力得多。
5.3 参数敏感性分析的批量跑法
热力耦合案例的参数很多:热膨胀系数、导热系数、胶结强度、粒径分布、孔隙率。一个一个手动改太慢。我一般用 PFC2D5.0 的model save和model restore配合外部脚本批量跑。先存一个基准模型,然后写一个循环脚本,每次model restore后改一个参数,跑完保存结果。关键是要在脚本里自动提取裂纹数量和温度监测值,输出到文本文件。这样跑 20 组参数可能只需要半天,手动改参数可能两天都跑不完。
提示:批量跑之前先确认单次运行时间,如果单次超过 30 分钟,先优化模型规模,减少颗粒数或放大时间步,否则批量跑会变成通宵任务。
我自己的习惯是每次改参数前先存一个base_model.pfc,所有批量脚本都从这个基准恢复。有一次忘了存基准,改了一轮参数后想回到初始状态,结果只能重新生成颗粒,浪费了一个下午。希望帮到你。
本文还有配套的精品资源,点击获取