七十六、Fluent初始化patch和UDF详解

1. Patch操作

1.1 概念介绍

上篇文章我们详细的介绍了标准初始化和混合初始化七十五、Fluent初始化操作详解,但一些时候这两种初始化是不够的,还需要辅助的操作---patch操作

什么是Patch操作呢?英文翻译叫做”补丁“,它确实是补丁的意思。类似于给衣服打补丁,Patch操作就是为流场打上修补,即修改原始的正常流场。

这可以包括对初始化的速度场、温度场、体积分数场等进行调整,也可以是对经过计算后的各物理量场进行修正。Patch操作的目的是在流场中选择性地改变某些部分的特定物理量数值。

比如下图是在计算后的温度场基础上进行的patch操作,第二张图明显有”打补丁“的感觉。

注:虽然可以在计算结果后进行patch操作,但是一般是不这样做的,Patch主要还是修改初始化的流场,在初始化后紧接着进行patch操作。可以认为patch操作是一种高级的初始化。

1.2 Patch操作的适用性

什么时候需要”打补丁“呢?什么情况下需要patch操作?

一般来说,稳态计算不需要patch操作,而瞬态初始化才会用到patch操作。为什么呢?

因为稳态计算的最终结果不依赖初始化,那么初始化后的patch操作只是改变了迭代步数,对最终结果没有影响。

而瞬态计算不同,瞬态计算的最终结果依赖初始化,patch操作相当于改变了初始化值,会对最终的计算结果产生影响。比如溃坝问题,初始化后需要patch液态水的体积分数,来构建蓄水区域。

1.3 Patch操作步骤

下面我们以溃坝模型为例来详细说明patch操作。溃坝模型很简单,两相流,水刚开始被存储在蓄水池中,然后堤坝打开,水流出。

a. 标准初始化

先进行标准初始化,我们将water Volume Fraction设置为0,也就是整个计算域都是空气,没有水。但这显然不是我们想要的初始化结果,因此必须打补丁,也就是进行patch操作,将蓄水池装满水。

b. Patch界面

点击patch后会弹出patch界面

Patch界面可以分为三部分,第一部分是选择需要修改的物理量;第二部分是设置需要修改的值;第三部分是选择需要修改物理量的区域。我们详细讲解:

Ø 第一部分:

Reference Frame:参考系,默认即可,不必理会,具体意义可参考上篇文章。七十五、Fluent初始化操作详解

Phase和Variable:Phase表示需要修改哪一相的物理量,对于两相流,可以设置mixture和次相。Variable表示物理量。这两者是互相配合的,Phase下可以选择不同的相,可以设置不同的物理量。

对于本例,我们需要设置water的体积分数,因此phase需要选择water,Variable需要选择体积分数Volume Fraction。

Volume Fraction patch options:只有VOF 和 Eulerian 模型需要patch体积分数时才可用。一般保持默认即可。

Patch Reconstructed Interface:patch界面重构

我们patch的体积分数界面和实际的相界面,通过线性插值的方式重构,也就是界面过渡的地方是线性过渡的,而不是直接突变的。

Volumetric Smoothing

通过相邻网格体积分数的平均值来使体积分数比较平滑。启用此选项后,可以单击“Smooth”,对整个域中的体积分数进行平滑。

Smoothing Relaxation Factor

和Volumetric Smoothing搭配使用的,用来控制体积分数的平滑程度。在0(无平滑)和1(最大平滑)之间。

Ø 第二部分:

Vaule:需要修改物理量的值,在本例即1,也就是将water的体积分数修改为1。也可以通过表达式来定义,详细可参考文章:七十一、Fluent表达式进阶实例

Use Field Function:通过Field Function的形式来确定修改的物理量。就是对一些物理量进行计算,比如动压=1/2*密度*速度^2。一般不需要这样设置。

Field Function:勾选Use Field Function后可用,选择通过Field Function定义的场函数。比如下图定义的动压

