☰
超声空化气泡仿真:COMSOL建模与收敛调优要点解析
2026/10/3 22:44:34 网站建设 项目流程

超声空化气泡仿真这个课题,我前前后后折腾了挺长时间,说实话,真正让大家卡住的往往不是思路,而是数值稳定性和参数合理性。空化本质上是液体在强超声作用下局部被“拉断”、形成气泡,随后气泡在声压交替变化中急剧膨胀、迅速压缩,最终在极短时间内溃灭的过程。整个过程持续时间可能还不到1毫秒,但局部压力和温度可以瞬间飙到上千K和几十MPa,所以COMSOL超声空化气泡仿真的难点,就是在这样一个高度瞬态体系里,把气泡的动态行为合理地算出来。

这篇文章适合正在做超声清洗、声化学、微流控或医学超声相关课题的学生,也适合希望用COMSOL搭一个能跑通空化模型的工程师。我会从物理机制讲起,逐步拆解建模思路、关键参数、操作步骤、收敛调优和结果验证,把我踩过的坑一次性多说一点,帮你少走弯路。

1. 模型设计思路:先把物理过程和建模范式理清楚

1.1 超声空化不是“压碎气泡”,而是受迫振荡下的膨胀与坍缩

很多人第一次听到“超声空化”,以为就是声波把气泡压碎,其实恰恰相反。拿正弦超声场来说,声波在液体里交替形成正压相和负压相。在负压相,液体受到的拉伸应力足够大时,原本存在于液体中的微小气核会迅速膨胀,从微米级尺寸长大到几十甚至上百微米;随后声波进入正压相,周围液体反过来挤压气泡,气泡体积急剧缩小,最终溃灭。

这个“膨胀—压缩—溃灭”的过程,才是超声清洗去污、声化学产生自由基、医学超声碎石等一系列应用的物理基础。所以仿真里最需要抓住的,是气泡半径R(t)随时间的演化,以及溃灭瞬间气泡周围的压力场、速度场变化。不能简单理解成一个静态结构问题,它是一个典型的动边界、强非线性、多物理场耦合问题。

在COMSOL里做这类仿真,通常要同时考虑:

  • 液体域的压力和速度变化(流体力学);
  • 气泡边界的移动(几何大变形);
  • 气泡内部压力的变化(热力学关系);
  • 声压驱动的外部激励。

这四个因素互相影响,任何一个环节设置不对,结果就不对,甚至干脆发散到没法看。

1.2 三种建模思路的取舍:全耦合CFD、均匀内压模型、瑞利-普莱赛方程

我见过很多新手一上来就打算用“最完整”的方案:气泡内部也建立气体域,液体、气体都用真实流体方程求解,再加上移动网格和层流,看起来非常高端。但对于绝大多数工程仿真来说,这个方案不是最优选择,因为网格要同时捕捉泡内气体的运动、泡壁的剧烈变形,计算量很大,而且收敛性差,很多情况下跑几微秒就发散。

我这里更推荐三种常用范式,按精度和开销排个序:

建模方式气泡内部处理适用场景计算量收敛难度
完整CFD+ALE真实气体域,求解可压缩流动研究气泡内部物理、激波、温度分布最大最难
均匀内压+ALE不建气体域,用热力学公式算气泡压力计算气泡半径变化、外部流场中等中等
瑞利-普莱赛ODE不建几何,直接解气泡半径的常微分方程只关心R(t)规律、参数扫描很小容易

我平时用得最多的是第二种:液体域用层流接口求解,气泡壁用移动网格跟踪,气泡内部不建模,而是把气泡内部压力当成一个随体积变化的热力学量,通过理想气体绝热关系耦合到气泡边界上。这样做既有空间分辨率,能看到液体里压力波的形成和传播,又省掉了气体域那一大堆网格和麻烦的界面条件,非常适合做超声空化气泡的起步仿真。

至于第三种瑞利-普莱赛方程,它更适合做参数扫描和理论对比用,我后面在结果验证部分会再提到。

2. 建模前准备:量纲、材料参数和物理场选用

2.1 量纲体系和初始气泡参数是后面一切的基础

COMSOL默认使用国际单位制(m、s、Pa、kg),但问题在于超声空化里气泡尺度在微米级,时间尺度在微秒级。你如果不注意单位,一个参数输错10个数量级,结果很容易飞掉。

