☰
SLM熔池模拟实战:Fluent网格热源与UDF设置要点
2026/10/9 9:06:11 网站建设 项目流程

做SLM增材制造模拟的人,大概率都绕不过一个问题:熔池到底长什么样。我用ANSYS Fluent做选择性激光熔化模拟已经有几年时间,从最开始照着别人论文里抄边界条件,到后来能在仿真前就预判大概率哪个参数会出事,中间踩过的坑比报错的代码行数还多。这篇东西不是教材,也不打算给你系统讲CFD理论,而是想把我自己在SLM仿真这条路上反复折腾出来的经验整理出来,特别是网格、热源、UDF这些东西到底怎么搭才不容易翻车。

如果你正准备接触SLM模拟,或者已经在Fluent里跑过几版但结果总觉得不对劲,这篇文章应该对你有用。我会按我实际操作的顺序来聊:为什么选Fluent而不是其他工具,前期几何和网格怎么处理,熔池相关的多相流模型怎么配,热源怎么标定,以及求解稳定性和结果验证里那些文档里不会写的东西。我这个人的风格是能动手就不空谈,所以下面提到的每一步,都是我至少跑过一次的流程,不是从哪篇论文里复制出来的。

1. 为什么SLM熔池模拟选择Fluent:多物理场耦合的取舍逻辑

1.1 SLM本身的物理过程决定了工具选择

SLM过程里,激光在毫秒时间尺度内扫过几十微米厚的金属粉末层,材料在极短时间内经历升温、熔化、流动、蒸发、凝固。熔池温度动辄超过2000℃,冷却速率可以达到每秒10的5次方甚至10的6次方开尔文。这种条件下,热传导、对流、辐射、蒸发、表面张力、Marangoni效应、反冲压力全部同时活跃,而且互相耦合,谁都不能忽略谁。

Fluent能接得住这种复杂度的核心原因,是它在一个框架里同时提供VOF多相流、能量方程和用户自定义函数,也就是大家常说的UDF。你在里面同时启用这些机制,让熔池里的流动和传热直接耦合求解,而不是像很多解析模型那样把问题拆成互相独立的几个方程再拼凑。后半程我提到反冲压力、蒸发散热、温度相关表面张力时,你会发现这些物理量在Fluent里都是通过UDF挂到界面单元上的,这种灵活性是Fluent在SLM模拟圈子里被广泛使用的重要原因。

1.2 连续介质假设的边界

任何模拟工具都有适用范围。Fluent基于连续介质假设,把粉末床和熔池当做一个具有连续密度、粘度和热导率的介质来处理。这里有个微妙的地方:单个粉末颗粒可能只有30到50微米,颗粒之间的空隙如果直接建模,网格量会膨胀到你根本算不动。所以大部分用Fluent做SLM的工程方案,要么用等效连续介质模型,把粉末层的孔隙率折算成密度和热导率的折减系数,要么干脆把模型简化成块体材料加体积热源,去研究熔池流动和凝固行为。

粉末尺度的问题,比如单颗粒铺展、颗粒间微熔合,用格子玻尔兹曼方法会比Fluent更合适。但在工程参数寻优和工艺窗口筛选的场景下,Fluent的成熟度、收敛性和后处理生态反而更适合。很多人一上来就纠结工具谁更“先进”,实际上项目周期才决定选择。你要研究的是熔池形貌和热累积,Fluent完全够用;你要研究粉末颗粒级别的物理过程,那就得换工具。

1.3 什么场景适合用Fluent做SLM模拟

总结一下我实际做过的项目,下面几类场景用Fluent都跑得比较舒服:

  • 单道扫描和中尺度熔池形貌研究;
  • 多道搭接和多层铺粉的累积温度场分析;
  • 工艺参数扫描,比如激光功率、扫描速度、光斑直径对熔池尺寸和缺陷倾向的影响;
  • 薄壁件或点阵结构的局部热行为。

反过来,如果你是想研究单颗粒粉末如何在激光下铺展,或者粉末颗粒之间的微熔合细节,那我还是建议你用更细颗粒级别的工具。连续介质假设在这种尺度上会失真,硬用Fluent只会得到一个看起来平滑但物理上站不住脚的结果。

