七十六、Fluent初始化patch和UDF详解 | 您所在的位置:网站首页 › fluent怎么设置温度 › 七十六、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操作。溃坝模型很简单,两相流,水刚开始被存储在蓄水池中,然后堤坝打开,水流出。 先进行标准初始化,我们将water Volume Fraction设置为0,也就是整个计算域都是空气,没有水。但这显然不是我们想要的初始化结果,因此必须打补丁,也就是进行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后,可在后处理查看体积分数云图,满足了我们的初始要求。 溃坝过程模拟 Patch操作可以辅助标准初始化,给标准初始化打个补丁。但并不能满足所有的要求。有些时候我们的初始物理场并不是打个补丁那么简单。 比如我们知道温度随着海拔高度而降低,此时温度场和高度有关,也就是和y轴坐标有关。无论使用标准初始化还是patch操作都比较难初始化这样的温度场。当然还有更加复杂的符合你的实际情况的初始化场。这时候就需要用UDF来完成初始化。 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操作的目的是在流场中选择性地改变某些部分的特定物理量数值。 |
CopyRight 2018-2019 实验室设备网 版权所有 |