借助VC++ UDF Studio插件探索UDF手册中没有记录的宏
众所周知,Fluent UDF宏十分丰富和繁杂,UDF手册中实际给出的只是一小部分。很多有用的宏在UDF手册中是根本找不到的。例如,做DPM的朋友都知道在UDF手册中可以查到提取DPM颗粒直径、速度的宏,却怎么也找不到提取颗粒曳力和体积力的宏。实际上这些量在Fluent UDF中是可以提取的,只不过他们不知道罢了。本文将告诉你如何借助VC++ UDF Studio插件 (https://vcudfstudio.github.io)探索UDF手册中没有记录的宏或变量。
以提取DPM颗粒的曳力和体积力为例。我们该如何一步一步获得这两个变量呢?
1. 首先,你要安装Fluent,VC++ UDF Studio (https://vcudfstudio.github.io),Visual Studio(建议2010旗舰版)。然后双击桌面图标,选择需要版本后会自动启动Fluent,读入case后点击Fluent嵌入菜单中的“Start Visual Studio”子菜单。
2. 输入如下源代码(当然探索别的宏和数据结构时可以不同的源码设计),并点击“编译”按钮直到编译通过,然后点“加载到Fluent”按钮。
#include "udf.h" DEFINE_DPM_SCALAR_UPDATE(dpm_scalup,c,t,if_init,tp) { #if !RP_HOST real NV_VEC(vel); real diam=TP_DIAM(tp); NV_V(vel,=, TP_VEL(tp)); #endif }
3. 将源代码中定义的dpm_scalup宏hook到Fluent中,如下图所示。记得勾选“Interaction with Continuous Phase”,并将“DPM Interation Interval”改为1。这样每次连续相迭代的时候才会追踪颗粒,从而调用我们的DPM_SCALAR_UPDATE宏。
4. 点击“调试”按钮,进入调试状态。并在源码中下好断点(在需要断点的行按F9),此时在该行会出现一个红色圆球表示断点正常已经下好(即调试器已经监控Fluent中,一旦程序运行到这一行就会马上中断)。
5. 在Fluent中开始迭代,过若干秒当程序运行到我们下断点的行就会马上中断,如下会出现一个黄色小箭头,表示中断在此行。此时,我们感兴趣的重点就来了。由于插件提供的实时查看变量值和内部结构的功能,所以我们对变量tp很想看看内部有些啥数据,因为我们知道tp是Tracked_Particle类型的指针,它存储了颗粒的所有相关数据。
6. 点击“+”号将展开tp的数据结构并查看内部所有变量。此时,我们看到了一些熟悉的变量,例如flow_rate, Re等等,我们很容易猜出来,它们分别是颗粒的质量流量和相对雷诺数。那么UDF源代码中就可以用tp->flow_rate和tp->Re来分别提取颗粒的质量流量和相对雷诺数。相对雷诺数在UDF手册中是没有的,开始有点小小的激动了。
7. 下拉到source变量(因为我们在tp结构里面没有直接找到曳力和体积力,所以怀疑是在源项source里面),点击source左侧加号“+”。深入查看source结构体里面的内容。
结果发现了bf_acc和drag两个可疑的变量。其中,bf_acc正好是body force acceleration的缩写,且包含三个float元素,代表三个方向分量。drag无疑正好是曳力的英文。这样我们就找到了我们要的东西了。体积力加速度矢量可以用tp->source.bf_acc提取,曳力可以用tp->source.drag提取。至于如何验证,可以自己设计一个简单的已知曳力和体积力的case,这里不做赘述了。
如果再加装Visual assistant软件,可以在键入代码时就出现所有可能的宏,更方便解密未记录的宏。如下图所示,键入tp->source.后下拉框里面就出现bf_acc。鼠标在变量上短暂停留还可能出现相应注释。非常利于解密未知宏或变量的功能。
最后贴上解密出来的提取颗粒曳力、体积力加速度和颗粒相对雷诺数的代码。
//利用VC++ UDF Studio插件编译通过 #include "udf.h" DEFINE_DPM_SCALAR_UPDATE(dpm_scalup,c,t,if_init,tp) { #if !RP_HOST real body_force_accerlation[3]={0}; //三个方向体积力加速度 NV_V(body_force_accerlation,=,tp->source.bf_acc); //体积力加速度即DPM运动方程中的g real total_drag=tp->source.drag; //drag, 即DPM运动方程中的F_D Message("body_force_accerlation=[%f,%f,%f],drag=%f,relative Re=%f\n", body_force_accerlation[0],body_force_accerlation[1],body_force_accerlation[2], total_drag,tp->Re); #endif }
其中,tp->source.drag提取曳力,即如下Fluent中DPM颗粒运动方程中的FD。
tp->source.bf_acc提取体积力加速度g,结果为带三个方向的矢量。tp->Re提取颗粒相对雷诺数,其定义如下
ρ为连续流体的密度,dp为颗粒直径, up为颗粒速度,u为连续流体的速度,μ为连续相流体的分子粘度。