人工粘性 — CAE用语解释
人工粘性
老师,"人工粘性"是指故意加入粘性吗? 为什么要这样做呢?
人工粘性的理论基础
基本概念和必要性
人工粘性,从名字来看是"人为添加的粘性"。根本上来说,为什么要添加实际上不存在的粘性呢?
好问题。当计算冲击波这样伴随急峻的压力、密度变化的现象时,在离散化的网格点上物理量会出现不连续"跳跃"现象(超调/欠调),这会引起数值不稳定性,导致计算破裂。人工粘性起着"将跳跃平稳拓散"的阻尼作用,使数值上能够捕获冲击波面。
将冲击波面平稳化的话,解的精度不会下降吗?
正好抓住核心了。人工粘性过强的话,冲击波面会变得模糊,厚度会数值上扩展为多个网格。反之过弱则会不稳定。目标是把冲击波厚度控制在1~2个网格宽度内,同时保持计算稳定。例如,在超音速流动分析中,冲击波的内部结构本身不是关注点,关键是冲击波前后的跳跃条件(Rankine-Hugoniot条件)得到正确满足。
基本方程是什么样的形式呢?
von Neumann和Richtmyer提出的古典线性形式是这样的。添加到压力的人工粘性项 \( q \) 与速度梯度的平方成正比。
其中 \( c_1 \) 是无量纲常数(通常0.5~2.0),\( \rho \) 是密度,\( \Delta x \) 是网格宽度。里面有绝对值的妙处在于,这样粘性只在压缩时( \( \frac{\partial u}{\partial x} < 0 \) )起作用,膨胀时不起作用。
人工粘性的数值计算手法
离散化和求解器的组建
刚才的式子是连续体的式子,实际的FEM或FVM代码中怎样离散化并组建到求解器中呢?
基于有限体积法(FVM)的求解器,例如OpenFOAM的`rhoCentralFoam`或商用代码Fluent的密度基求解器中,通常在单元界面流量计算时组建。具体来说,就是把压力项 \( p \) 替换为 \( p + q \) 的"有效压力"来计算流量。在离散化中,速度梯度 \( \frac{\partial u}{\partial x} \) 从单元中心的速度值用一阶迎风差分或中心差分来评估。
系数 \( c_1 \) 和 \( \Delta x \) 的平方项,是说网格细化时人工粘性的效果会急速减弱吗?
完全正确。这会引起"网格依赖性"这一大问题。网格变细(\( \Delta x \to 0 \))时理论上 \( q \to 0 \),冲击波面会再次出现振荡。为了防止这种情况,现代方法中使用与网格宽度无关或弱相关的非线性人工粘性,或者基于压力的Jameson型人工粘性。例如,Aerojet Rocketdyne的内部代码中,用局部压力梯度代替 \( \Delta x \) 使用改进项。
结构分析的显式动态分析(LS-DYNA等)中也听说过"沙漏控制"中的人工粘性。是同一个东西吗?
相关但目的不同。LS-DYNA和Abaqus/Explicit中的人工粘性(体积粘性)主要有两个作用。一是冲击波的控制(这与流体相同)。另一是减积分单元(1点积分)产生的零能量变形模式,即所谓的"沙漏模式"的抑制。这种情况下通常用体积应变速率的线性项和平方项的和来表示。默认常数值线性项系数约0.06,二阶项系数约1.5。
人工粘性的实务应用
设置和验证的工作流程
实际开始包含冲击波的分析时,人工粘性系数怎样确定呢?直接用默认值就行吗?
默认值是为"基本情况下能运行"而设置的。但特别是在极超音速(马赫数5以上)或爆燃问题中调整是必须的。首先把系数设为0进行计算,确认冲击波面前后的解会剧烈振荡。然后逐步增加系数(例如以0.1为步长),找到振荡消失的最小系数。这是确定"必要最少人工粘性"的第一步。
调整后的系数在物理上是否正确,怎样验证呢?
必须与已知理论值或实验数据对照。最基本的验证是一维冲击波管问题(Sod问题等)。冲击波传播速度,冲击波后方的压力、密度与Rankine-Hugoniot关系式求得的理论值对照程度如何,进行定量评估。例如,压力相对误差在5%以内吗。商用软件中,Ansys Fluent的教程"Supersonic Flow Over a Wedge"是验证由楔形角和马赫数决定的冲击波角的好例子。
网格依赖性检查具体怎样进行呢?
用相同的系数设置,系统地对2倍、4倍等逐步细化的多个网格进行分析。记录冲击波厚度(压力急剧上升区域的网格数)和冲击波前后的跳跃量(压力比等)。理想情况是网格细化时跳跃量收敛到恒定值,且冲击波厚度保持在1~2个网格内。如果网格每次细化都重新出现振荡,说明使用的人工粘性形式网格依赖性很强。
人工粘性的软件对比
各求解器的实现和特点
Ansys Fluent和Abaqus/Explicit中的人工粘性处理和设置方法有什么区别呢?
目的和设置方法根本上不同。Fluent(密度基求解器)中,选择`Roe`作为"Flux Type"时,"Roe-FDS"格式中包含的人工粘性(矩阵扩散)是内在的。用户直接改动的是"Pressure-Based"的"Skewness Correction"或"Multigrid"设置,或者"Second Order"降至"First Order"实际上增加了人工粘性。反之Abaqus/Explicit中,在步骤定义的"Bulk Viscosity"部分直接输入线性系数和二阶系数。默认值分别约为0.06和1.5,金属成形等大变形分析中有时会增加这些值(例如0.12和3.0)来提高稳定性。
开源的OpenFOAM中怎样处理呢?
OpenFOAM是用户可以在源代码级验证实现的好例子。超音速求解器`rhoCentralFoam`中使用`centralCourantNo`格式,其中用`viscous`开关控制人工粘性的开关。具体计算基于`TVD`(Total Variation Diminishing)的"限制函数"形式实现,通过在`fvSchemes`文件中设置`divSchemes`为`Gauss limitedLinearV 1`等来间接控制其强度(1为最大限制)。如果想尝试更直接的古典形式,用户需要自己把`q`项作为源项添加。
专业的CFD代码(例如航空航天专用)应该更精巧吧?
完全同意。NASA开发的`OVERFLOW`或日本广泛使用的`UPACS`(现`Cflow`)等航空航天特化求解器中,人工粘性不仅是系数调整,而是与格式选择本身深度关联。例如`JST`(Jameson-Schmidt-Turkel)格式巧妙地将2阶精度中心差分、4阶差分人工粘性项(在平滑区域影响最小化)和2阶差分人工粘性项(在不连续部分衰减)结合起来。用户调整这两项分别的系数(σ2、σ4)。经验上σ4约1/256,σ2在0.5~1.0范围设置。
人工粘性的问题处理
常见错误和对策
计算中出现"负体积"或"负密度"错误而停止。加强人工粘性能解决吗?
这是最典型的对策之一。特别是Abaqus/Explicit中解大变形接触问题出现"负体积"错误时,首先尝试把体积粘性二阶系数从默认1.5提高到2.0或2.5。这增加了单元急速压缩时的能量耗散,通过"延缓"变形,防止极端形状畸变。但过度强化(例如系数5.0以上)会导致问题的物理本质丧失,能量衰减过大而出现非现实结果,需要注意。
冲击波位置对,但正后方的压力比理论值低几个百分点。原因是?
很可能是"过度人工粘性"导致冲击波面的"模糊化"。粘性太强会使冲击波面扩散到多个网格上,相应地过度估计了不可逆的熵生成(即能量损失)。结果冲击波通过后的压力、温度低于理论值,密度高于理论值。对策是逐步降低使用格式的人工粘性系数,找到冲击波厚度为1~2个网格时的最小值。Fluent中使用`Roe`格式时,只需把`Solution Methods`中的`Roe-FDS Flux Type`从`None`改为`Entropy Fix`就能改善。
网格均匀细化后,反而变得不稳定了。为什么?
正是古典人工粘性的网格依赖性在起作用。按照之前所说的式子
汽车碰撞分析等涉及材料塑性的问题中,人工粘性的影响怎样评估呢?
这是非常重要的,经常被忽视的问题。体积粘性因为耗散能量,会吸收部分材料变形需要的塑性功(能量),导致材料看起来比实际更硬、更脆。评估方法是进行敏感性分析。在线性系数和二阶系数的默认值±50%范围内变化,观察材料吸收能量或最大位移量变化多少。如果改变系数导致结果大幅变化(例如10%以上),说明分析结果强烈依赖于人工粘性设置,结果的可信度需谨慎。LS-DYNA手册中强烈推荐进行这类敏感性分析。
相关主题
价值
详细
报告