感谢硫酸亚铜大佬的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)
2 条评论
请问有组分如何从一个出口连接到另外一个进口?