感谢硫酸亚铜大佬的udf代码。

目的是让一个时间步长迭代完后将出口温度赋值给入口温度,使用 DEFINE_EXECUTE_AT_END(outTemperature) 来实现,再用 DEFINE_PROFILE(inletTemperature, t, index) 来赋值入口温度

/****************************************************************
*Fluent17 版本以上输出中文会出现乱码
* 不建议在 UDF 当中使用中文
* 在 Linux 下需要是块注释,行注释会出现编译错误
* 自定义内存变量需要在 fluent 的 User-define->Memery 里面设置,否则报错
*DEFINE_EXECUTE_AT_END 也可以采用 DEFINE_ADJUST 代替
* 对于非稳态计算来说,DEFINE_EXECUTE_AT_END 是在瞬态时间步结束时调用
* 而 DEFINE_ADJUST 是在每一瞬态计算时间步第一次迭代的开始前被调用
*****************************************************************/

#include"udf.h"
#define OUTID 64 /* 出口处的 ID,在 Fluent 中查看出口壁面的 zone-id 所得 */
#define INID 63 /* 入口处的 ID*/

DEFINE_EXECUTE_AT_END(outTemperature)
{

    real NV_VEC(A); /* 用来保存出口处每个面单元的面积 */
    real sum_T_A = 0.0; /* 出口总的温度 */    
    real sum_A = 0.0; /* 出口总的面积 */    
    real outlet_temp; /* 出口处的温度 */    
#if !RP_HOST    
    Domain* domain; /* 流体计算域 */
    Thread * threadOut; /* 出口指针 */    
    Thread * threadIn; /* 入口指针 */    
    face_t f; /* 对应注释当中的代码变量 f*/    
    domain = Get_Domain(1); /* 获得流体计算域 */
    threadOut = Lookup_Thread(domain, OUTID); /* 查找出口的指针 */
    threadIn = Lookup_Thread(domain, INID); /* 查找入口的指针 */
    
    begin_f_loop(f, threadOut) // 循环出口面单元
        if (PRINCIPAL_FACE_P(f, threadOut)) // 判断是否在并行单元分块单元的内部
        {
        F_AREA(A, f, threadOut); // 计算出口并行分块每个面单元的面积
        sum_A += NV_MAG(A); // 计算出口并行分块的总面积
        sum_T_A += NV_MAG(A) * F_T(f, threadOut); // 计算出口并行分块每个面单元温度的总和
        }
    end_f_loop(f, threadOut)
#endif
    
# if RP_NODE     /* 将各节点的计算结果汇总,单精度求解器是 float 类型,双精度求解器是 double 类型 */
    
    sum_A = PRF_GRSUM1(sum_A);
    sum_T_A = PRF_GRSUM1(sum_T_A);
# endif
    node_to_host_real_2(sum_A, sum_T_A); /* 将节点数据汇总给主机 */
#if !RP_NODE
    outlet_temp = sum_T_A / sum_A; /* 计算出口处的平均温度 */
    Message("\n outlet temperature:%g\n", outlet_temp);
#endif
    host_to_node_real_1(outlet_temp); /* 将主机计算的结果传递给节点 */
    #if !RP_HOST
    begin_f_loop(f, threadIn) // 循环入口面单元
    if (PRINCIPAL_FACE_P(f, threadIn)) // 判断是否在并行单元分块单元的内部
    {
        F_UDMI(f, threadIn, 0) = outlet_temp;
    }
    end_f_loop(f, threadIn)
#endif
    
}

DEFINE_PROFILE(inletTemperature, t, index)
{
    face_t f; /* 对应注释当中的代码变量 f*/
#if !RP_HOST
    begin_f_loop(f, t) // 循环入口面单元
        if (PRINCIPAL_FACE_P(f, t)) // 判断是否在并行单元分块单元的内部
        {
            F_PROFILE(f, t, index) = F_UDMI(f, t, 0); /* 将出口处的温度赋值给入口处 */
        }
        end_f_loop(f, t)
#endif

}
  • 注意一下 DEFINE_EXECUTE_AT_END(outTemperature) 在非稳态中表示每个时间步长计算完成后调用一次,就可以直接实现我的想法
  • 先在 Fluent 中设置一下 Memory,不然全局变量没法用,然后 compiled 一下 udf,在 Function Hooks 中激活 DEFINE_EXECUTE_AT_END(outTemperature),再入口处调用下 DEFINE_PROFILE(inletTemperature, t, index)
最后修改:2020 年 10 月 22 日
如果觉得我的文章对你有用,请随意赞赏