我习惯在“全局定义”里把关键量统一写成带单位的表达式。比如:

参数名表达式说明
R010[um]初始气泡半径
p01[atm]环境静压
rho_l998[kg/m^3]液体密度,近似纯水
mu_l0.001[Pa*s]水的动力粘度
gamma_g1.4气泡内气体绝热指数
sigma_lg0.072[N/m]水与空气的表面张力
f_ultra20[kHz]超声频率
p_A0.5[MPa]超声声压幅值

这些参数不是随手填的。比如p_A,超声清洗设备在液体中产生的声压幅值一般在0.1-1MPa量级,如果太小,气泡不会膨胀到足以发生空化的程度,只会线性振荡;如果太大,数值上又极难稳定,初学者建议先从0.3-0.5MPa起步。

初始气泡半径R0取10微米左右,是因为液体中的空化核通常就是这个量级。太大太小都不自然。这里顺带提醒:气泡半径和超声频率是互相制约的,后面做参数扫描时会看到。

2.2 超声激励参数怎么定才贴近真实工况

超声频率的选择直接决定气泡的动态行为。有个经典的Minnaert频率公式,用于估算气泡在液体中的线性共振频率:

f0 = (1 / 2π) * sqrt(3 * γ * p0 / ρ) / R0

把水的参数和R0=10μm、γ=1.4代进去,算出来大约300kHz左右。但实际超声清洗用的频率往往在20-40kHz,远低于共振频率,此时气泡处于受迫振荡状态,膨胀幅度反而大,空化效果强。

所以在仿真里选频率,先想清楚你是要模拟“共振增强型”气泡,还是模拟“工程设备型”空化。我做工程验证时,习惯先用20kHz做基准算例,因为一个周期50μs,计算时间不至于太长,气泡演变过程也容易观察。做理论对比时,再回到接近共振频率的情况。

另外要注意,声压幅值一般应大于所谓“空化阈值”,也就是液体能承受的负压峰值。对于纯水,理论阈值很高,实际由于液体里存在气核,阈值大大降低。工程上常用0.1MPa以上作为起步值。

2.3 物理场接口与多物理场耦合关系

本方案涉及四个核心接口/功能:

  • 二维轴对称下的层流接口(spf),求解液体速度场和压力场;
  • 移动网格(ALE),跟踪气泡壁的几何变形;
  • 全局ODE或积分算子,计算气泡体积和内部压力;
  • 层流接口中的边界条件,用来施加超声压力激励。

它们之间的关系是这样:层流接口给出液体对气泡壁的压力和粘性力;ALE让气泡壁随液体运动而移动;气泡体积变化反过来通过气体绝热关系改变气泡内压;内压又作为载荷作用在气泡壁上。这一圈耦合起来,整个模型才真正“闭合”。

有人会问,这里要不要再单独加一个“压力声学”接口?如果你的主要目的是研究气泡本身的动力行为,而不是描述超声从换能器传播到气泡的复杂路径,那就不需要。直接在液体边界施加随时间变化的压力激励即可,可以大大降低计算量。只有当你要模拟换能器、反射边界、驻波场这些复杂声场时,才需要加入压力声学模块。

3. 实际操作:COMSOL中从几何到求解的完整实现

3.1 几何绘制和集合划分

我采用的思路是:建一个二维轴对称模型,气泡放在左下角,外圈是液体域。

具体做法很简单:

  1. 创建一个矩形,宽度取200μm,高度取400μm;
  2. 在左下角以坐标原点为圆心,做一个半径R0=10μm的圆;
  3. 用布尔操作从矩形中减去四分之一圆,剩下的就是液体域;
  4. 那个四分之一圆的弧线,就是气泡壁。

用二维轴对称,是因为球形气泡绕中心轴旋转对称,二维平面上的“四分之一圆”旋转后就是真实的三维球形气泡边界。这样做可以大幅减少网格数量,又不影响对球形气泡物理行为的描述。

这里特别提醒:几何尺寸的比例要控制好。液体域宽度和高度的量级必须远大于气泡半径,否则边界反射会严重干扰气泡附近流场。但也别太大,几百微米的尺度对于20kHz超声来说,声波穿越整个计算域只需要不到1微秒,属于真正的“近场”,压力近似均匀,反而更符合我下面用的边界激励方式。

