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学习笔记