Patch界面就会出现刚才定义的场函数dy-pre

Ø 第三部分:

Zones to Patch:选择需要patch的zone计算域,当存在多个计算域时,需要对某一个计算域进行patch,可以在此处选择。比如我们可以将蓄水池单独划分成一个计算域,那么这里就可以选择这个计算域。但是如果没有单独划分计算域,这个不需要进行选择。

Registers to Patch:选择需要patch的Registers区域。Registers to Patch和Zones to Patch只能选择一个。Registers区域是指通过Fluent单独定义一个区域。这样可以在不划分计算域的情况下,仍然mark一部分区域。

Registers区域的具体操作可参考文章:五十四、Fluent网格自适应详细操作

本例需要mark的区域如下图

点击save/display后可看到被标记的区域。详细操作参考文章五十四、Fluent网格自适应详细操作

回到patch界面,Registers to Patch会出现刚才定义的区域pool。

点击patch后,可在后处理查看体积分数云图,满足了我们的初始要求。

溃坝过程模拟

2. UDF初始化

2.1 UDF初始化概念

Patch操作可以辅助标准初始化,给标准初始化打个补丁。但并不能满足所有的要求。有些时候我们的初始物理场并不是打个补丁那么简单。

比如我们知道温度随着海拔高度而降低,此时温度场和高度有关,也就是和y轴坐标有关。无论使用标准初始化还是patch操作都比较难初始化这样的温度场。当然还有更加复杂的符合你的实际情况的初始化场。这时候就需要用UDF来完成初始化。

2.2 DEFINE_INIT 初始化宏

DEFINE_INIT (name, d)只有两个参数,其用法和ADJUST宏类似,参考文章五十八、Fluent UDF调节宏ADJUST

a. name:DEFINE_INIT宏的名称,可以是任意的

b. d:计算域的指针。对于多相流来说,d指针是指向混合域的。由于没有传递cell和thread,因此为了对网格物理量进行操作,需要对计算域d下的线程thread和thread下的网格cell进行遍历。可参考文章:

c. 此函数无返回值

d. DEFINE_INIT函数每次初始化执行一次,只要选择初始化后,会自动执行。

举个例子:让温度场是y轴坐标的函数

T=273+20*y

#include "udf.h"

DEFINE_INIT(my_init_func, d)

{

    cell_t c;

    Thread *t;

    real xc[ND_ND];

    /* 遍历计算域d内的所有线程t */

    thread_loop_c(t, d)

    {

    /* 遍历t下的所有网格 */

        begin_c_loop_all(c, t)

        {

            C_CENTROID(xc, c, t);

            C_T(c, t) = 273.+20*xc[1];

        }

        end_c_loop_all(c, t)

    }

}

2.3 加载DEFINE_INIT

编译型UDF界面如下图,上面有两个框Source Files和Header Files,Source Files表示源文件,就是编写好的UDF文件;

Header Files表示头文件,只有当UDF很复杂,为了使UDF模块化才需要从这里导入头文件。UDF自带了很多头文件如udf.h,但是这些头文件不需要从这里导入。

首先点击Add,选中编写好的UDF后导入,然后点击Build,如果UDF没有问题,则不会出现任何报错信息(只要控制界面有error,则说明有问题)。

在没有报错的前提下,点击Load,则UDF加载成功。关于UDF报错问题,建议大家看看文章四十九、五十和五十一。如果没有报错,控制台应该会显示下面的信息,其中就有各种DEFINE宏的name

和ADJUST宏类似,DEFINE_INIT需要hook使用。如果没有hook,即使加载成功,也不能调用。

点击Function Hooks,会弹出所有需要hooks界面

下面的图中包含很多宏,即当使用这些DEFINE宏时,都必须hook才能正常使用。比如DEFINE_EXECUTE_AT_END、DEFINE_INIT等,对于DEFINE_INIT宏,需要先点击Initialization宏的Edit进行设置界面

