当值超出给定范围时,如何让 OpenFOAM 中止模拟?

计算科学 开放式泡沫
2021-11-27 21:24:16

当绝对压力变为负压或U超过光速,事情显然出了问题(比如糟糕的边界条件、太粗的网格、太大的时间步长等)。

那么,当值超出可定义的非物理范围时,有没有办法让模拟中止并显示错误消息?

2个回答

这是基本的 C++ - 只需将您感兴趣的任何内容添加到代码中并重新编译。例如,在runTime.write();调用之前(在每个求解器的函数末尾main)复制并粘贴以下代码,以在每个时间步的末尾执行健全性检查:

// sanity check
if (min(p) < 0)
{
    FatalError
        << "Negative pressure" << nl
        << exit(FatalError);
}

如果您不想编写 C++:在simpleFunctionObjects中有一个名为 panicDump 的函数对象。就像是

functions
{
    pressureOurOfRange {
        type panicDump;
        functionObjectLibs
        (
            "libsimpleFunctionObjects.so"
        );
        fieldName p;
        minimum 0;
        maximum 1e7;
    }
}

如果压力增大, insystem/controlDict将停止模拟。与来自swak4Foam的 expressionField-functionObject 一起,您还可以测试非标量字段。

免责声明:我是simpleFunctionObjects的原始开发者,所以这个答案可以被视为广告