混凝土碳化这个话题,做结构耐久性的人应该都不陌生。钢筋混凝土的“癌症”之一就是碳化:空气中的二氧化碳慢慢渗进混凝土,中和掉孔溶液里的碱性物质,等到碳化前锋推进到钢筋表面,钝化膜就再也保不住了,锈蚀随之开始。而COMSOL里做多场耦合碳化模型,说白了就是想用一套计算模型,把这个“不知不觉中发生”的过程老老实实地模拟出来。
这篇东西不是什么教科书式的原理综述,是我自己从零开始搭“基于COMSOL的多场耦合混凝土碳化模型”时的一些探索记录和实战笔记。包括碳化的物理化学本质怎么在软件里表达、COMSOL里各个物理场怎么接起来、参数怎么取、网格和求解器怎么调,以及我踩过的那些坑。适合正在做混凝土耐久性数值模拟的研究生、检测单位的工程师,还有准备把COMSOL引入土木材料方向的人参考。
1. 碳化模型到底在模拟什么:物理化学机制与耦合逻辑
在打开COMSOL之前,先把脑子里的模型概念捋清楚,否则后面每一步都会走得很飘。
1.1 碳化的反应本质:从化学方程式看数值模型
混凝土碳化不是“混凝土被CO₂腐蚀”那么简单。我习惯把它拆成三步:CO₂从环境进入混凝土内部孔隙;CO₂溶解于孔隙液,形成碳酸;碳酸与孔溶液中的碱性物质发生中和反应,生成碳酸钙。
核心反应可以用这个简化式表达:
Ca(OH)₂ + CO₂ → CaCO₃ + H₂O
但实际不是只和氢氧化钙反应,水泥水化产物里的C-S-H凝胶也会参与碳化,只是速率不同、对pH变化的贡献也不同。从数值建模的角度,我更愿意把纯化学式丢到一边,直接问三个问题:
- 有多少CO₂要进来?——这是传质问题,由扩散方程决定,COMSOL里对应“稀物质传递”物理场。
- 进来的CO₂能走多远、反应多快?——这是反应动力学问题,由速率方程决定,在COMSOL里是通过“反应”节点或源项去写的。
- 反应是否改变了材料本身的传输性能?——碳化生成CaCO₃后体积比原水化产物大,会堵塞孔隙,导致扩散系数下降,这又反过来影响第一个问题。
这三个问题一旦想清楚,你就会意识到,做一个“能用”的碳化模型,本质上是在写一组互相咬合的方程,而不是简单套一个COMSOL内置模块就完事。
1.2 为什么必须是“多场耦合”:湿度、温度、损伤一个都绕不开
很多初学者(包括曾经的我)会问:不就是CO₂扩散加个反应吗,直接算不就行了?现实远比这复杂。
第一个绕不开的变量是湿度。CO₂在混凝土孔隙中的扩散是气相扩散,但碳化反应必须在孔隙液中进行。说得直白一点:孔隙水太少,CO₂没有反应介质,碳化很慢;孔隙水太多,CO₂在水中扩散系数远低于在空气中的扩散系数,碳化同样被抑制。实验数据也支持这个结论,混凝土在相对湿度50%~70%左右碳化速度最快,就是这个原因。所以湿度场是第一个必须耦合进来的物理场。
第二个是温度。温度影响CO₂的扩散系数和反应速率常数,普通室内环境下影响不算夸张,但如果模拟的对象是工业建筑、烟囱、或者北方冻融环境下的混凝土,温度场的引入就很有必要。我在模型里通常把温度当作“单向耦合”来处理——温度影响碳化,但碳化本身放热量很小,对温度场反馈可以忽略。
第三个是力学损伤场。这个很多人会忽略。混凝土开裂区域的CO₂扩散系数显著增大,碳化前锋会沿着裂缝“深潜”。我在后面扩展方向里会细说,但即便基础模型不引入结构力学,也必须在材料参数上保留一个“裂缝修正系数”的接口,否则模型后期没法延伸。
一句话总结:碳化模型不是“扩散方程+反应项”的一维问题,而是传质场、湿度场、温度场(可选)、甚至力学损伤场之间的相互纠缠。COMSOL的多物理场耦合能力,恰恰是处理这堆纠缠的最顺手工具。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. COMSOL建模前的准备与整体设计:工程思维的起点
好,决定了用COMSOL来搭模型,先别急着点“模型向导”,把基本功和准备工作做足更重要。
2.1 几何建模:内置几何还是外部CAD,工作平面到底怎么用
混凝土碳化模型的几何通常不复杂。如果你只需要模拟一维情况(比如实验室标准碳化箱里的一块棱柱体试块,只从一个面进CO₂),直接在COMSOL里画一个矩形就完事,宽取试块厚度,高取一个代表性单元高度就行。
但如果你要模拟的是真实构件,比如带钢筋的梁、有棱角的柱子、或者局部带损伤的板,那就绕不开三维几何。COMSOL自带的几何建模工具对付机械零件的布尔运算和拉伸是够用的,但土木构件往往是从CAD图纸里来的。
这里想特别说一个新手经常困惑的概念:COMSOL的“工作平面”。它的本质是让你在三维空间里定义出一个二维绘图坐标系。举个例子,你想在混凝土板侧面开一个预埋件的槽,直接三维里画不好控制位置,就可以在板的侧面建立“工作平面”,画出槽的轮廓,再用“拉伸”操作把它变成三维体。工作平面里的草图绘制逻辑和二维CAD几乎一样,熟练了以后会比外部导入更省事,因为它修几何不用回原软件改。
再说CAD导入的事。很多人的工作流是SolidWorks画好另存为.step再导入COMSOL,结果弹出一堆警告。这里先泼盆冷水:即使是最新版本的COMSOL,CAD导入的警告也是正常的,不用慌。常见的警告多半是这几类:
- 几何体里存在“退化边”或者“尖刺”,通常是导入格式转换时精度丢失导致的。
- 面与面之间存在微小的缝隙或重叠,COMSOL无法直接形成封闭实体。
- 单位不匹配。SolidWorks里如果是毫米画的,导入后COMSOL默认用米,不检查单位的话几何直接小一千倍,后续网格和物理场全部跑偏。
我的建议是:导入后先做一个“几何检查”,把单位、缺失面和容差问题一次性暴露出来,再用“修复”操作逐条处理。如果在修复上花太多时间,干脆直接用“工作平面”重建几何细节,很多情况下比你跟破面搏斗半小时更划算。
2.2 材料参数准备:数据的可靠性决定模型的生死
模型算出来再花哨,参数是瞎填的,结果也是自嗨。混凝土碳化模型里最关键的参数是有效扩散系数、反应速率常数、孔隙率、初始湿度和边界CO₂浓度。
表里面是我平时搭模型用的一套基础参数,供参考:
| 参数 | 常用取值 | 说明 |
|---|---|---|
| 孔隙率 φ | 0.10~0.15 | 普通混凝土,水灰比0.5左右 |
| 有效扩散系数 D_e | 1×10⁻⁸ ~ 1×10⁻⁶ m²/s | 注意是“有效”的,不是纯CO₂气相扩散 |
| 初始CO₂浓度 | 0(内部) | 新建混凝土内部CO₂通常视为0 |
| 环境CO₂浓度 | 0.00045 mol/L(体积分数约415ppm) | 换算成mol/m³要按温度和压力 |
| 反应速率常数 k | 10⁻⁷ ~ 10⁻⁵ s⁻¹ | 具体值必须拟合试验数据 |
| 初始相对湿度 | 60%~80% | 室内环境试件养护后通常取这个范围 |
| 环境相对湿度 | 60%~70% | 碳化最大速率的湿度区间 |
特别注意:这些参数之间不是独立的,孔隙率决定扩散系数的上限,湿度改变扩散系数的有效值,碳化又反过来改变孔隙率。如果你拿文献里的扩散系数直接丢进去算,不考虑本模型里的湿度修正,误差会非常大。
3. 核心实操:多场耦合模型从0到1搭建全过程
下面进入最核心的部分:在COMSOL里一步步把碳化模型立起来。
3.1 物理场选择:为什么用“稀物质传递”,湿度场怎么选
COMSOL的模型向导里,物理场库一堆,选不对后面全是坑。
碳化模拟中CO₂的传质,我通常选择“稀物质传递(tds)”物理场。有人问:CO₂是气体,浓不浓?为什么不用“浓物质传递(cde)”?原因是混凝土孔隙里的CO₂传质本质上是低浓度气体在复杂孔隙介质中的扩散,以Fick定律为主,浓度梯度不大,不需要考虑Maxwell-Stefan多组分相互作用,用稀物质传递加修正系数完全够用,而且数值稳定性更好。
湿度场的选择要看你想做到什么精度。最严谨的方案是用“多孔介质中的Richards方程(dl)”,把液态水和水蒸气的传输都刻画出,但代价是非线性极强,求解器极难收敛。如果只是模拟室内环境下的碳化过程,我会退一步,用一个简化的“水分扩散方程”来描述相对湿度分布,也就是把湿度当作一个标量场,扩散系数写成湿度的函数,用系数型PDE(一般形式偏微分方程)直接手写,计算效率大幅提升,结果也完全在可接受范围内。
温度场,用“传热(固体)”物理场即可。如果环境温度恒定,甚至可以不用求解,直接把温度设成常数,仅在反应速率表达式里引用即可。
最后是化学反应项。CO₂的消耗速率R通常写成:
R = k × c_CO2 × f(湿度) × g(剩余碳化能力)
其中c_CO2是孔隙气体中的CO₂浓度,k是反应速率常数,f(湿度)可以考虑为湿度的函数或常数,g(剩余碳化能力)表示随着Ca(OH)₂消耗,反应自动变慢。最常见的写法是给一个“碳化程度变量”S,S=1表示还没开始碳化,S=0表示碳化完全。反应速率中乘上S,就能自然模拟出“反应耗尽了就停下来”的物理过程。
3.2 多场耦合的设置:把物理翻译成COMSOL语言
COMSOL里多场耦合有两种写法,一种是直接使用软件预设的多物理场耦合节点,一种是自己在方程中手写耦合项。混凝土碳化这种高度定制化的模型,大多数时候得靠后者。
我习惯的耦合节点是这样的:
-
稀物质传递物理场中,扩散系数不写成常数,而是写成相对湿度(RH)和孔隙率的函数。这里可以用COMSOL的“变量”功能去定义。
-
反应项写在稀物质传递的“反应”子节点里,速率表达式引用二氧化碳浓度、碳化程度S和反应速率常数。
-
湿度场方程里,加一个“水分源/汇”项。因为碳化反应是消耗水分的,每当有1摩尔的CO₂反应掉,就会生成1摩尔水,但生成的水量相比混凝土中初始孔隙水来说很小,多数情况下可以把反应耗水忽略,只考虑CO₂消耗对碳化程度的影响。不过如果模拟对象是干燥环境下高水灰比的混凝土,这个源项建议保留。
-
碳化程度S作为一个模型变量,存储在模型树“定义-变量”里,表达式可以写成关于Ca(OH)₂浓度的积分形式。更简单的做法是直接用“重启动”策略,把S设置成“因变量”参与求解,这样它能随反应同步演化。
从“为什么这样写”的角度来理解:COMSOL的多物理场耦合,本质就是让物理场之间共享变量,用变量的相互引用把方程“绑”在一起。所以你不需要真的懂COMSOL底层怎么离散,但必须知道每个物理场里的每个项对应方程里的哪一部分。
3.3 边界条件与初始条件:从实验数据倒推
边界条件的设置必须跟实验对得上。标准碳化箱实验里,试块通常只有一个面暴露在CO₂环境中,其余五个面用石蜡密封。所以CO₂浓度边界条件就设为:
- 暴露面浓度 = 环境浓度,即固定的狄利克雷边界条件。
- 其余边界通量 = 0,即绝热边界。
湿度边界条件稍微讲究一点。如果试块密封后只有暴露面能跟环境交换水分,那暴露面取环境湿度,密封面取零通量。但如果是三维模型模拟真实墙体,空气面对湿度是“对流”边界条件,就需要引入表面传质系数。
初始条件方面,CO₂浓度初始设为0,湿度初始均匀设定为养护结束后的平衡湿度(比如70%),碳化程度S初始为1。这里有个细节:初始碳化程度不设成1而设成0.99会更利于收敛,因为纯1会导致初始反应速率为0,数值上容易产生跳跃。
3.4 网格与求解:让模型算到50年不卡死的经验
碳化过程是个“慢工程”,动辄模拟10年、30年甚至50年。但碳化前锋是一个极窄的剧烈浓度梯度区域,CO₂浓度从边界值骤降到接近0。如果网格划分不当,要么前锋分辨率不够,算出来的碳化深度不可信,要么网格加密太狠,50年时间步直接算到天荒地老。
我的做法是:在暴露面(CO₂入口)处加边界层网格,第一层厚度设置为预期碳化深度的大约1/100,层数以5~8层为宜,总厚度覆盖预期碳化深度的1/5左右。然后整体用自由三角形(二维)或自由四面体(三维)粗网格填充。
求解器上,我强烈建议用“瞬态求解器”加“自适应时间步进”。COMSOL默认的时间步长控制有时候过于保守,会导致早期几步卡死。你可以手动把初始步长设大一点,比如设为总模拟时间的万分之一,然后再让求解器自适应调整。如果遇到严重不收敛,优先检查是不是湿度场和扩散场之间的非线性耦合太强,可以尝试“分离式求解器”,把CO₂浓度场和湿度场分开迭代求解。全耦合求解器虽然理论上更精确,但在混凝土碳化这类强非线性问题上,往往是分离式更稳。
4. 常见问题与排查技巧实录
说实话,模型本身并不算太难,真正消磨人的是各种报错和各种看起来不合理的结果。下面是我实操过程中遇到的几个典型问题,整理成速查形式。
4.1 “绘图为空”:几何和结果看不见的经典原因
COMSOL里最让人血压飙升的是,建完几何、算完模型,点“绘图”结果却是空的。我遇到过几次,原因大致有三类。
一是几何本身就不存在或没有正确形成实体。这种情况常见于CAD导入后,模型树里的几何对象显示是“空对象”,错误信息往往藏在“几何检查”里,需要去查看是哪个面或哪个体失效了。
二是结果图的“数据集”选错了。COMSOL里瞬态求解后,结果图的默认数据集可能是“研究 1/Solution 1”的全部时间步,但数据集过滤器里选错了时间点(比如选了t=0,而初始条件里所有变量都是均匀的),画出来自然是一张纯色图,看起来像“空”。这时候去“结果”里把时间改成目标时间点,图形就出来了。
三是变量名拼写错误导致表达式无效。比如我自定义的变量S,如果在绘图表达式里写成了s,COMSOL会直接报“未定义变量”或绘一个空图。这种低级错误排查起来很费劲,我后来都养成了在“定义-变量”里统一管理所有自定义变量的习惯,不在表达式里现写现算。
4.2 SolidWorks导出.step后导入COMSOL一堆警告,怎么处理
关于这一步,我的处理流程基本上是固定的:导入时先把单位调成毫米,导入完成后立刻做“几何检查”;有“面缺失”或者“实体无效”的,用“修复”功能一键修复;修复不了的就用“删除实体/面”先把问题区域拿掉,再用“形成联合体”或者“绕Y轴旋转”重建几何基元。
大家抱怨“很多警告”,大多数情况下是警告而不是错误,只要几何体最终形成了可用的实体,警告可以保留不管。如果警告里有“实体与实体之间存在交叉”这种关键信息,那就要认真处理,否则后面划分网格会严重变形。
4.3 求解不收敛:看残差图、调阻尼、砍步长
求解器报“不收敛”几乎是每个用COMSOL的人必经的坎。我判断不收敛原因的经验是:先看求解器日志里的残差曲线,观察哪个物理场残差下不去。
如果CO₂浓度场残差下不去,通常问题是初始条件或者边界条件突变得太剧烈。解决办法是把初始CO₂浓度设成一个极小值(比如1×10⁻⁶而不是0),相当于给系统一个软启动。
如果是湿度场残差下不去,大概率是湿润干燥交界处的导数太陡。可以试试把湿度场的扩散系数下限设成一个很小的正数,避免有效扩散系数趋近0导致方程退化。我做混凝土碳化模拟时,湿度扩散系数的下限我习惯设为1×10⁻¹² m²/s,既能保证数值稳定又不影响物理上合理的湿度分布。
如果两个物理场交叉共同不收敛,就去求解器设置里把阻尼系数调小(从0.9调到0.5左右),再不行就把时间步长上限砍半,代价是计算时间变长,但胜在能收敛。
4.4 碳化深度结果明显偏大或偏小,先检查这五个参数
结果和试验对不上,先别赖COMSOL,很多时候是参数或单位的问题。
- 检查单位是不是米。很多新手把毫米当米输入,几何直接偏大1000倍,结果自然荒谬。
- 检查CO₂环境浓度单位是否换算正确。空气中CO₂体积分数约415ppm,对应的摩尔浓度要根据孔隙率、温度和理想气体状态方程换算,不能直接把0.00045这个摩尔浓度值当体积分数用。
- 检查有效扩散系数是否考虑了曲折度。混凝土孔隙不是直通管道,CO₂走的实际路径比直线长得多,曲折度一般在2到4之间,直接乘以气相扩散系数会极大高估碳化速度。
- 检查反应速率常数是否在合理区间。不同文献给的值差异很大,最好用你自己的试验碳化深度来反演,单点标定后再做预测。
- 检查是否考虑了“碳化阻塞效应”。碳化会降低孔隙率,不把这个动态变化写进扩散系数,长期碳化深度的预测通常会偏大。
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 碳化深度严重偏大 | 扩散系数偏大或未修正曲折度 | 引入有效扩散系数修正 |
| 碳化深度严重偏小 | 反应速率常数设置过大,前锋内CO₂瞬时耗尽 | 调小k,或改用基于Ca(OH)₂浓度限制的动力学 |
| 碳化曲线后期变平 | 材料参数动态变化没有写进去 | 加入孔隙率随碳化改变的逻辑 |
| 结果对网格极度敏感 | 催化剂似的锋面没有足够的网格分辨率 | 加密暴露面边界层网格 |
| 湿度场始终不变 | 湿度扩散系数设为零或边界条件错误 | 检查湿度扩散系数表达式 |
5. 模型验证与结果解读:让数字真正说明问题
模型建完了,算出来一堆彩色云图,这只是万里长征第一步。怎么让审稿人、导师或者说服你自己这模型是可信的,才是关键。
5.1 与实验数据对照:碳化深度是最硬核的标尺
碳化模型最经典、也是最好用的验证指标是“碳化深度”。实验室里用酚酞试剂喷在混凝土断面上,变红的区域是未碳化区,不变色的是碳化区,那个颜色分界面就是碳化深度。
在COMSOL的后处理里,我可以在碳化方向的中心线上画出一条“CO₂浓度-位置”曲线,然后以“碳化程度S降低到0.1以下”的区域近似为碳化区,提取其厚度作为模拟碳化深度。用一个简单的“截线”或“一维绘图组”就能实现。
拿模拟值和不同龄期的实测碳化深度对比,如果误差在10%以内,基本可以认为模型在“碳化深度”这个宏观指标上可靠了。如果误差波动太大,就要回到前面说的参数标定流程去反演有效扩散系数。
5.2 经典结果检验法:碳化深度和时间满足平方根关系
大量试验数据表明,碳化深度和时间的平方根近似线性,也就是常说的:
x_c = k × √t
其中k是碳化速度系数。这个关系从Fick第二定律加边界条件下的解析解可以直接推导出来。在COMSOL里,如果你取一系列的时间点,计算出对应的碳化深度,然后画出“深度-t^0.5”曲线,正常情况下应该是一条近似直线。如果你的模型算出来这条曲线明显弯曲,那说明耦合设置里头有某个环节不对,需要回头排查。
对了,还有个小细节:在COMSOL里提取碳化深度时,建议把浓度阈值设在初始浓度的1%到5%之间,不要用0,因为扩散方程里浓度是渐进衰减到0的,理论上前锋没有明确的终止位置,用接近0的阈值数值上非常不稳定,稍微改一个网格就会跳变。
5.3 模型扩展方向:力学场、氯盐耦合和AI时代的新玩法
基础碳化模型稳定了以后,真正的探索空间才打开。最常见的扩展是三向。
第一是碳化和氯盐侵蚀的耦合。沿海环境下,氯离子和CO₂会同时向混凝土内部渗透。氯离子本身会降低孔溶液的pH,碳化则改变混凝土孔结构,两者相互促进。在COMSOL里把氯离子作为一个新的“稀物质传递”物理场加进来,并与湿度场、碳化程度S建立关联关系即可。
第二是荷载损伤对碳化进程的促进。这需要在模型里引入固体力学场,计算混凝土开裂区域的应力分布,再用损伤因子去修正扩散系数。这里“单向耦合”就够用了,因为碳化对刚度的反馈在常规服役阶段其实很弱。
第三是最近一年开始流行的AI辅助建模。COMSOL官方推出了MCP服务,允许大语言模型通过MCP接口与COMSOL进行交互,可以辅助你生成参数化脚本、排查模型树问题、甚至批量修改物理场设置。我个人试用下来,它能节省一些写表达式和检查语法的零碎时间,但前提是你自己得对模型的物理过程有清晰的框架,否则AI也只能帮你把错误犯得更快。我的态度是:把它当高级插件用,别当物理老师。
写在最后:一些个人的折腾体会
从第一次在COMSOL里画出一个矩形,到最终跑出能对标实验数据的50年碳化深度曲线,中间实在走了不少弯路。如果回头给刚开始做的自己提几个建议,会是这几条。
第一,先把一维模型跑通再上三维。一维不仅计算量小,更重要的是你可以手推解析解做参照,每一步设置对不对,一对照就心里有数。
第二,参数宁可不用文献值也不用瞎猜值。每个参数最好都能在实验室里找到依据,或者至少有一个合理的回归过程。碳化模型结果对有效扩散系数和反应速率常数极其敏感,这两个数漂一点,整个模型就是空谈。
第三,保留一份“基准模型”备忘。当你拿去扩展各种耦合时,随时能回头确认基础模型还能复现,否则扩展一步,错一步,最后根本找不到哪一步引入了误差。
碳化模型这件事,技术上完全说不上“高精尖”,但它的价值恰恰在于把一堆教科书里的基本原理,用计算软件真实地串起来,最终预测一个“你等不起50年”的实验结果。这种把时间尺度压缩、把机理显性化的过程,是数值模拟最让我着迷的地方。希望这份探索记录能帮你少踩几个坑。
