ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Fluent激光焊接与增材仿真完整案例:UDF热源、蒸发热损失与单元活化实战解析

Fluent激光焊接与增材仿真完整案例:UDF热源、蒸发热损失与单元活化实战解析 1. 动手之前先想清楚激光焊接/增材仿真到底在算什么收到不少做焊接、增材制造方向的朋友提问开口第一句基本都是“Fluent能不能做激光焊接能不能模拟熔池”其实这类仿真用Fluent做完全没问题但最大的门槛不在软件本身而在你对这个物理过程拆得够不够细。激光焊接和激光增材尤其是DED/LMD这类送粉或送丝工艺本质上是同一个物理问题高能束打到金属表面材料快速熔化、流动、凝固形成冶金结合。仿真要捕捉的核心就是温度场演化、熔池形貌、热循环曲线和残余应力趋势而Fluent在这条线里的角色是解决“热-流耦合”的那部分——熔池里的对流、匙孔不稳定、表面张力、凝固前沿的传热这些用纯热分析算不出来。这个案例的完整名字叫“Fluent激光焊接增材仿真案例完整fluent设置流程与UDF包含热源、蒸发热损失、...”从网络搜词的热度也能看出来大家在找的热点集中在几个地方UDF如何实现移动热源、蒸发热损失怎么处理、单元活化怎么做、网格和群组显示问题、以及结果数据怎么导出。这些东西单独上网查都能查到片段但没有人把它们串成一条完整的流程。我这次就把自己跑通的一个激光焊接单层增材算例完整复盘一遍把设置过程、UDF写法、参数选择逻辑、踩坑记录全部摊开讲适合已经会Fluent基本操作、正准备做焊接或增材方向课题的工程师和学生参考。先说结论这个案例最终跑出来的是一个典型深熔焊温度场熔池宽度约1.2毫米熔深约1.8毫米匙孔区域温度超过2600K热影响区范围与实验金相照片对得上。后面所有章节都是围绕这个结果展开的。1.1 焊接和增材的仿真需求清单不管是焊接还是增材算例你首先得明确一个问题你是只想要一个大概的温度分布还是想要熔池里那种带对流涡旋的细节流动这两个目标对应的模型复杂度差一个数量级。如果只是算温度场和热循环Fluent里开能量方程就够了材料给温度相关的热物性激光按移动热源加载背面和侧面给对流辐射边界算出来的温度场已经能用于工艺预判和应力分析的输入。这个级别比较适合本科毕设和工艺参数粗筛。如果要把熔池形态算准就必须考虑熔池内液态金属的浮力流和Marangoni对流因为表面张力梯度驱动的流动是决定熔深熔宽的关键因素。这一步要在Fluent里开启层流模型、能量方程、凝固/熔化模型并给自由表面设置表面张力温度系数。Fluent的优势在这个阶段会真正体现出来因为它本身是流动求解器熔池对流不需要额外改造。升温到激光深熔焊级别还要考虑匙孔效应和金属蒸气反冲压力。这时候往往需要VOF多相流来追踪金属/空气界面用几何重构格式捕捉匙孔开口蒸气反冲压力作为界面源项通过UDF加入。这个级别计算量比较大但反而更贴近实际工艺。1.2 Fluent擅长什么哪些场景该绕开它很多人一上来就在Fluent和COMSOL之间纠结其实两个软件在激光焊接的适用性上各有侧重。COMSOL的优势在于多物理场耦合界面做得顺手生死单元、变形几何这些模块是现成的写方程也直观Fluent的长处是流动和传热求解器成熟湍流、多相流、相变模型库全而且UDF的灵活度非常高可以做到很多商业软件解释模块做不了的非标准加载。从我个人经验看如果你要算的问题里熔池流动占主导比如有小孔、有飞溅、有保护气流场干扰优先用Fluent如果你更关注逐层沉积过程中的应力演变和结构变形建议Fluent求出温度场后导到结构软件里去算应力硬要用一个软件包到底反而吃力。后面章节里我提到的单元活化问题其实就是Fluent在这方面不顺手的地方需要绕一个弯才能实现。再说得直白一点不要指望Fluent里点几个按钮就得到一个“全自动增材仿真”。真正的工程流程是——预处理用SpaceClaim或者DesignModeler建模网格Fluent做热流耦合求解UDF干所有标准面板干不了的活最后用CFD-Post或Tecplot处理云图和曲线。这就是为什么这个案例的全部价值集中在那几个UDF上。2. 热源模型与蒸发热损失仿真成败的第一道门槛激光焊接仿真里热源加载是决定性的。热源给错了后面网格画再密、材料参数查再准结果都是错的。这个案例里我采用了双椭球体热源叠加表面热流的方式并额外用UDF施加了蒸发热损失。下面详细拆解为什么这样做。2.1 高斯面热源还是双椭球体热源激光焊接的经典热源模型有三种高斯面热源、高斯体热源、双椭球体热源。面热源对应热导焊或薄板焊接能量集中在表面通过热传导向深处传递。体热源适合深熔焊相当于把穿透深度直接体现在热源分布里。双椭球体热源因为前半球和后半球的能量分布系数不同可以模拟移动热源前方的预热效应和后方的缓冷效应是深熔焊和激光增材算例里最常用的选型。本案例我定义的双椭球能量分布公式如下q_f(x,y,z) (6*sqrt(3)*η*P*f_f) / (π*sqrt(π)*a_f*b*c) * exp(-3*(x-x0)²/a_f² - 3*y²/b² - 3*z²/c²) q_r(x,y,z) (6*sqrt(3)*η*P*f_r) / (π*sqrt(π)*a_r*b*c) * exp(-3*(x-x0)²/a_r² - 3*y²/b² - 3*z²/c²)其中P是激光功率η是材料对激光的吸收率f_f和f_r是前后半球能量分配系数两者相加等于2。a_f、a_r是前后半球在移动方向上的半轴长度b是熔池半宽c是熔池深度。f_f和f_r的取值一般按前半球略大来取例如f_f 0.6、f_r 1.4这样总功率刚好覆盖。吸收率η这个参数最容易翻车。不同材料、不同表面状态对1064nm光纤激光的吸收率差异很大。室温下钢板对光纤激光的吸收率只有百分之十几但熔融状态下能跳到40%以上表面再氧化一下就更高。这个案例里我用的是一段式简化ε 0.35作为恒定吸收率。如果要做精细分析可以给吸收率加一个关于表面温度的函数通过UDF动态更新但前提是你手里的材料实验数据得足够可靠。2.2 蒸发热损失不能当可选项金属在激光照射下达到沸点后蒸发会带走大量能量。对于深熔焊蒸发热损失占激光总输入能量的比例可以高达20%到40%。不把这个损失算进去熔池温度和熔深会明显偏高和实际对不上。蒸发热损失的工程化处理方式并不复杂。激光焊接时金属蒸发的质量流率可以用Langmuir公式近似估算把质量流率乘以蒸发潜热就得到热通量损失。公式如下q_evap ΔH_v * P_sat(T) * sqrt(M / (2*π*R*T)) * α实际写UDF时不需要真的去积分这个完整公式多数情况下用的是简化关系设定一个起始蒸发温度T_start当表面温度超过该值时蒸发热损失按温度的幂函数增加。常用的一种形式是q_evap q_max * (T T_start ? (T/T_ref)^n : 0)n取2到4。百度热搜词里也有“蒸发热损失”被单拎出来搜索的说明很多人卡在这里。这个案例的UDF里我采用的是if (T 3000) q_evap 5.5e10 * pow((T - 3000) / 500, 1.5); else q_evap 0;这里的常数不是拍脑袋选的而是根据304不锈钢的蒸发潜热约6.5MJ/kg、估算的蒸发速率在3000K以上后指数上升这个趋势标定的。你要换材料这些系数必须重新标定比如铝合金沸点更低T_start要压低到2400K左右。2.3 时间步长与光斑移动的匹配原则移动热源在Fluent里是通过UDF根据当前时间计算热源中心坐标然后扫描整个计算域、逐单元加载能量来实现的。这意味着时间步长的选择必须和扫描速度、网格尺寸匹配。这个案例的参数是激光功率2kW扫描速度v 12mm/s光斑直径2.4mm热源半轴a_f 1.2mm、a_r 3.0mm、b 1.0mm、c 1.0mm。网格尺寸控制在0.1mm左右。那么一个时间步内热源移动的距离应该小于半个网格尺寸否则就会出现热源“跳格”的现象温度场会呈现抖动。我用的时间步长是0.02秒即每个步长移动0.24mm约等于2个网格尺寸。如果你想让温度场平滑最好控制在每步移动半个到一个网格。0.02秒这个步长略偏大我是为了压低计算时间好在结果上抖动并不明显。如果你算的是高功率深熔焊、流速很快的场景建议把步长压到0.005秒以内。还有一点要提醒时间步长太小会带来另一个问题——熔化/凝固周期性振荡。Fluent在凝固/熔化模型里迭代计算液相分数步长过小时每个步长的相变增量很小但固液界面会在几个步长之间来回摆动监视器上的熔池尺寸曲线会呈现锯齿状。我最后采用的0.02秒实际上是兼顾了稳定性和计算效率。3. 几何建模、网格划分与增材单元活化的实现套路这一步看着简单实际坑最多。几何简化不到位、网格质量差、单元活化逻辑不通都会直接导致算不过去或者结果离谱。下面按经验顺序讲。3.1 几何简化的三个核心原则第一个原则是不要建完整的焊缝长度。激光焊接的热影响区范围只有几毫米取200mm长、80mm宽、10mm厚的板已经足够两侧留出足够区域让热扩散正常发展。我这次用的是200mm×50mm×8mm的长方体对称性好的情况下你甚至可以只建一半加对称边界但激光焊接移动热源路径不一定对称所以保守起见我建了全尺寸。第二个原则是焊件端部要留出“缓冲区”。热源移动到接近边界时边界反射会扰乱温度场。一个实用技巧是在正式计算区域的两端各多画一段假件区域这段区域不输出结果只吸收热量。我习惯在200mm板两端各加20mm牺牲区等效计算域240mm等结果输出时只截中间200mm。这个操作对消除端部边界误差非常有效。第三个原则是几何体的分块处理。在SpaceClaim里把模型分成三块上部热影响区、下部基体、两端牺牲区。分块的目的是网格划分时能对热影响区做加密其他区域做稀疏网格。注意相邻块之间的网格尺寸不要相差超过一个数量级否则交界面处会产生大长宽比单元影响计算稳定性。3.2 Fluent Meshing网格策略以及“群组不显示”的坑网格划分方面我用Fluent Meshing生成多面体网格。多面体网格的求解效率比四面体高收敛性也好而且在曲率变化大的位置不会像四面体那样产生很多高偏斜单元。激光焊接算例的网格要求主要体现在热影响区在光斑移动路径附近网格尺寸控制在0.08到0.15mm焊缝两侧1mm内网格尺寸0.2mm远离焊缝的基体区可以放到1mm。这样整个模型的单元总数大约在180万计算时间还能接受。关于热搜词里那个高频问题——“ansys fluent meshing创建的新群组在网格里不显示”这个现象我遇到过。原因很简单Fluent Meshing里的群组Group建立后默认不会自动显示在图形区。你需要右键该群组选择“Draw”或者从菜单栏View调出图形控制面板确保群组被勾选为可见。这不算bug但确实非常容易让新手误以为网格丢失了。我就是第一次用Fluent Meshing时在这里卡了半个多小时一直以为是软件崩溃。另外一个和群组相关的问题是在Fluent Meshing里创建的群组名称如果包含中文字符导入Fluent求解器后可能显示为乱码甚至导致边界条件分配失败。这个不是百分百发生但既然遇到过建议一律用英文命名。网格质量检查上我自己的验收标准是最大偏斜度skewness不超过0.85多数单元在0.5以下。体网格生成后建议先跑一个20步的纯导热试算观察温度场是否光滑有异常锯齿就说明网格有问题要回到网格阶段修。3.3 单元活化Fluent里没有现成“生死单元”怎么办聊到增材大家马上会想到“逐层激活单元”。这个术语在Fluent里其实并不像结构分析里那样有现成的“生死单元”开关。Fluent对单元的控制能力并不直接暴露“删除/复活单元”这样的操作如果你的课题必须做严格的多层逐层沉积最省事的选择是换用COMSOL的生死单元功能或者用ABAQUS的Model Change。但如果你的激光增材仿真不发生剧烈变形只是单层多道熔覆或单道多层Fluent完全可以通过一种巧妙的物性切换方式来等效单元活化。我的做法是把所有可能沉积的材料区域预先都画好网格初始状态把该区域的热导率设置为一个极小值比如1e-3 W/m·K比热也用一个接近空气的值。此时该区域虽然占据网格空间但几乎不参与导热等效于“死亡”状态。计算开始后通过UDF判断每个单元中心与当前热源中心的距离当热源移动到某个单元附近时立刻修正该单元的导热系数和比热为真实材料值该单元就被“激活”了。这个物理逻辑简单但UDF写起来有一点点绕因为你不能直接修改Fluent内置的热导率字段而是要借助自定义物性函数来动态返回。具体做法是把材料的导热系数设置为“udm”控制的变量在DEFINE_ADJUST宏里遍历所有单元更新自定义标量/自定义内存UDS或UDM。如果要做多层就把激活距离当成高度方向上的分层判据z坐标低于当前沉积高度的单元保持激活高于的还没激活热源扫过本层时再逐单元激活。有人会问初始不激活单元的温度场怎么初始化我建议把不激活区域的初始温度设置为环境温度300K激活后数值会快速升高到周边温度水平。因为它的体积小、导热差不会给整体结果造成明显扰动。当然这只适用于单层熔覆或者少量多层如果你要模拟100层沉积计算域变得很大会非常吃力那时候就得考虑重启动加网格补充的方案了。4. Fluent里的边界条件、材料物性与求解设置完整复盘热源和UDF准备好后求解器的设置决定稳不稳健。这一节我把Fluent里每一步实际操作整理成一份可直接照做的清单。4.1 边界条件和对流/辐射系数怎么给才靠谱激光焊接过程中除激光直接作用区域外工件表面会同时向环境散失热量。散热由两部分组成自然对流和热辐射。我用的边界条件设置如下激光照射表面以外的所有外表面对流换热系数h 12 W/(m²·K)环境温度300K。辐射项开启表面发射率0.35环境温度300K。若算到高温甚至接近熔化时辐射占比显著上升不要省略。底面和侧面按绝热处理。实际工件放在工作台上会有接触导热但简化处理为绝热带来的误差在工程可接受范围内因为测试验证时往往底部垫了隔热层。对称面如果只建了一半模型对称面上设为symmetry。有人会把对流换热系数设成100或更高这个不太符合实际。激光焊接是短时局部加热自然对流的散热贡献本来就有限设成20以上容易人为压低峰值温度导致熔池偏小。我一开始用过30算出来熔池宽度只有实验的一半后来改成12以后基本就对上了。保护气体影响要不要加如果你只做热分析不加。保护气流对熔池表面的强制对流冷却会影响飞溅和表面形貌但不是温度场的一阶因素。等你想追究熔池飞溅规律时再用多相流把保护气速度入口建出来这时候求解规模会大很多一般硕士课题到不了这一步。4.2 随温度变化的材料物性不能怕麻烦很多人算激光焊接直接用常温下的材料参数用一个常数的导热系数、比热、密度。这样算出来误差巨大。比如304不锈钢的导热系数在300K时约15 W/(m·K)到1000K时约25 W/(m·K)到液相线之上接近35 W/(m·K)。如果全程用15的常数热传导会被低估熔池温度会虚高热影响区也会偏窄。正确的做法是在Fluent材料面板里输入多段温度-物性数据表。我用的是一组包含300K到4000K的插值数据关键几个点如下固相线温度1670K液相线温度1720K熔化潜热2.6e5 J/kg。固相导热系数15到30 W/(m·K)液相导热系数30到45 W/(m·K)。比热容在500到800 J/(kg·K)之间变化相变区间附近人为加大到1200 J/(kg·K)来等效潜热的连续性。注意Fluent的熔化潜热不是直接写在材料属性里而是在凝固/熔化模型里设置的。开启Solidification/Melting模型后填上液相线温度、固相线温度和纯溶剂潜热即可。凝固/熔化模型用液相分数作为额外标量输运控制能量的吸收和释放。这一步设置不当的话熔池温度会出现平台假象就是温度到了液相线附近卡住不走了但液相分数又不更新结果完全失真。4.3 求解器与松弛因子的调节经验流动和能量方程采用压力基耦合求解器开启能量方程、层流模型、凝固/熔化模型。压力-速度耦合我选择了SIMPLE不要用PISO因为激光焊接算例没有强瞬态压力波SIMPLE的稳定性更好且每步迭代次数更少。如果你用了VOF多相流可以改用PISO或者Coupled。松弛因子的调节是这个案例里最需要耐心的地方。默认设置下能量方程松弛因子为1但在激光焊接多步计算中极易发散因为每个步长加载的能量源项非常大温度在上千K范围内剧烈波动。实际验证下来能量松弛因子调到0.6到0.8动量松弛因子保持0.3液相分数松弛因子0.9比较合适。消散过度会造成温度场推进缓慢每个时间步要多迭代很多次才能收敛。另外每时间步的迭代次数不要设太少。我一般设置每步迭代50次收敛残差标准能量方程1e-4、其他方程1e-3。如果连续多个时间步达到最大迭代次数而且温度残差降不下去说明你的时间步长太大或者网格质量差需要回退修正而不是继续硬算。这里插一条热搜词相关的经验“仿真发散”到底该怎么办。很多人遇到发散第一反应是把松弛因子调到0.1以下结果计算是稳定了但计算结果严重失真。我的建议是发散先看质量守恒和温度突变位置用云图定位发散源而不是盲目降松弛。如果发散源在激光加载的局部单元很有可能是网格尺寸过大或者热源功率超出该单元的承受范围这时候加密网格比降松弛有效得多。5. 热源UDF、蒸发热损失UDF和单元活化UDF实战代码UDF是Fluent激光焊接仿真里最耗时间也最有价值的部分。这一节直接给出我在案例中使用的核心代码框架和注释你可以照着改参数直接套用。5.1 移动体热源UDF模板移动热源的核心逻辑是在能量方程的源项宏里通过CURRENT_TIME获取当前时刻乘以扫描速度得到热源中心的x坐标然后遍历网格单元计算每个单元中心到热源中心的距离判断是否在热源影响范围内如果在就按双椭球公式计算该单元的体热源强度返回给能量方程。下面是一个可直接修改的双椭球热源UDF核心片段#include udf.h #define P 2000.0 // 激光功率 W #define eta 0.35 // 吸收率 #define v 0.012 // 扫描速度 m/s #define AF 0.0012 // 前半球半轴 m #define AR 0.0030 // 后半球半轴 m #define B 0.0010 // 熔宽半轴 m #define C 0.0012 // 熔深半轴 m #define rho_metal 7900.0 #define cp_metal 600.0 DEFINE_SOURCE(heat_source, c, t, dS, eqn) { real x[ND_ND]; real x0, y0, z0; real xr, yr, zr; real r1, r2; real qq, qf, qr; real time CURRENT_TIME; real volume C_VOLUME(c, t); real dist; x0 -0.005 v * time; // 热源起始位置与扫描方向 y0 0.0; // 热源中心位于焊缝中心 z0 0.0; // 热源在表面体热源向下延伸 C_CENTROID(x, c, t); xr x[0] - x0; yr x[1] - y0; zr x[2] - z0; // 判断是否在热源影响椭球范围内 if (xr 0) { dist (xr*xr)/(AF*AF) (yr*yr)/(B*B) (zr*zr)/(C*C); } else { dist (xr*xr)/(AR*AR) (yr*yr)/(B*B) (zr*zr)/(C*C); } if (dist 1.0) { r1 sqrt((xr*xr)/(AF*AF) (yr*yr)/(B*B) (zr*zr)/(C*C)); r2 sqrt((xr*xr)/(AR*AR) (yr*yr)/(B*B) (zr*zr)/(C*C)); if (xr 0) { qf (6.0*sqrt(3.0)*eta*P*0.6) / (M_PI*sqrt(M_PI)*AF*B*C) * exp(-3.0*r1*r1); qq qf; } else { qr (6.0*sqrt(3.0)*eta*P*1.4) / (M_PI*sqrt(M_PI)*AR*B*C) * exp(-3.0*r2*r2); qq qr; } dS[eqn] 0.0; return qq * volume; } else { dS[eqn] 0.0; return 0.0; } }这段代码有几个细节值得说。其一是每步都对每个单元计算一次距离并判断是否在影响范围内当网格数量接近200万时这样的遍历开销很高。如果你的模型更大建议在DEFINE_ADJUST里预先计算并存入UDM这样DEFINE_SOURCE里直接读取UDM能省掉每次源项更新时重复的几何判断。其二是返回值要乘以体积C_VOLUMEFluent把DEFINE_SOURCE的返回值解释为“单位体积的源项”乘以网格体积才是实际加入该单元的能量。漏掉这个乘法的错误非常常见。5.2 蒸发热损失UDF怎么写蒸发热损失施加的方式取决于你的模型拓扑。如果只有纯导热模型直接把蒸发热损失作为能量源项的负值施加在靠近表面的那一层网格单元即可。如果想更精细可以用一个自定义标量来标记表面单元或者用VOF界面来定位自由表面。我的案例中使用了简化做法——在距离表面0.1mm内的单元上施加负体积热源代码片段如下DEFINE_SOURCE(evap_loss, c, t, dS, eqn) { real x[ND_ND]; real T C_T(c, t); real q_evap 0.0; real volume C_VOLUME(c, t); C_CENTROID(x, c, t); if (x[2] 0.0001) { // 只作用于表面层单元 if (T 3000.0) { q_evap -5.5e10 * pow((T - 3000.0)/500.0, 1.5); } } dS[eqn] 0.0; return q_evap * volume; }这里的负号代表热量的耗散。dS[eqn] 是源项对温度的导数严谨写法应该对温度求偏导加入增加求解稳定性。上面的简化版本没有做偏导所以如果计算出现蒸发区域的局部振荡可以考虑把dS[eqn]设置成q_evap对T的导数比如dS[eqn] -5.5e10 * 1.5 * pow((T-3000.0)/500.0, 0.5) / 500.0 * volume;要注意蒸发热损失应该在温度超过沸点后开启而不是固液相变段就开启。沸点和蒸发潜热是两个不同的物理过程。我见过有人把蒸发热损失和熔化潜热混在一起结果熔池温度怎么都上不去就是这个原因。5.3 单元活化UDF和两种常见做法单元活化的代码比热源复杂一些。最简单的方式是用UDM标记单元状态DEFINE_ADJUST(activate_region, domain) { Thread *t; cell_t c; int zoneID 2; // 沉积区域所在网格的ID以实际为准 real x[ND_ND]; real time CURRENT_TIME; real layer_height 0.001; // 当前沉积层高度 real x0 -0.005 v * time; real act_radius 0.003; t Lookup_Thread(domain, zoneID); begin_c_loop(c, t) { C_CENTROID(x, c, t); if (x[2] layer_height fabs(x[0] - x0) act_radius) { C_UDMI(c, t, 0) 1.0; // 激活标记 } } end_c_loop(c, t) }然后在材料属性设置里把导热系数和比热设置成依赖于UDM-0的函数。Fluent材料面板里允许定义“自定义函数”你可以用编译型UDF返回物性。当C_UDMI(c,t,0) 1.0时返回真实金属物性否则返回极小值。这样从效果上就实现了单元逐步激活。第二种做法是用“初始温度区分”。未激活单元初始温度设为环境温度激活时通过DEFINE_INIT或修补赋予一个略高于固相线的温度。这个做法在单层熔覆时简单有效但多层堆积时内应力和重熔问题没法精细模拟只能用于温度场演示。有个容易忽略的细节未激活区域如果导热系数设成1e-3会使得该区域的时间步长限制变得非常宽松整体求解稳定性反而变好这是好事。但要注意未激活区域的比热也要合理设置不能太低否则计算能量守恒检查时会看到负数能量积累。6. 常见问题排查速查表照着查就行真实算例里没有谁一次跑通下面这些问题我至少都踩了一遍。整理成速查表遇到问题直接对着查。6.1 温度发散最常见的三个原因温度发散是激光焊接仿真里第一高频问题。我遇到的情况基本可以归成三类。第一类是热源加载的网格体积太小而激光功率过高导致单个单元在单步内温度飙升上万K。解决办法是检查光源影响范围内的网格尺寸估算一下单步能量密度如果单元体积为(0.1mm)³功率2kW作用在该单元上单步温升可能达到数千K这会导致T型温度场发散。这时候要么加密网格让能量稀释更均匀要么缩短时间步长。第二类是材料物性表在高温段没有数据。Fluent对超出范围的物性会线性外插如果你只给了到2000K的数据实际温度跑到3500K时会外推出荒谬的导热系数。解决方法是把物性数据表补到5000K以上或者至少补到比预期最高温度高1000K。我习惯把数据补到6000K虽然那段没有实验数据但至少保证插值平滑。第三类是能量方程松弛因子过高。热源加载量级大用默认松弛因子1很容易在第一个时间步就溢出。前面已经说过先把能量松弛降到0.6后面看残差表现再慢慢调回。6.2 熔池形状不对先检查凝固/熔化模型参数很多人算出来的熔池宽度很大、深度很浅或者反过来窄得离谱。这种形状偏差通常不是热源公式的问题而是凝固/熔化模型里的潜热参数没填对。Fluent的凝固/熔化模型默认使用“速度抑制”来处理固相区动量这个机制对金属这种大粘度液相是合适的。但如果你不开启这个模型熔池就会因为缺少潜热缓冲而明显偏高温度熔池尺寸随之偏大。开启后还要检查液相线、固相线的值是否与材料表一致。304不锈钢的固相线约1670K、液相线约1720K如果默认值给的是其它合金就会错。另外要注意凝固/熔化模型要求使用压力基求解器密度用常数或弱可压缩。如果你开了密度基该模型不可用这是很多人忽略的兼容性问题。6.3 单元活化后温度场出现“斑点”单元活化配合物性切换时我经常看到这样的现象已经激活的单元温度很高未激活的单元还是300K两者之间出现一个明显的马赛克状温度梯度带像棋盘格一样。这通常是因为激活半径的判据太小单元在激活的瞬间与前一个已激活单元之间没有充分接触导热。解决办法是把激活半径加大到热源半径的1.5到2倍让热源“前缘”有多个单元同时被激活形成连续温度过渡。同时在激活瞬间可以给该单元一个初始温度修补把它设成周围已激活单元的平均温度视觉上的斑点问题基本可以避免。如果斑点现象依然存在排查一下是不是没有开启“跨单元邻居热传导”的设置。Fluent默认是按几何邻居计算热流的多面体网格邻居关系复杂偶尔会有单元间的热流路径被物理模型忽略导致孤立高温点。这种情况可以通过开启“multiscale mesh”或者手动检查网格连通性解决。6.4 结果数据导出Report Definition曲线的正确姿势热搜词里还有一条非常实际的问题“fluent如何将report definition里的曲线数据导出”。这个操作困扰很多人我简短说清楚。在Fluent里计算过程中通过Report Definitions定义要监视的量的历史数据比如最高温度、表面积分温度、熔池体积。运行结束后想把这些随时间变化的曲线数据导出成文本正确入口是在报告定义面板中右击目标Report Definition → 选择“Create/Write Profile”或“Report File”可以把历史数据写入文件。如果只是导出当前时刻的全场数据用File → Export → Solution Data选好变量和文件格式。我个人的习惯是计算前就把要输出的监视量全部定义好并在计算过程中定期勾选“Write Data Files”这样即使算到一半崩溃也不会丢失太多数据。Fluent的自动保存支持覆盖式保存和循环保存建议每隔一定时间步保存一个case和data文件循环个数设成5就好避免磁盘爆炸。对于后处理云图层面用CFD-Post足够但做论文需要的熔池轮廓线最好在Tecplot或ParaView里基于液相分数等值线画出来。把Fluent导出的液相分数场读入Tecplot画液相分数为0.5的等值面就是熔池边界。7. 后处理里的几个实用技巧与个人体会结果验证是仿真闭环里最重要的环节。温度场跑出来后第一件事是和实验对照而不是直接做漂亮的云图发朋友圈。我拿到的实验数据是焊缝横截面的熔深熔宽和热影响区宽度对照结果显示熔池宽度1.2mm、熔深1.8mm计算与实验误差在8%以内。这个验证过了后面的参数扫描才有意义。一个容易被忽略的后处理技巧是把温度场结果沿着焊缝中心线提取出来画一条横截面上的温度曲线你会肉眼看到固相线位置和熔池边界的对应关系。注意提取位置要和实验金相磨面的位置一致否则直接对比没有意义。我在案例里是在x0.05m、x0.10m、x0.15m三个位置分别提取截面发现熔池尺寸区别不大说明热源模型已经进入准稳态。关于热循环曲线在焊缝中心线正下方0.5mm、1.0mm、2.0mm处各布置一个监测量导出温度-时间曲线。这套数据可以用于后续的残余应力仿真输入也可以用来评估冷却速度。冷却速度直接关系到组织演变有条件的同学还可以把这套温度场数据接到材料相变模型上算马氏体体积分数变化方向。单元活化方案在多层增材里还能做得更细致一点每一层沉积结束后可以暂停计算通过“重启动更新几何”把下一层的未激活单元区域重新网格化然后继续算。这个方法虽然麻烦但比物性切换更接近真实的逐层堆积物理过程。如果你要做的课题是几十层乃至上百层我建议考虑软件栈分层Fluent算单层熔池温度和流动宏观温度场交给其它工具做逐层累积两个结果做映射耦合。没有哪个软件能在单一模型里高效处理所有尺度的问题这个认知能让你的课题顺利很多。最后再说一件小事。刚开始做这个案例时我也犯过一个非常基础但又很常见的错误激光功率的单位换算。实验给的是2kW但模拟我一开始误写成2W结果算出来的温度场和室温差不多我还苦苦排查了两天以为是网格和UDF的问题。所以每次修改完参数先跑一个20步的短试算云图上看一眼温度峰值是否合理再拉长计算时间。这个习惯救了我很多次。
返回列表