3.2 移动网格(ALE)的关键设置

移动网格是整个模型里最容易出问题的地方,没有之一。

COMSOL的移动网格接口主要控制“几何如何变形”。正常情况下,液体域是一个整体,不能随便变形,否则网格会缠绕、翻转。所以要做这样的设置:

  • 液体外边界(矩形右侧和上侧)设为固定边界,或者只在垂直方向滑动;
  • 对称轴边界保持r=0不动;
  • 气泡壁边界设为自由变形边界,允许跟随流体运动。

实际操作中,我通常把矩形顶边设为“指定网格位移”中的y方向固定,x方向自由;右边和底边类似,只保持各自方向固定;左侧对称轴固定;唯独气泡壁那一段弧线,不施加任何网格位移约束,完全由流体计算得到的变形来驱动。

这里有个重要技巧:移动网格的“平滑类型”选择“超弹性”或“Yeoh”,比默认的“Laplace”更能处理大变形。因为气泡在溃灭阶段半径变化非常剧烈,如果平滑性不够,网格很容易畸变。

3.3 层流方程的设置与气泡内压耦合

层流接口里,液体域密度设为约998kg/m³,粘度设为0.001Pa·s。比这更重要的是“可压缩性”设置。

超声空化中气泡溃灭会产生强烈的压缩效应,所以不能简单把液体当不可压缩流体处理。一般建议在层流物理场的“可压缩性”下拉菜单里,选择“可压缩流动(Ma<0.3)”这一档,COMSOL会加入弱可压缩近似,密度随压力变化,但计算难度比全可压缩低很多。

气泡内压的耦合,就要用到前面说的均匀内压模型。气泡内部压力p_g近似为:

p_g = p_g0 * (V0 / V)^γ

其中V是当前气泡体积,V0是初始体积,γ取1.4(绝热过程)。这个公式来自理想气体绝热压缩关系,对于微秒级、几十微米尺寸的气泡来说,热交换来不及发生,绝热假设是合理的。

在COMSOL里实现时,需要先用“几何实体选择”把气泡壁边界选出来,然后定义边界积分算子计算气泡体积,再把p_g作为边界载荷加到气泡壁上。注意方向:气泡内压对液体域的作用方向是沿内法线朝外推,也就是说,方向与液体指向气泡内部的法线相反。这里方向搞反的话,气泡会直接发生“内爆式发散”,结果完全不可信。

另外,杨-拉普拉斯公式表明,气泡壁处内外压力差等于表面张力项:

p_in - p_out = 2σ / R

所以在设置边界力平衡时,必须把表面张力也加进去。忽略这一项,小气泡的行为会偏差很大。

3.4 超声压力的加载方式

声压激励最省事的加载方法,是在液体域的外部边界上施加随时间的振荡压力。具体来说,把模型顶部边界设为压力条件,压力表达式写成:

p_top = p0 + p_A * sin(2π * f_ultra * t)

p0是环境静压,p_A是声压幅值,f_ultra是超声频率。

为什么可以在顶部边界直接加压力?因为计算域只有几百微米,声波波长在20kHz时约75mm,计算域远小于波长,所以在气泡附近的声场可以认为是空间近似均匀的,只有时间上振荡。这种处理能极大简化模型,又不会丢掉主要物理。

需要注意的是,负压相时顶部压力会低于环境压力,这正是气泡得以膨胀的原因。如果你把压力边界设成“始终大于静压”的错误形式,那气泡就永远膨胀不起来,仿真结果也就无从谈起。

3.5 网格划分:气泡附近一定要加密

网格质量直接决定ALE计算能否收敛。

我的经验是:

  • 气泡壁弧线上至少布置20-30个单元;
  • 从气泡壁向外生成边界层网格,第一层厚度取0.5μm左右;
  • 液体域其他区域用自由三角形网格,最大单元尺寸控制在20μm以内;
  • 整体网格单元数在几万到几十万之间,具体看你的内存。

有人会问,气泡壁上的网格要不要随气泡膨胀自动加多?在ALE框架里,单元数量不变,只改变位置和形状。所以初始网格的划分质量非常重要,如果一开始气泡壁网格太稀疏,膨胀到最大半径时,相邻单元会被拉得很长,最终导致单元畸形、雅可比行列式变负,然后整个求解直接崩掉。

