在 Fluent 中,real
是一种通过 typedef
定义的数据类型。在单精度模式下,它会被切换为 float
类型;而在双精度模式下,则会切换为 double
类型。由于解释器会自动完成这一赋值操作,因此当变量被定义为 real
类型时,在使用双精度求解器的情况下,这些变量将以双精度形式存在。
然而,如果采用 float
或 double
明确指定变量类型,则其精度不会随着求解器精度的变化而调整。基于此,通常建议优先使用 real
来定义变量类型,以确保与求解器的精度设置保持一致。
在编写 UDF 时,需要牢记的是,所有在 UDF 中分配的参数都必须采用国际单位制(SI),无论 Fluent GUI 中使用的是何种单位制。
上述规则存在一个例外,即在求解用户定义标量(UDS)时。在这种情况下,与 UDS 相关的参数(如扩散系数)不会进行单位缩放,而是直接从 UDF 中读取其值。
在求解器中,比热容的用户定义函数 (UDF) 作为材料定义的一部分被调用时,单元格信息不可用。这是该宏及其真实气体等效实现的一项限制。
根据定义,比热容 (Cp) 表示为 ,因此其不应具有其他依赖性,否则将与求解器的预期不符。由于 Cp 和焓的定义对能量方程的稳定性至关重要,必须严格遵循预设格式,以避免因 UDF 引发计算不稳定。
唯一能够在网格级别改变 Cp 的方法是通过混合物质量分数的变化。这通常是大多数用户在使用 UDS、UDM 或类似值试图调整 Cp 时希望模拟的情形。然而,更为合理的做法是添加一种新组分(其计算成本并不显著高于使用 UDS)来跟踪材料流。这种新组分可以是原始组分的副本,但具有不同的 Cp。随后,通过调整组分的比例(例如,借助由 UDM 值驱动的源项),间接实现 Cp 的变化。
udf_names.c 是在编译过程中自动生成的。出现该文件的编译错误可能有几个原因,这些错误都表明违反了基本的 UDF 要求。
UDF 开发早期阶段的一个典型错误可能是:
udf_names.c(7) : error C2059: syntax error : '}'
udf_names.c(8) : warning C4034: sizeof returns 0
查看udf库文件夹结构中的文件,会发现定义了一个无效的空数组。对于Windows系统,第6行和第7行可能如下所示:
__declspec(dllexport) UDF_Data udf_data[] = {};
此数组应包含所有用户定义函数(UDF)。由于它是空的,意味着忘记在 *.c
或 *.cpp
源文件中创建至少一个 DEFINE 宏。这在开发初期很容易发生,尤其是当处理一个包含许多小函数的复杂 UDF 时。
应该始终在代码中保留至少一个 DEFINE 宏。记住,可以通过直接访问的方式使用所有用 DEFINE 宏定义的函数。因此,DEFINE_ON_DEMAND 可以像任何 void 函数一样被调用。
可以在 UDF 中使用可变输入参数。使用 UDF 进行复杂条件的参数研究也是可行的。UDF 可以通过以下宏访问输入参数:
Get_Input_Parameter(“Parameter name”)
例如:
#include "udf.h"
DEFINE_REPORT_DEFINITION_FN(volume_flow_rate_inlet)
{
real inlet_velocity = Get_Input_Parameter("vel_in");
real inlet_area = 0.015607214;
real volumeFlow = inlet_velocity*inlet_area;
return volumeFlow;
}
需要注意的是,如果想要在不重新编译的情况下更改UDF源代码中的变量,可以使用UDF中的参数。但是,这些变量在Workbench中无法更改。
UDFs可以通过两种可能的方式之一使用,即编译方式或解释方式。
1、编译UDF
2、解释UDF
在Fluent中,解释型UDF相对于编译型UDF存在一些限制。具体来说,它们不能包含goto语句、非ANSI-C原型、直接的数据结构引用、局部结构的声明、联合、函数指针、函数数组、多维数组以及某些类型的宏,例如用于在主机和节点进程之间通信的宏、全局归约宏和消息传递宏。此外,由于额外的一层代码允许它们在不同的架构、操作系统和Fluent版本之间共享,解释型UDFs会带来性能损耗。它们也无法通过直接的数据结构引用访问Fluent求解器数据,而必须使用Fluent提供的宏。
在Fluent中为用户自定义标量(UDS)指定源项,并且通量函数为质量通量时,孔隙率处理取决于使用的速度形式。
原文地址:https://innovationspace.ansys.com/product/topics-in-ansys-fluent-general-udfs/
”
(完)