ARTICLE DETAIL

资讯详情

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

Comsol微流控两相流仿真实战:从水平集到液滴生成

Comsol微流控两相流仿真实战:从水平集到液滴生成 做微流控芯片这几年我有一半时间都泡在两相流仿真里。T型通道里生成液滴、气液两相在蛇形流道中的分布、燃料电池流道里水的排出……这些现象背后全是一堆耦合的物理流体流动、界面张力、润湿接触角、甚至温度场和电场。想靠肉眼和实验一遍遍试周期太长成本也扛不住。于是Comsol多物理场仿真成了我的主力工具尤其针对微流体芯片中的两相流问题它能把Navier-Stokes方程和界面追踪方法搭在一起直接在同一个模型里处理多种物理场耦合。这篇东西算是把我踩过的坑和摸出来的门道做个整理给正在做类似仿真的朋友一个可参考的路线。需要说明的是我用的版本是Comsol 6.4部分界面和选项跟旧版略有差异但底层的物理场接口和求解思路基本一致。文章里不会讲那些软件自带的操作手册内容而是把重点放在“为什么这么选”“实际建模时哪里最容易翻车”上。如果你刚开始接触微流控仿真建议先把二维模型跑通再上三维如果你已经在做相关课题可以重点看第二章的物理场对比和第五章的排错清单。1. 为什么我坚持用Comsol做微流体两相流仿真1.1 微流体中的两相流到底难在哪微流控芯片里的两相流跟普通管道里的气液两相流有个明显区别尺度小到几十微米这个量级时重力几乎可以忽略惯性力也退居二线表面张力变成了主导因素。这就带来三个麻烦。第一界面形状直接决定流动行为。液滴能不能均匀生成取决于两相界面的剪切力与表面张力的平衡弯月面在沟槽里的运动受接触角影响极大。接触角哪怕差几度结果就可能从“完全填充”变成“死角残留”。第二两相界面本身是移动的位置和形状随时间和空间变化需要数值方法去追踪。这不像单相流那样固定网格就能算必须引入界面捕捉或者界面追踪技术。第三实际芯片往往不是单纯流动问题。很多场景里还要耦合电场比如介电泳液滴操控、温度场比如加热引发相变、浓度场比如两相间的传质反应。如果仿真软件的多物理场耦合能力不行每加一个物理场就要重新建模导出工作量翻好几倍。1.2 对比FluentComsol在微尺度场景下的优势很多做传统CFD的朋友喜欢用Fluent做气液两相流也能选VOF模型而且Fluent的并行效率在大规模网格下确实厉害。但在微流控芯片这类“多物理场复杂几何小尺度”的场景里我个人更偏向Comsol原因有三个。第一是建模方式。Comsol的几何是参数化建模微通道的宽度、弯道半径、T型接头的角度都可以设置成变量后期做参数化扫描很方便。Fluent里的几何通常需要从外部CAD导入改几何要回建模软件重画在项目初期方案频繁调整的时候很折腾。第二是物理解耦合。Comsol做多物理场是天然的优势流动、传热、稀物质传递、静电、固体力学这些物理场可以直接在同一个模型里添加用“多物理场”节点自动耦合。比如我要模拟“电润湿条件下的液滴移动”Fluent里需要打开电势方程、表面张力模型、移动网格或者VOF还要手动写UDF去处理接触角随电压变化。Comsol里则是把层流两相流和静电接口连接起来接触角绑定电压变量几分钟就设置完。第三是后处理灵活。Comsol的派生值可以直接对任意域或边界求积分、平均值、最大值还能把物理量导出成表格我经常用它来提取液滴长度和界面面积随时间的变化曲线非常顺手。Fluent的后处理当然也不弱但跨物理场的数据整合还是Comsol更直接。当然Fluent也有自己的优势超大网格规模、成熟的气液两相流数值方法、大量的工业验证案例。如果算的是米级管道里的段塞流或者大规模并行计算Fluent可能更合适。但对微流控芯片这种小尺度、多物理强耦合的问题Comsol的灵活性和集成度明显更匹配。1.3 适合用Comsol仿真的微流体两相流场景我这几年代过的东西里有三类场景是Comsol的强项。一是液滴微流控。T型通道、流动聚焦、共轴毛细管里生成单乳粒或双乳粒核心是界面不稳定性控制。用水平集方法可以很好地模拟液滴从生成到脱离再到下游运动的全过程。二是燃料电池流道内的水管理。质子交换膜燃料电池的气体流道里液态水与空气形成两相流动需要判断水在流道内的积聚位置和排出效率。Comsol可以耦合气体扩散层的多孔介质流动和气体流道中的自由流动两相流甚至加入电化学反应的热效应这在完整燃料电池模型中很实用。三是微混合器与微反应器中的气液反应。比如芯片内微通道中的气液段塞流气体和液体交替通过蛇形通道两相间发生吸收反应。仿真需要同时计算流场、界面位置、组分传质和反应动力学这种全耦合问题Comsol的多物理场框架特别好用。2. 物理场选择水平集、相场还是移动网格2.1 三个方法的核心思路Comsol里做两相流常用的接口分布在“流体流动”模块下面包括层流两相流-水平集、层流两相流-相场以及层流两相流-移动网格也就是流固耦合意义上的移动网格实际上常用来做界面追踪。它们都用Navier-Stokes方程描述流体运动区别在于怎么处理界面。水平集方法引入一个水平集函数φφ0.5的地方代表界面。通过求解水平集的对流方程界面可以随流动自然地移动、合并和断裂。它的最大特点是不需要显式追踪界面拓扑变化液滴破裂、聚合都能自动处理非常适合微流控中的液滴生成。相场方法用的是Cahn-Hilliard方程等价于一个扩散界面模型。它会额外求解一个相场变量及其化学势界面有一个有限厚度由混合能量密度控制。优点是能量变分框架理论上更有物理基础能处理界面变形比较剧烈的过程但计算量比水平集大不少因为需要多解一个高阶方程。移动网格方法则是把界面当成一个真实的几何边界网格跟随界面移动。它是最精确的界面追踪方法界面尖锐、没有人为厚度但只适合界面拓扑不发生变化的情况。液滴一旦发生合并或断裂移动网格就会因几何重构失败而崩溃。2.2 我的选择逻辑和适用场景接下来这部分很关键。如果你要在微流控芯片里模拟液滴生成或者关注长时间的界面演变我建议你优先用水平集。它的界面厚度参数可以控制计算速度快而且对拓扑变化鲁棒。我自己做T型通道液滴生成水平集跑起来很稳。如果二维情况下面临强界面变形、接近Spurious currents严重的时候相场方法在理论界面重构上更平滑。不过代价是计算量成倍增加三维情况下我几乎不考虑相场除非对界面附近的速度场精度有很高要求。移动网格法我只在两种情况下用一是纯二维的简单几何里模拟一个液滴沿着通道运动不会发生破裂二是为了验证水平集结果用移动网格做一种高精度的“数值实验”对比。三维微通道里轻易别用移动网格网格重划分导致的收敛问题会让你怀疑人生。说到这儿顺便提一句有些人关心“Comsol和Fluent哪个更适用”。我的看法是如果只算两相流不耦合其他物理Fluent在算法成熟度和并行效率上更好一旦牵扯到微流体芯片特有的多物理场耦合Comsol里水平集和相场接口的便捷度是Fluent没法比的。你可以两者都用但最终目的都是拿到准确的界面动力学信息而不是纠结软件名头。2.3 网格与界面厚度的匹配原则无论选水平集还是相场有一个核心问题必须搞清楚界面厚度参数和网格尺寸的关系。水平集中的界面并不是零厚度的数学面而是有一个过渡带。Comsol默认的界面厚度参数ε通常取“界面附近网格尺寸”的一半量级。如果ε设得太小小于最小网格尺寸数值上没法解析界面容易产生震荡如果ε设得太大界面被抹得又宽又模糊液滴尺寸和形状都失真。我常用的规则是先估算出界面区域的网格尺寸比如设为h然后把ε设为h/2。同时保证ε不小于1微米在微流控尺度下。在实际扫描中我会试ε分别取2、3、4微米对比液滴直径的差别选择变化小于1%的值。相场方法的界面厚度参数也有类似问题。Comsol中相场的界面厚度由“相场参数”决定它跟表面张力和混合能量密度有关。相场方法对界面厚度的要求更苛刻因为过大的界面厚度会直接影响相场变量梯度和毛细力计算。所以如果通道非常窄只有20微米相场仿真的网格往往会变得非常密这也是我劝你别轻易用它算3D的原因。3. 实操全过程T型通道液滴生成仿真3.1 几何建模与参数变量设置我们以一个最经典的微流控芯片结构——T型通道为例。连续相比如水从主管道入口流入分散相比如矿物油从侧通道垂直流入在交叉口形成液滴并随连续相向下游运动。在Comsol中创建二维几何主管道宽100微米长800微米侧通道宽60微米从交叉点垂直向上延伸200微米。这个尺寸是模拟的实际芯片可能是3D倒模结构但二维模型用来研究液滴生成机理已经足够。如果你想模拟三维通道几何上只需要拉伸厚度但要考虑入口和出口的重力效应不过在微尺度下通常重力可忽略。建议把所有尺寸设为全局参数比如w_main100[um], L_main800[um], w_side60[um], L_side200[um]。这样后面做参数扫描时只需要修改参数节点网格和边界条件会自动更新。3.2 材料参数与两相流物性材料参数是两相流仿真最容易出错的地方。以水连续相和油分散相为例需要设置密度、动力黏度、表面张力和接触角。水的密度约998[kg/m^3]动力黏度约1.002e-3[Pa·s]矿物油的密度约830[kg/m^3]动力黏度约0.02[Pa·s]不同油品差异很大自己做实验的话最好实测。水和油的表面张力系数设为0.03[N/m]壁面接触角设为45度这个值代表水相对通道壁面的润湿性如果是油做连续相可能就要设成135度。这些参数在Comsol的“层流两相流-水平集”接口中设置。水平集接口还要求输入“界面厚度参数ε”我前面说了先取2.5微米试跑。如果后面计算结果对ε不敏感可以再把网格加密后减小。3.3 边界条件与入口速度设定T型通道有三个入口边界主管和侧管一个出口边界。在层流接口里入口设置为“速度边界”给定速度值。连续相速度设为0.1[m/s]分散相速度设为0.05[m/s]这个比例决定液滴长度很重要。水平集界面里入口也需要指定水平集函数值。主管入口连续相入口设φ1因为初始时主管内全为水侧管入口分散相入口设φ0或反过来取决于你定义的相。出口处设置压力为0并要选择“抑制回流”选项避免出口回流导致数值震荡。壁面的设置有一个容易忽略的地方在“壁面”节点里除了默认的无滑移条件还要在水平集接口中设置“润湿壁面”指定接触角。接触角是影响液滴形状和脱离频率的关键参数后面我们会做扫描。3.4 网格划分与边界层加密网格是两相流仿真的“生命线”。微流控通道长宽比大界面区域又很小网格必须区分“界面区”和“体相区”。首先用“自由三角形网格”对整个域生成网格最大单元尺寸控制在20微米保证整个通道畅通。然后在主管道和侧通道交叉的区域以及预计液滴形成和运动的方向下游几百微米区域使用“尺寸”节点设置局部加密最大单元设为3微米左右。更讲究的是在通道壁面加入边界层网格。T型交叉口附近流动变化剧烈且液滴与壁面有接触壁面边界层能让黏性应力计算更准确。边界层层数建议5层第一层厚度0.5微米层拉伸因子1.2。如果你熟悉网格划分也可以先用“边界层”节点自动生成再检查壁面y值微流体层流中y通常远小于1所以问题不大。我有个习惯第一次跑模型时网格适中偏粗保证能跑通等流动和界面趋势正确再加密界面区域网格做网格无关性验证。不要一上来就疯狂加密那样一个案例要跑内存和耐心都受不了。3.5 求解器设置与稳定性调整两相流仿真本质上是非稳态问题参数在Comsol中设置时求解器默认是瞬态。我的推荐是使用“全耦合”求解器它能同时求解流动方程和水平集方程稳定性和收敛性通常比分离式好但内存占用更高。更“省内存”的做法是第一个求解步骤只求解层流不激活水平集先把流场算稳定再用该结果作为初值激活两相流。这个技巧叫“逐步求解”在微流控仿真里特别好用能避免初始界面和速度场不匹配造成的剧烈震荡。时间步长控制上我一般设置“初始步长”为1e-6秒最大步长1e-4秒。如果你发现界面附近的CFL数库朗数大于0.5就要减小步长。CFL数可以近似为速度×时间步长/最小网格尺寸。通道内速度0.1m/s最小网格3微米步长1e-5秒的话CFL≈0.33比较安全。求解过程中务必打开“自动保存”设置每计算多少物理时间保存一次结果。两相流模拟往往要跑几万步中途崩溃在所难免自动保存能救你命。4. 结果分析与参数化扫描从液滴长度到毛细数4.1 观察界面形态与液滴生成过程计算完成后先看界面演变。在结果中绘制水平集函数φ的等值面二维即等值线选φ0.5那条线作为界面位置。用颜色表达式显示φ值界面处会呈现从0到1的过渡带。你需要关注三个时间段初始入口段、液滴形成段、充分发展段。如果初始界面设置不合理前几个时间步可能看到界面剧烈变形甚至产生伪液滴。这时可以通过调整初始的水平集函数分布或者先让流场稳定再激活两相流来缓解。液滴生成频率和长度是微流控芯片设计的关键指标。在Comsol里可以用“派生值-线平均值”在主通道某条横截线上监控界面通过情况。具体做法是画一条垂直于流动方向的直线计算φ的平均值随时间的变化。当液滴通过时φ值会从水相接近1切换到油相接近0再切回形成方波信号。读取这个信号的周期就能得到液滴生成频率读取每一次切换持续的时间配合速度就能估算液滴长度。4.2 毛细数Ca对液滴生成模式的影响为了研究两相流力学机理我通常做参数扫描保持通道几何不变改变连续相速度或表面张力系数观察液滴长度和频率的变化。这时引入无量纲数——毛细数Ca定义为Ca μ_cont × v_cont / σ其中μ_cont是连续相黏度v_cont是连续相速度σ是界面张力系数。它代表黏性应力与表面张力之比。在Comsol里用“参数化扫描”扫描速度v_cont从0.05到0.3[m/s]其他参数固定。计算后发现低Ca时液滴长度较短形成频率较高界面在交叉口附近就会颈缩断裂高Ca时液滴更长甚至会进入喷射或平行流状态。这个结果对芯片设计意义重大如果你需要更多更小的液滴就应降低连续相速度或增大表面张力如果你要大批量稳定生成长液滴则要适当提高Ca。另外别忽略接触角的影响。壁面接触角从30度变化到90度液滴在通道中的形状会从扁长变为更圆润脱离位置也会移动。把接触角也加入参数化扫描能得到一组漂亮的液滴形态相图这是发文章时特别常用的结果。4.3 压力场、速度场与剪切力提取界面只是冰山一角内部的应力分布才是决定液滴稳定性和混合效率的底层原因。在结果里添加速度场图用箭头显示速度方向观察交叉口附近的涡旋。你会看到在液滴的尾部和前部存在局部速度梯度这就是剪切力来源。用“表面-剪切率”表达式 μ*(∂u/∂y∂v/∂x) 可以快速查看剪切率分布。对于液滴内的微混合通常用“混合指数”评价实际上就是对浓度场标准差积分。需要先添加稀物质传递物理场并设置一个示踪物质从入口进入。然后计算某个横截面上浓度分布的标准差标准差越小意味着混合越均匀。这个方法我经常用来评估不同结构比如加入挡板对微混合器的效果。4.4 导出数据与可视化要点Comsol的后处理非常灵活但初次上手容易画得难看。这里分享几个实用技巧界面图用“等值线”绘制等值线值设为0.5线色设为黑色或白色线宽2-3像素背景色设为浅色这样打印到论文里最清晰。液滴长度提取如果用平均值太粗糙可以改用“积分-线积分”计算界面上φ0.5的弧长再换算成液滴长度。做动画时把帧数设成100左右选择“保存为GIF”可以直接嵌入PPT演示。注意动画文件较大最好压缩一下分辨率。如果想把数据导入MATLAB做进一步处理可以在“衍生值”里选择“表格”把界面坐标数据导出成CSV再用MATLAB画图。5. 常见问题与排查技巧实录5.1 界面不收敛、发散或出现伪速度两相流仿真最怕发散。常见表现是计算进行到某个时间步界面附近速度出现奇怪的振荡然后压力曲线飞起直接报“找不到一致初始值”或“求解器无法收敛”。我排查的顺序是这样的先看网格是否足够细。微流控通道中界面通常集中在很薄的区域如果界面处只有一两层网格必然发散。把局部加密尺寸减半再试。再看时间步长。CFL数过大是首因。自动时间步长有时会步子迈太大我习惯手动限制最大步长不让它超过1e-4秒。还有一个容易被忽略的是初始条件。比如你设了入口速度但整个计算域的初始速度为零界面处的流体应力就会瞬间巨大化。解决办法是“两阶段求解”先仅求解层流将速度场收敛后再打开两相流接口的瞬态界面初始场设为稳定速度场这样震荡会小很多。5.2 液滴长度总是“不太对”如果模拟的液滴明显比实验短或长多半是物性参数问题而不是计算方法问题。先检查表面张力系数微流控油水界面张力在0.01~0.05 N/m范围具体取决于油相成分。你如果直接套用文献值很可能跟你的芯片材料不匹配。有条件的话用悬滴法实测没条件就按参数扫描范围设几个值找出与实验最接近的。然后是接触角。静态接触角是可以直接测量的但动态接触角会随流速变化。模型里通常只能设一个接触角你需要选择“平均”那个值。另外水平集方法本身对接触角迟滞效应模拟能力有限如果你发现界面钉扎效果特别明显说明接触角取值可能偏保守了。出口边界条件也影响液滴长度。如果出口长度太短液滴可能没充分发展就流出下游压力边界的影响会反馈到上游。我建议出口段至少保留通道宽度的5倍以上长度。5.3 计算量大到跑不动二维仿真还好三维微流控两相流一旦网格加密计算量会爆炸。几个保守的优化技巧用二维模型层高等效法。微流控芯片通常高度远小于长度但Z方向有受限效应。你可以改用“二维近似”并手动调整黏度把通道高度的影响等效到二维Navier-Stokes里比如使用Brinkman项的深度平均方法精度对于趋势判断完全够用。开启“自适应网格”功能。水平集接口支持自适应网格重构它会在界面处自动加密而在远离界面处粗化。实测可节省约60%的网格数量速度提升明显。合理设置求解时间。如果你的液滴生成周期是10毫秒只需算到30毫秒就能提取完所有信息不必一直算到100毫秒。在求解器设置里的“停止条件”可以设置当液滴数量达到N个时停止。5.4 用MATLAB控制Comsol批量仿真很多时候需要做几十组参数扫描手动在Comsol里修改再计算是非常折磨人的。Comsol提供Livelink for MATLAB接口可以让你用MATLAB脚本完全控制模型修改参数、执行求解、导出结果。我常用的套路是先在Comsol GUI里把模型搭好保存为.mph模型文件。然后在MATLAB里用model mphopen(tjunction.mph); 打开模型再通过model.param.set(v_cont, 0.1); 修改参数最后model.sol(sol1).runAll(); 执行求解。循环里批量修改速度、表面张力系数计算完直接提取结果数据汇总成一个数据表。写脚本时注意两点第一每算完一格要清空结果数据避免内存堆积第二要加try...catch结构某个参数组合发散时不中断整个循环而是记录失败点和原因继续下一组。在我做毛细数扫描时这个脚本每次能跑几十个case一个晚上收工。5.5 一些杂七杂八的实战经验最后分享几个零碎但管用的细节。第一壁面润湿条件不要一开始就设先设为“中性接触角”90度试跑等基本流程走通以后再加润湿条件。润湿条件会引入额外的界面力常常是收敛困难的重要来源。第二结果分析时如果发现界面质量不守恒总液体体积随时间漂移多半是水平集方程求解精度不够。增加水平集方程的相对容差从默认的0.001改到0.0001虽然会拖慢速度但体积守恒会明显改善。第三在三维模型里如果想减少网格量可以考虑用“对称”条件。如果T型通道左右对称只计算一半区域在对称面上施加对称边界渲染结果时再镜像显示。这样计算量直接减半。我在做燃料电池流道内水排出的案例时最开始也迷信三维模型结果算了三天没算出结论改用二维加等效参数模型后一个晚上就能把所有工况扫描完。仿真的核心目的是辅助决策而不是给自己制造巨型计算任务。能用等效模型合理简化时别犹豫。最后再补充一句关于版本选择的个人看法。Comsol 6.4在水平集接口和求解器上做了不少优化界面和公式编辑器也顺滑了很多如果你用的是老版本很多操作位置可能需要核准一下但底层物理场框架是稳定的。如果你在用Linux服务器批量计算记得设置无头模式运行配合MATLAB脚本也可以实现全自动参数扫描。方法都是通的关键是先把二维模型调通再往三维和复杂功能上扩展。
返回列表