网格划分完,建议先做一次“网格质量”检查,重点关注气泡壁附近,如果出现大量红色区域,最好加密或调整几何后再继续。

3.6 瞬态求解器与收敛容差

COMSOL求解超声空化问题,基本都用瞬态求解器。求解器配置上有几个值得注意的点:

  • 时间步进方式选“BDF”,阶数一般用2阶或5阶,气泡问题用2阶往往更稳;
  • 初始时间步长设小一些,比如1e-10秒量级,让求解器自适应增长;
  • 求解器容差设为“严格”或自定义到1e-5以下,默认的宽松容差容易让压力场失真;
  • 代数求解器一般选PARDISO,内存足够时最稳定。

总求解时长要覆盖至少一个完整声压周期。以20kHz为例,一个周期50μs,建议从t=0算到t=50μs,必要时算两个周期,才能看到气泡从膨胀到溃灭的完整过程。

如果算力紧张,可以先用纯瑞利-普莱赛ODE模型跑一遍,大致确认参数合理,再用完整二维模型细算。这个“先用快模型试参数,再用慢模型出结果”的思路,能帮你节省大量时间。

4. 仿真发散排查与收敛性调优

4.1 发散问题的三个根源

我做过的空化仿真里,发散原因几乎都逃不过这三类:参数不合理、网格畸变、时间步长过大。

参数不合理最常见的是声压幅值过大。我见过有人一上来就设1MPa、2MPa,结果气泡在第一个负压相就膨胀到初始半径的十倍以上,ALE网格直接扭曲,求解器报“找不到一致的初始值”或“时间步迭代不收敛”。这种情况不是软件不行,而是你让气泡做了一件超出模型能力的事。

网格畸变是ALE模型的经典问题。气泡快速膨胀再快速收缩,壁面附近的网格会经历剧烈的拉伸和压缩。如果初始网格在气泡壁方向排布不够均匀,或者外边界固定太死,网格形态就很容易恶化。

时间步长过大则是新手最容易忽略的地方。瞬态BDF求解器虽然会自适应调整步长,但初始步长和最大步长限制如果设得不好,求解器会在气泡快速溃灭阶段疯狂减步长,导致计算时间暴增,或者干脆无法收敛。

4.2 时间步长与网格尺寸的配合经验

气泡坍塌时,泡壁速度可以高达数百米每秒,甚至超过千米每秒。你可以用一个简单的CFL条件来估算最大允许时间步长:

Δt_max = Δx / v_wall

假设气泡壁附近最大网格尺寸是1μm,泡壁速度是500m/s,那么Δt_max大约是2e-9秒。也就是说,如果要捕捉溃灭瞬间的细节,时间步长必须到纳秒量级。用20kHz一个50μs周期来算,总步数可能上万甚至更多,这对计算资源是有要求的。

这也是为什么我强烈建议先用瑞利-普莱赛方程快速跑一遍,把合理的参数窗口标定出来,再动用完整二维模型。否则你会在一次次发散中浪费大量时间。

4.3 气泡溃灭时的特别处理:自动重新网格化

遇到严重大变形,光靠ALE的网格修匀是不够的,需要开启COMSOL的“自动重新网格化”功能。

这个功能的作用是:当ALE网格质量低于预设阈值时,求解器暂停计算,在当前位置重新生成一套新网格,然后把现有解插值到新网格上继续算。这几乎没有状态丢失,但对插值误差敏感。

在COMSOL里,自动重新网格化的位置通常在“研究”设置里的“瞬态”节点下,勾选“自动重新网格化”,并指定触发条件为“最小网格质量”或“最大网格失真”。建议把阈值设在0.2-0.3左右,太低的话网格已经坏了再重新生成也没意义。

有一个常见的坑:开启自动重新网格化后,计算速度会明显下降,且某些边界载荷表达式里如果包含了坐标r或体积积分变量,重网格后这些变量可能因插值而出现微小跳动,导致结果曲线不光滑。如果发现气泡半径曲线出现“锯齿状”抖动,很可能就是重网格插值造成的,需要减小触发阈值或优化网格划分。

4.4 常见错误速查表