2. 开工前先磨刀:几何搭建、网格策略和材料物性

2.1 计算域搭建:别一上来就建整个铺粉台面

第一次做SLM模拟的人容易犯一个错,就是把计算域建得跟实际设备铺粉台面一样大。实际上你要模拟的只是被激光扫过的局部区域。以单道扫描为例,典型计算域取长2毫米、宽0.5毫米、高0.5毫米就够了,太大只会白白消耗网格量和计算时间。

如果你要做单道单层,域的形状做成六面体最方便,顶部留出空气层,厚度大概0.2毫米。这个空气层不是摆设,VOF方法需要区分气液界面,没有空气层你就没有完整的自由表面。有些论文把计算域只建到粉末层顶部,然后在边界上给一个高温测温条件,这也能跑,但遇到蒸发反压力时会丢掉很多物理量,熔池飞溅和匙孔凹陷根本捕捉不到。

2.2 网格策略:熔池附近才是花钱的地方

Fluent的网格策略很简单:在激光轴线附近把网格加密,远离激光处逐渐放粗。我试过两种方案,各有优劣。

第一种,结构网格加局部加密。整个域用六面体网格,中心区域网格尺寸取5到8微米,边缘区域可以放到20到30微米。优点是收敛快、网格质量高、不容易出现负体积;缺点是对复杂铺粉几何不友好,粉末层和基板之间的过渡区要手动处理。

第二种,多面体网格加自适应加密。Fluent的多面体网格在SLM这种大变形自由表面模拟里表现不错,配合自适应网格可以让熔池的网格跟着界面走,但代价是每次重构网格都会显著增加计算时间。我个人的习惯是跑单道参数扫描时用结构网格,跑复杂几何或者多层堆积时换多面体。

网格无关性验证一定要做,别省。实测下来,熔池宽度对网格密度的敏感度比温度场更高。如果用10微米和5微米网格算出来的熔池宽度相差超过10%,那你不能拿结果去跟实验对比。对于50到100微米熔化半径的问题,网格尺寸最好不要超过9微米,再粗就容易把熔池轮廓“磨平”。

2.3 材料物性的温度相关性问题

材料物性是SLM模拟最容易翻车的环节。很多人在材料库里只填一个室温密度、一个室温导热系数就拿去算,结果熔池宽度对激光功率极不敏感。为什么?因为在2000℃附近,金属的热导率和热容跟室温相差的量级非常可观,钛合金、铝合金和不锈钢都不一样。

拿AlSi10Mg来说,固相线约570℃、液相线约600℃,这个相变区间很窄。如果你材料模型里没有潜热项,熔化就会表现为过热驱动的温度平滑上升,完全看不到熔池提取时的潜热平台,结果就是熔池尺寸偏大。所以必须明确设置材料物性随温度变化,至少给出从室温到过热状态下的固相区、糊状区和液相区的热导率、热容、密度、粘度和辐射发射率。

材料数据可以从几个渠道获得:Thermal-Calc算出来的平衡相图数据、JMatPro或者MATDAT,再不行就查文献里的实验测量值。别直接用Fluent材料库里默认的铝或不锈钢,那只适合教学演示,拿到SLM模拟里会严重失真。我吃过这个亏,第一次拿默认铝材料跑出来的熔池宽度比实验宽了将近一倍,后来换成温度相关物性才把差距压回10%以内。

3. 熔池数值模拟的核心三件套:VOF、表面张力与蒸发反压力

3.1 VOF追踪自由表面

Fluent模拟SLM熔池,多相模型基本都用VOF。在VOF框架里,流体体积分数α表示每个网格中金属相占的体积占比。α=1代表完全液态金属,α=0代表空气,0到1之间则是自由表面。自由表面位置通过求解体积分数的输运方程得到,不需要动网格,这是Fluent处理大变形自由界面的利器。

我会指定空气为第一相,金属为第二相。这有个实际好处:后续定义换热边界和表面张力UDF时,可以直接判断第二相的体积分数在0到1之间,把表面力施加在界面单元格上,而不会在纯空气单元里触发分母为零或者NaN。很多新手不用VOF而用欧拉多相,也可以,但会多花好几倍的求解代价,而且气液界面捕捉得并不比VOF更清晰。