选中编写好的UDF宏名称,点击Add,宏名称将从左栏转入到右栏,单击OK,则表示hook成功。

hook成功后,我们还是使用刚才的例子,打开能量方程,进入初始化界面,点击标准初始化

查看温度云图是否按照UDF的方式初始化成功

温度云图

X=2.5m处温度曲线图

初始化成功,这里提供本文所需的所有文件,包括mesh、cas、dat和udf文件等

原文链接

七十六、Fluent初始化patch和UDF详解patch包括对初始化的速度场、温度场、体积分数场等进行调整,也可以是对经过计算后的各物理量场进行修正。Patch操作的目的是在流场中选择性地改变某些部分的特定物理量数值。icon-default.png?t=N7T8https://mp.weixin.qq.com/s/tnCIvZS-nuWUZ8YB5OXf7w

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Fluent UDF初始化是指在Fluent软件中使用用户定义函数之前需要进行的一系列准备工作。以下是Fluent UDF初始化的步骤: 1. 编写UDF代码:首先,需要使用编程语言(如C++)编写UDF代码,确保代码能够正确地实现所需的功能。UDF代码必须遵循Fluent UDF编程接口的规范,以便能够在Fluent软件中正确使用。 2. 编译UDF代码:将编写的UDF代码编译成可执行文件或库文件。在编译过程中,需要包含与Fluent软件的接口文件以及所需的头文件。编译完成后,会生成一个用于加载到Fluent软件中的UDF库文件。 3. 设置Fluent环境:在Fluent软件中打开预期的工作文件,然后选择“Define”->“User-Defined”->“Functions”菜单。在弹出的菜单中,选择“Library...”选项,然后加载之前编译生成的UDF库文件。 4. 编译和加载UDF:加载UDF库文件后,Fluent软件会尝试编译和链接UDF,并将其加载到系统中。如果编译和链接成功,那么UDF将被正确加载,可以在Fluent软件中使用。 5. UDF参数设置:一旦UDF成功加载到Fluent软件中,就可以通过设置相关参数来调整UDF的行为。这些参数可以通过Fluent软件中的用户界面或文本命令进行设置,以满足具体问题的需求。 通过以上步骤,可以完成Fluent UDF初始化工作。在初始化完成后,用户就可以在Fluent软件中使用定义的UDF来实现特定的功能,如自定义边界条件、材料模型等。 ### 回答2: Fluent UDF(用户自定义函数)是Ansys Fluent中用于添加自定义功能或修改现有功能的一种工具。Fluent UDF初始化是指在使用和调用自定义函数之前必须进行的一系列步骤。 首先,需要在Fluent UDF的工作目录中创建一个新的源文件,文件名的后缀通常为.c或.C。这个源文件将包含定义自定义函数所需的代码。 接下来,在源文件中定义自定义函数的主体,这可以是求解器函数、初始化函数、材料函数等。根据具体的需求,可以自由编写函数来实现特定的功能。 然后,需要使用“define”命令在Fluent的文本界面中将自定义函数加载到Fluent中。通过命令“/define/user-defined/fluent-udf-sourcename”可以将源文件与自定义函数名称关联起来。 在加载自定义函数之前,需要使用“/compiler-options”命令设置编译选项。编译选项会告诉Fluent如何处理和编译自定义函数的源代码。 完成以上准备工作后,在Fluent中使用“solve”命令开始求解模拟问题。Fluent会在求解过程中调用并使用已加载的自定义函数。 通过这些步骤,Fluent UDF初始化工作完成。之后,可以使用Fluent的各种功能和工具来分析和处理仿真结果,包括自定义函数所添加或修改的功能。 需要注意的是,Fluent UDF初始化过程可能因具体的仿真需求而有所变化。上述说明仅为一般流程,具体情况可能根据个人需求和Fluent版本的不同而有所不同。因此,在使用Fluent UDF时,建议参考相关的文档和用户手册以获得准确的初始化步骤和详细说明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值