Numerical Overflow
溢出
老师,「Numerical overflow」是什么?
数值溢出的理论基础
数值溢出的物理和数学含义
我之前认为数值溢出只是"计算结果太大"的错误,但在CAE中具体是哪个计算会发生呢?
不仅仅是数值的大小问题。例如,非线性材料的塑性应变在局部急剧增大,当应变速率超过10^6/s时,积分计算会指数发散。此外,在接触问题中,刚度矩阵的对角项可能比其他项大10^15倍,求解线性方程组时数值精度丧失,引起表观溢出。
什么是「表观溢出」?如何区分物理发散与计算问题?
很好的观察。物理发散是指屈服后材料极端软化、变形失控的「颈缩」或「剪切带」形成等现象本身发散。而计算问题的典型例子是单位系不一致。当毫米与米混用时,刚度矩阵成分为 $$ k = \frac{EA}{L} $$,若A用mm^2、L用m,则刚度会相差10^6倍,导致求解器破裂。
数值积分中溢出的具体例子有吗?
有的。在恶劣冲击分析中使用显式法中心差分法时,时间增分Δt非常小,加速度a由 $$ a = \frac{F}{m} $$ 计算,接触力F瞬间巨大化时,速度v的更新 $$ v_{n+1} = v_n + a \cdot \Delta t $$ 会使v超过双精度浮点数上限约1.8e308。这种情况下,LS-DYNA等软件会输出"floating point exception"错误消息。
数值溢出的数值计算方法
求解器算法与溢出发生位置
隐式法求解器中,矩阵的哪个处理步骤最容易发生溢出?
主要有3个位置。第一是「单元刚度矩阵生成」时。壳体单元宽高比超过1000:1时,矩阵条件数恶化。第二是「预处理」时。ICCG法对角线缩放过程中计算对角项逆数 $$ D_{ii}^{-1} $$,当D_ii接近零时会发散到无穷大。第三是「迭代求解的残差范数」计算时,解发散时范数会急速增大。
迭代求解的残差范数发散的原因是什么?
非线性问题中,当牛顿-拉夫逊法的收敛半径被超过时会发生。例如,某个增分步中,切线刚度矩阵 $$ K_T $$ 接近奇异(行列式≈0)时,更新式 $$ \Delta u = -K_T^{-1} R $$ 中的位移增量Δu会变成异常大的值。Abaqus/Standard中,这种情况常见「THE MATRIX HAS A ZERO PIVOT」后面跟着溢出错误。
显式法和隐式法中,容易引起溢出的条件从根本上不同吗?
完全不同。显式法(LS-DYNA、Abaqus/Explicit)的关键是质量矩阵对角化后的「稳定性极限」。当最小单元的音速为c、单元尺寸为Δx时,临界时间步由 $$ \Delta t_{cr} \le \frac{\Delta x}{c} $$ 给出。超过此Δt时,数值振动会指数放大(发散),快速导致溢出。而隐式法的主要原因是矩阵条件数和非线性收敛性。
数值溢出的实务应用
防止溢出的建模和设置步骤
在开始分析前,有没有防止溢出的模型检查清单?
有的,以下5点需要确认。1. **单位系统一**:所有输入(几何、材料常数、载荷)采用一致的单位系统(SI为m、kg、s、N)。2. **材料参数的现实性**:杨氏模量是否为1e12 Pa等不现实的值。3. **网格质量**:宽高比理想为10:1以下,最多100:1以下。4. **接触刚度**:惩罚法刚度是否偏离默认值太大。5. **初始条件**:初速度和位移是否在物理可能范围内(例如冲击分析中初速10000 m/s不现实)。
接触刚度设置需要注意什么?默认值有问题吗?
有的。Ansys Mechanical的默认接触刚度(「Normal Stiffness Factor」)为1.0,但这太高时,接触面轻微穿透就会产生巨大反力,导致求解器发散。特别是刚体与柔性体接触或金属成形等大变形分析中,需要把该系数降到0.01或0.1,采用「软接触」。反之太低会使穿透量过大,引发其他不稳定性。一般在0.01到1.0之间调整。
我听说非线性分析一次性施加全部载荷会有问题。具体怎样分割?
这涉及「增分步」与「子步」的概念。例如,全载荷1000N分为首步10N(1%)、次步50N(累计6%)等逐步施加。Abaqus中,将「Step」的「Initial Increment Size」设为0.01(全载荷的1%),「Minimum」设为1e-10等极小值,「Maximum」设为0.1。这样求解器从全载荷的1%开始,若收敛差则自动细分为0.1%、0.01%等,防止溢出。
数值溢出的软件比较
主要软件中的错误消息和对策工具
Ansys、Abaqus、COMSOL在数值溢出相关错误消息上有什么区别?
各家有特色。
**Abaqus/Standard**:「THE SOLUTION APPEARS TO BE DIVERGING.」或「TOO MANY ATTEMPTS MADE FOR THIS INCREMENT」后跟「FLOATING POINT EXCEPTION」。.msg文件中记录迭代历史。
**COMSOL Multiphysics**:「Failed to find a solution.」或「Division by zero.」等。使用「Segregated」求解器时,特定物理场变量发散时易出「NaN (Not a Number)」错误。
出错时,各软件的调试功能中首先该查看哪个日志?
以下是首要检查点。
2. **Abaqus**:「.sta」文件确认发散的增分步和迭代次数。「.msg」文件查看发散前残差范数的推移。
3. **COMSOL**:「Log」窗口。显示「Solving for [变量名]...」,可判断哪个物理场变量失败。之后在「结果」→「派生值」→「最大值/最小值」中可绘制发散变量的空间分布与步数。
求解器设置中为了回避溢出需要改动的共同参数是?
非线性求解器的「收敛准则」和「发散控制」。
- **阻尼 (Damping)**:COMSOL非线性求解器设置中有「稳定阻尼系数」,默认1.0可降至0.5,使更新平缓。
- **最大迭代次数**:所有求解器都有,默认10~20次。增至50次可缓慢收敛,但这只是对症疗法,无法根本解决问题。
数值溢出的故障排除
错误发生时的系统性调试步骤
出现溢出错误时,应该首先怀疑什么,按什么顺序调查?
以下5步有效。
2. **简化**:非线性材料改为线性弹性,接触改为约束条件后运行。若错误消失则该部分有问题。
3. **确认初始步**:首增分(载荷0%)就报错的话,怀疑初始约束不足(刚体模式)或材料常数异常。
4. **查看出错前步的结果**:出错前一步的结果(变形、应力、接触状态)可视化。查找局部极端值(位移1e10 m、应力1e20 Pa)。
5. **网格依赖性**:全体网格粗化,特别是大变形区域细化后重新运行。
发现「局部极端值」后的具体下一步行动是?
聚焦于该单元及其周围。
- **材料模型**:该单元分配的材料在该应变水平下的应力-应变曲线是否正确表现屈服或软化。塑性法则参数(如Chaboche模型硬化参数)是否合适。
- **接触定义**:若该单元属接触面,检查接触对定义(主面/从面)、间隙、摩擦系数。特别自接触设置错误易导致发散。
如果始终找不到原因,或想分析物理上不稳定的现象时怎样?
最终手段是从根本改变求解器算法。
2. **应用动力松弛法**:静分析发散时,施加虚拟质量和阻尼的「动力松弛」使准静态解收敛。如MSC Marc的「Quasi-static」分析选项。
3. **使用弧长法**:座屈或跳过等载荷-位移曲线有极值的问题,需用「弧长法」(Riks法),控制变位的弧长而非增量载荷。Ansys的「Stabilization」或Abaqus的「Static, Riks」。
所以完全避免溢出错误没有「银弹」,对吧。
完全正确。数值溢出是模型的物理现实性、网格质量、材料模型妥当性、求解器设置以及现象本身的数值可处理性复杂交织的结果。错误不是单纯的「故障」,而是求解器给出的「模型或设置存在根本问题」的重要反馈。通过系统的调试加深理解,这是提升CAE工程师技能的直接途径。
相关主题
更详细
错误