虽然Fluent内嵌了表面张力模型,但SLM熔池这个场景,我建议你自己写UDF。原因很简单:内嵌模型假设表面张力是常数,实际上熔池表面张力随温度线性下降,这个温度斜率才是驱动熔池对流的Marangoni效应。没有温度依赖项,你的熔池对流形态从一开始就是错的,后面算出来的温度场和凝固形貌都会跟着歪。

3.2 Marangoni效应与UDF实现

Marangoni效应的物理解释是:表面张力温度系数dγ/dT通常为负,意味着高温区域表面张力低,液体从低张力区向高张力区流动,也就是从熔池中心往熔池边缘流动,形成典型的向外径向环流。这个对流强度直接决定熔池的宽度和深度,尤其在导热性能差的材料里体现得特别明显。

在Fluent里实现时,我用基于CSF模型的思想,在动量方程源项中施加由表面张力梯度引起的切向力。基本做法是用DEFINE_SOURCE宏写一个动量源项,里面利用VOF梯度GVOF和温度梯度GT构造张力项。用代码表示,大致是:

DEFINE_SOURCE(mom_source, c, t, dS, eqn) { real strength; ... strength = gamma_T * NV_MAG(GT) * NV_DOT(GT / NV_MAG(GT), ...); dS[eqn] = 0.0; return strength; }

注意这个source只有作用于界面单元才有意义,所以要加判断:C_VOF(c,t)在0.1到0.99之间才触发。Marangoni系数dγ/dT的具体数值对结果极其敏感。我曾经把304L的取值从-0.35改成-0.28,熔池宽度就从130微米变成158微米,这个敏感度是很多论文不会明确告诉你的。所以在标定模型时,这个参数必须放在最优先的位置。

3.3 蒸发反压力与能量损失

激光功率密度超过大约10的6次方瓦每平方厘米时,蒸发开始主导熔池行为。金属蒸气产生的反冲压力作用在熔池表面,把液态金属推向四周,甚至形成匙孔。匙孔是SLM深熔模式常见的形貌,它直接影响气孔率和飞溅行为。

反冲压力的经验公式通常写成这种形式:Pr = 0.54 * P0 * exp(ΔHv / (kB*Tv) * (1 - Tv/T)),其中P0是环境压力,ΔHv是蒸发焓,Tv是沸点,T是表面温度。在Fluent里通过DEFINE_SOURCE在气液界面加一个法向压力源项,方向从液相指向气相。

这里有个关键实操点:加蒸发反压力的时候,必须同步在能量方程里加蒸发散热项,否则熔池温度会持续攀升,表面温度高到离谱。蒸发带走的热量在高功率密度工况下占据很大份额,我算过铝合金的例子,蒸发散热可以占到总输入能量的30%以上。忽略它,熔池中心温度会虚高,凝固时间也会偏长。

我会把表面张力、Marangoni项、蒸发反压力和蒸发散热放在同一个UDF文件里,统一管理变量和参数,这样每次调参只需要改文件顶部的那几个常数,不用来回切换多个编译模块。

4. 热源模型标定:高斯体热源的那些门道

4.1 为什么用体热源而不是面热源

SLM激光束的能量分布近似高斯,到达粉末层后,一部分反射,一部分被吸收并渗透到一定深度。用面热源会严重低估熔池深度,因为激光能量没有向下传播的通道。所以在Fluent里,大多数情况选高斯体热源,把激光能量以体积热源项的形式加载在网格单元里,沿深度方向做衰减。

比较常见的高斯体热源公式是:

Q = (2ηP)/(πr₀²d) exp(-2r²/r₀²) exp(-z/d)

这个公式里的物理量分别是:P是激光功率,η是吸收率,r₀是光斑半径,d是能量渗透深度。水平方向按高斯分布,深度方向指数衰减。这三个参数哪一个都能显著影响熔池形态,所以它们必须和实验标定对齐,不能直接套论文里的数值。

4.2 吸收率的取值与温度耦合