现象可能原因解决方法
刚开始就算不下去初始条件不一致或参数数量级错检查单位换算,改用更小p_A,放宽初始步长
气泡壁网格反向翻转ALE平滑类型不适合大变形改用超弹性平滑,加密气泡壁附近网格
塌缩阶段时间步骤减泡壁速度太快,CFL条件限制开自动重新网格化,使用更小最大单元尺寸
压力云图出现锯齿状高频振荡时间步长过大,或求解器容差太宽减小容差,限制最大时间步长,检查BDF阶数
气泡半径曲线乱跳自动重新网格化插值误差降低重网格触发频率,优化网格质量
负体积错误计算域或气泡区域发生自交叠检查几何边界约束,重新划分气泡壁附近网格

5. 后处理与结果验证

5.1 气泡半径随时间如何提取

二维轴对称模型算完后,气泡半径可以从几何变形结果里直接取。更准确的做法是:用定义好的边界积分算子,在每一步计算气泡的体积V(t),然后用球形体积公式反推等价半径:

R(t) = [3V(t) / (4π)]^(1/3)

把这组曲线画出来,就是气泡半径随时间的变化图。这个图是整个仿真最核心的输出,它能直接反映气泡有没有发生空化、最大膨胀半径是多少、溃灭发生在什么时刻。

一个典型的算例是:20kHz超声、p_A=0.5MPa、R0=10μm,在第一个负压相气泡可能膨胀到30-50μm,随后在正压相快速收缩到接近最小半径。如果半径曲线只在平衡半径附近小幅振荡,说明声压幅值不够或者参数没选好。

5.2 压力场、速度场怎么看

后处理阶段,我通常会做两个动画或快照:

  • 压力场云图:重点看气泡溃灭瞬间,气泡周围是否出现高压区;
  • 速度场云图:重点看气泡壁附近液体是向气泡汇聚还是远离。

用这两个云图可以判断模型是否捕捉到了空化的关键物理特征。如果压力场云图显示溃灭时气泡外部只是缓慢变化,没有明显的高压脉冲,那大概率是参数或边界条件设置有问题。

另外,有些人会进一步查看温度场。但要注意,标准的层流接口并不包含热方程,如果要做温度场,需要额外耦合流体传热接口,并考虑液体和气体的热力学压缩生热。这是更高阶的玩法,初学者先掌握半径和压力场再说。

5.3 用瑞利-普莱赛方程对拍:判断模型可靠

我每次用完整二维模型算出半径曲线后,都会再用瑞利-普莱赛方程单独算一遍,把两条曲线放在同一个图里对比。

瑞利-普莱赛方程的标准形式是:

ρ * (R * d²R/dt² + 1.5 * (dR/dt)²) = p_g(R) + p_v - p∞(t) - 2σ/R - 4μ * (dR/dt)/R

只要把超声压力、静压、表面张力和粘性阻尼带进去,数值积分一下就能得到R(t)。在COMSOL里,可以用“全局ODE”接口实现,或者在MATLAB里跑,都很方便。

两条曲线对比的意义在于:

  • 如果趋势一致,说明二维模型基本可靠,后处理分析可以放开做;
  • 如果差异大,优先检查二维模型的边界激励、网格密度和ALE设置,而不是怀疑理论公式。

理论公式虽然简化程度高,但作为“基准解”非常有用,尤其是参数扫描阶段,能帮你快速筛选出哪些工况值得跑完整二维仿真。

写在最后:我踩过的几个坑

说一个我印象特别深的教训:早期我做二维仿真,图省事把液体设成完全不可压缩,结果气泡溃灭时压力场根本产生不了像样的高压脉冲,气泡半径曲线也跟理论解差得很远。后来加上了弱可压缩近似,结果立刻改善。这说明空化仿真里,液体压缩性不是可有可无的修饰,而是物理本质的一部分。

另外,我一直建议新人在正式跑大规模二维模型之前,先建一个瑞利-普莱赛ODE模型,五分钟就能跑出半径曲线,把参数窗口圈定,再回二维模型里做精细化仿真。这样既能验证参数合理性,也能避免无意义的发散调试。

超声空化气泡仿真这块内容扩展性很强,后续你可以继续加入热效应、气泡之间的相互作用、非球形变形,甚至和压力声学模块联立,研究换能器辐射声场与空化区域的耦合关系。先把今天这套基础模型跑通,后面往上加功能就会顺手很多。

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

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

立即咨询