感谢西安交通大学 en_phert 的问题和尝试 

Fluent 版本:Fluent 19.0

Visual Studio 版本:Visual Studio 2013 

在 UDF 的宏的调用中大家常看见下图:

这个图很容易给大家造成一个误解就是 DEFINE_PROFILE 是在初始化以后,在运算的过程当中更新物性参数的时候才会调用 DEFINE_PROFILE 宏

而帮助文档当中各个宏的调用顺序如下图:

从上面两幅图中我们可以看出其实在初始化以前,我们就会调用 DEFINE_PROFILE 宏,这也就能说明为什么我们在使用 UDF 的时候,分明只编写了修改边界的 DEFINE_PROFILE 宏,结果在初始化的时候却造成了 Received signal SIGSEGV 的错误

下面我们从一个简单算例来验证各个宏的调用顺序

算例来源于:https://confluence.cornell.edu/display/SIMULATION/FLUENT+-+Laminar+Pipe+Flow

对于边界条件来说,我们不直接在 GUI 当中指定数值,而是使用下面的 UDF 来指定,UDF 中可以有输出信息,这样我们就可以通过控制台输出的信息,观察到对应的宏什么时候被调用。

# include "udf.h"
DEFINE PROFILE(inlet_velocity, thread, position)
{
    face_t f; 
    Message("DEFINE PROFILE macro is called! \n"); 
    begin_f_1oop(f , thread)
        F_PROFILE(f, thread, position) = 1; 
    end_f _loop(f, thread)
}
DEFINE INIT(my_init_func , domain)
{
    Message("DEFINE INIT macro is called!\n");
}
DEFINE_ADJUST(my_adjust , domain)
{
    Message("DEFINE ADJUST macro is called!\n");
}

首先挂载 DEFINE_INIT 宏和 DEFINE_ADJUST 宏,入口边界我们用 UDF 来代替,然后初始化。
我们选择标准初始化,在 compute from 中选择 inlet,我们可以在 Fluent 的控制台中看到 DEFINE_PROFILE 宏被调用了一次

点击 “Initialize” 按钮

点击 “Calculate” 按钮开始计算

从上面的分析我们可以看到实际上的调用顺序和帮助文档里面的顺序是一致的,也可以再重新绘制如下图:

如果我们编写如下的 DEFINE_PROFILE 宏

# include "udf.h"
real *a; 
DEFINE_PROFILE(inlet_velocity, thread, position)
{
    face_t f; 
    Message("DEFINE_PROFILE macro is called!\n"); 
    begin_f_1oop(f, thread)
        F_PROFILE(f, thread, position) = *a;
    end_f_1oop(f, thread)
}

那么我们就会在初始化的时候造成 Received signal SIGSEGV 的错误

这是因为没有对指针 a 赋值,a 指针是一个野指针,当我们去获取它所指向的值的时候,无法返回正确的值造成的,然而在初始化以前我们会去调用 DEFINE_PROFILE 这个宏,从而出现了错误。

保留变量防止无法获取其值

使用TUI命令:

/solve/set/expert

Save cell residuals for post-processing? [no]

Keep temporary solver memory from being freed? [no] yes

Allow selection of all applicable discretization schemes? [no]

来保留变量的梯度

本文转载自:https://www.cnblogs.com/liusuanyatong/p/11259609.html

最后修改:2020 年 09 月 19 日
如果觉得我的文章对你有用,请随意赞赏