很多人把吸收率定死在0.3或0.4,实测下来很不可靠。粉末床对激光的吸收率要比块体材料高得多,因为粉末表面的多次反射大大增加了吸收途径。而一旦粉末熔化形成镜面状熔池,液态金属的吸收率又会变化,跟材料、波长、表面氧化状态都有关系。我通常会把吸收率放到0.3到0.65的范围内去标定,配合实验测得的熔池尺寸反推。

一个实操技巧是:先固定光斑半径和渗透深度,用两组不同功率实验分别反推吸收率。如果两组算出的η差不多,说明热源模型结构合理;如果η差异很大,那就要怀疑热源的空间分布公式本身是不是拿错了。

4.3 热源验证的标尺:熔池截面是唯一标准

热源参数定得对不对,最直接的方法是对比单道熔池截面。取一个已知的工艺参数,比如P=200W、v=1m/s、光斑80微米,算完去切熔池截面,看熔池宽度和深度是否跟实验金相照片吻合。原则上宽度误差低于10%,这个热源模型就可以认为能用于参数扫描。深度误差稍微大一点还可以接受,但宽度偏差大往往说明光斑能量分布或者吸收率设错了。

我最开始调热源时,熔池深度始终浅了一半左右,折腾半天后来发现是在UDF里忘记乘深度衰减指数exp(-z/d),能量只在表面层堆积。这种低级错误很伤士气,而且除非你像我一样逐项检查UDF每一行,否则很难找出问题。所以这里真心建议:每次改完UDF,先算一组已知实验点,至少看温度场剖面和熔池尺寸,再批量推进。

4.4 热源单位换算的坑

说一个经常踩的坑:Fluent能量源项的单位是瓦每立方米,但很多人从文献抄热源公式时,用的是瓦每立方毫米或者瓦每微米级别,单位直接差出九到十三个数量级。我第一次遇到这个问题,就是看到熔池温度在几个时间步内冲到几万摄氏度,当时还以为是时间步长太大,后来把单位理清才发现是热源项放大了十的九次方倍。只要发现温度飞升,十有八九先查热源单位,再查材料密度关联。

5. 求解设置与稳定性控制:时间步长、Courant数与发散处理

5.1 时间步长怎么定

SLM激光扫描速度动辄每秒一米以上,空间网格尺寸几个微米,那么时间步长一个起步量级是1微秒左右。判断标准是Courant数,公式是Courant = vΔt/Δx。在VOF加能量方程的耦合求解里,为了界面稳定,一般控制在1以下。针对熔化流动,我通常取0.1到0.5。

举个例子,扫描速度1m/s、网格5微米,Δt=0.5微秒对应的Courant数就是0.1,跑起来非常稳。如果网格加密到2微米,同样时间步长下Courant数就变成0.25,还处于安全区间。实际求解中还要考虑热扩散带来的稳定性限制,不过用瞬态隐式格式时,Courant约束比显式要松很多。但如果VOF时间推进采用的是显式格式,就必须老老实实控制Courant数在0.5以下,否则界面会破裂出很多小液滴状的伪影。

5.2 发散排查的常见原因

我在调试中最常遇到的发散原因有三个。

第一个是材料物性跳变导致流动求解器崩溃。固相和液相之间的粘度差可能有几个数量级,如果没有光滑过度的糊状区处理,界面附近的速度场会剧烈振荡。解决办法是用随温度光滑变化的函数过渡固液相物性,而不是直接在固相线液相线之间跳变。

第二个是蒸发反压力UDF的问题。如果界面法向量和压力源项方向没有规范好,空气相里会出现巨大的速度振荡,甚至直接浮点溢出。建议在UDF里加判据,只有第二相体积分数大于0.1且小于0.99时才施加反压力,纯气相或者纯液相单元不要触发。

第三个是时间步长太大导致温度骤变。Fluent跑着报告浮点溢出,先去看最高温度,如果到几万摄氏度,十有八九是热源项单位出错或者材料密度没有关联好。这里也提醒一句:发散不一定是模型错了,很多情况下是数值参数给得太激进。

5.3 算力分配与并行设置

