解决方法是联合 UDF 和 scheme 文件。UDF 将会遍历所有的单元并且当任意用户定义的限制被超过时会将标识符开启。接下来的这个算例中我们不希望速度超过 1.5m/ s
UDF 代码如下:
#include "udf.h"
#include "math.h"
#include "var.h"
DEFINE_ADJUST(interrupt_fcn, d)
{
Thread *t;
cell_t c;
int x = 0;
thread_loop_c(t,d) / * 遍历所有的计算域 */
{
begin_c_loop(c,t) / * 遍历所有的单元 */
{
if(sqrt(C_U(c,t)*C_U(c,t)+C_V(c,t)*C_V(c,t)+C_W(c,t)*C_W(c,t))>1.5) / * 如果有单元的速度超过 1.5m/s*/
{
x=1; / * 设置 x 的值为 1*/
break; / * 跳出循环 */
}
}
end_c_loop(c,t)
break; / * 跳出对计算域的循环 */
}
x=PRF_GIHIGH1(x); / * PRF_GIHIGH1 计算 x 的最大值并返回 */
if(x==1)
RP_Set_Integer("interrupt/ flag",1); / * 转换表示符 */
}
Scheme 代码:
(rp-var-define 'interrupt/flag 0'integer #f)
(define (interrupt)
(if (> (%rp-var-value 'interrupt/flag) 0)
(cx-interrupt)))
步骤如下:
① 用户读入 case/data 文件,scheme 文件和 UDF
② 挂载 “interrupt_fcn” 到 adjust 函数
③ 在 Solve-Execute Commands 面板输入 "(interrupt)"
完成以上步骤,一旦启动 fluent 进行模拟,scheme 文件会在速度超过 1.5m/s 时打断模拟,结果可以给出即将发散的点 / 原因。