一、理论简介:
unset FOAM_SIGFPE
是用于在 OpenFOAM 环境中解除对浮点异常(Floating Point Exception, FPE)的信号处理。
FOAM_SIGFPE
环境变量的作用
在 OpenFOAM 中,FOAM_SIGFPE
环境变量用于控制程序对浮点异常(如除零、溢出、下溢等)的响应。当 FOAM_SIGFPE
被设置时,OpenFOAM 会捕捉到浮点异常并停止程序执行。这对于调试和识别数值问题非常有用。
例如:
export FOAM_SIGFPE=1
设置 FOAM_SIGFPE
为 1 时,OpenFOAM 会在遇到浮点异常时触发信号处理,通常会终止程序并生成核心转储(core dump)。
解除对 FOAM_SIGFPE
的设置
unset FOAM_SIGFPE
命令用于解除对 FOAM_SIGFPE
环境变量的设置。执行此命令后,OpenFOAM 将不会在遇到浮点异常时捕捉并处理信号,程序将按默认方式运行(可能忽略这些异常继续执行或由操作系统处理)。
unset FOAM_SIGFPE
使用场景
- 调试阶段:在调试阶段,设置
FOAM_SIGFPE
可以帮助开发者识别和修复浮点异常。 - 生产运行:在生产运行阶段,如果你不希望程序在遇到浮点异常时停止,可以使用
unset FOAM_SIGFPE
,让程序继续运行或由操作系统处理异常。
二、实际应用
使用unset FOAM_SIGFPE命令后,再执行我的程序,
日志来看,仿真过程中出现了几个严重的问题:
-
CG 求解器的最终残差为
-nan
:- 这意味着求解器计算出了无效的结果(即
Not a Number
)。
- 这意味着求解器计算出了无效的结果(即
-
计算过程中出现无限值 (
inf
) 和负无限值 (-inf
):- 这是由
twoPhaseCompressibleSystem::decode()
函数中的e
值无限大或无限小导致的。
- 这是由
-
高库朗数:
- 最大库朗数达到了
474634
,这远远超出了合理范围,通常库朗数应小于 1,以保证计算稳定性。
- 最大库朗数达到了
这些问题可能是由于初始条件、边界条件或数值方法设置不当引起的。为了调试和解决这些问题,可以采取以下步骤:
检查和调整初始条件和边界条件
-
检查初始条件:
- 确保初始条件合理,避免过大或过小的值,特别是密度、压力和速度等物理量。
-
检查边界条件:
- 确保边界条件合理,避免突然变化或不连续的情况。
调整时间步长和数值方法
-
减少时间步长 (
deltaT
):- 尝试减小时间步长,特别是在高库朗数的情况下。
-
启用可调时间步长:
- 在
controlDict
文件中启用adjustableTimestep
,以根据 CFL 数自动调整时间步长。
- 在
adjustTimeStep yes;maxCo 0.5;