计算资源方面,一个100万网格的SLM单道模型在16核并行下,算100微秒物理时间大约需要小半天。如果算多层堆积,一次仿真可能要连续跑好几天。所以网格规模和物理时间之间一定要平衡。我一般先把单道模型跑通,再逐步扩展到多道多层,不要一上来就是几千万网格的巨大模型。

并行时注意分区数不要超过物理核心数太多,否则通信开销反超计算收益。Fluent里打开并行计算后,用自动分区即可,但针对VOF模型,最好选择平衡分区法或按坐标分区,确保负载均衡。分区数量不均的时候,某些核心忙到冒烟,另外几个核心却闲着,整体计算速度直接腰斩。

6. 后处理与结果解读:熔池尺寸、温度梯度与孔隙缺陷

6.1 熔池尺寸怎么提取

模拟跑完,后处理第一件事是提取熔池的瞬时尺寸和凝固后的形貌。Fluent里可以通过等值面方法提取液相线温度等值面,然后在等值面上标注最大宽度和最大深度。另一个做法是把温度场数据导到Tecplot或者Paraview,自己画熔池截面。

我习惯在每一时间步监测自由表面和熔池宽度,看它是否达到稳态。SLM熔池通常在激光启动后几百微秒就能达到准稳态,后续的宽度波动主要来自Marangoni对流的不稳定性,而不是激光扫描带来的。如果算到500微秒温度场还在持续抬升,那大概率是热边界条件或者热源设置没有让系统达到平衡,不是网格或者时间步的问题。

6.2 温度梯度与冷却速率对凝固组织的影响

温度梯度和冷却速率决定凝固组织。Fluent最有价值的地方之一,就是可以通过模拟给出熔池附近每一时刻的局部温度梯度方向和大小。温度梯度方向和凝固前沿的相交角度,直接影响柱状晶外延生长还是等轴晶形核。想要控制晶粒细化和各向异性,必须从工艺参数反推温度场。

比如在基板附近温度梯度大、冷却速度高,容易形成平行于热流方向的柱状晶;而在熔池顶部或者粉末层边缘,冷却速度降低,过冷度变大,更容易触发等轴晶形核。这些信息在金相实验里只能看最终结果,但模拟可以看到中间过程,对理解组织演变非常有帮助。

6.3 孔隙缺陷预测与工艺窗口判断

孔隙缺陷在SLM中是老大难问题。通过模拟熔池回旋流动和匙孔演变,可以大致判断工艺参数处于“传导模式”还是“匙孔模式”,从而预判孔隙风险。传导模式下熔池浅宽,气孔少但熔合不足的风险增加;匙孔模式下熔池深窄,局部能量密度高,容易捕获气泡,形成气孔。

一个特别好用的粗略参考是能量密度E = P/(v·d·h),其中d是光斑直径,h是层厚。当E处于某个材料合适区间时,比如铝合金在60到90焦耳每立方毫米之间,模拟和实验往往对应较好的工艺窗口。这不是绝对规律,但作为初筛效率非常高。跑完模拟后,你可以在Fluent里直接看匙孔深度和闭合频率,如果发现匙孔反复崩塌,就要考虑把功率降下来或者提高扫描速度。

6.4 我的验证心得

最后说一点我自己的经验。仿真和实验永远只能互相验证,不能完全互相替代。我会拿两三个不同功率、不同扫描速度的交叉工艺点做实验验证,校准完模型后再用模拟去做参数空间扫描。这样既不会因为模拟错误浪费大量打印粉,也不会盲目节省实验量导致模型标定失效。经过标定的模型,哪怕只复现熔池轮廓的80%,对判断趋势也足够。

我经常跟人说,SLM模拟的核心不在那些高深的湍流模型或者多相模型,而在每一个输入参数背后是否都有依据。热源标定、物性校核、网格验证,这些看起来枯燥的活,才是决定模拟结果能不能用的关键。模型跑得漂亮不等于算得准,算得准的前提是每一个输入都有据可查。后续有机会再聊聊多道、多层、搭接率对热累积的实际影响,以及飞溅和粉末夹带的建模思路,那些内容展开讲又是一大篇,今天先到这里。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询