本文演示在PyFluent中进行UDF编译、加载及调用过程。
Fluent2022R2版本中可以利用PyFluent进行仿真流程控制,利用其进行Fluent二次开发简直不要太香。
要利用PyFluent进行UDF编译与加载,可以参照下面的步骤。
1、本机编译环境
首先需要配置好本机的UDF编译环境,确保能够在Fluent中成功进行UDF编译,即在下面的对话框中能够通过Build
按钮进行UDF编译。
2、准备测试UDF
随便写个最简单的UDF进行测试。代码如下:
#include "udf.h"
DEFINE_ON_DEMAND(test)
{
Message0("hello, UDF!\n");
}
将程序保存为testUDF.c
。
3、PyFluent中编译并加载UDF
基本原理为参照TUI命令进行编译。
在TUI中编译及加载运行此UDF的命令为:
/define/user-defined> use-built-in-compiler? yes
/define/user-defined/compiled-functions compile "libudf" yes y "testUDF.c" "" ""
/define/user-defined/compiled-functions load "libudf"
/define/user-defined/execute-on-demand "test::libudf"
可以利用PyFluent重复此过程。
import ansys.fluent.core as pyfluent
solver = pyfluent.launch_fluent(precision="double", processor_count=8, mode="solver",version="2d")
# 启用内置编译器
solver.tui.define.user_defined.use_built_in_compiler("yes")
# 编译UDF源文件testUDF.c
solver.tui.define.user_defined.compiled_functions("compile","libudf","yes","y","testUDF.c","","")
# 加载udf
solver.tui.define.user_defined.compiled_functions("load","libudf")
程序输出如下所示。
Give C-Source file names:
Give header file names:
Copied d:\Demo/testUDF.c to libudf\\src
"y" is not found Copied y to libudf\\src
(system "copy "C:\PROGRA~1\ANSYS Inc\v222\fluent"\fluent22.2.0\src\udf\sconstruct.udf "libudf\\win64\2ddp_host\SConstruct" ")
1 file(s) copied.
(system "copy "C:\PROGRA~1\ANSYS Inc\v222\fluent"\fluent22.2.0\src\udf\scons_test.bat "libudf\\win64\2ddp_host\scons_test.bat" ")
1 file(s) copied.
(chdir "libudf")(chdir "win64\\2ddp_host")Compiler used is "C:\\PROGRA~1\\ANSYS Inc\\v222\\fluent"\\ntbin\\clang\\bin\\clang-cl
Linker used is "C:\\PROGRA~1\\ANSYS Inc\\v222\\fluent"\\ntbin\\clang\\bin\\lld-link
Copy("d:\\Demo\\libudf\\win64\\2ddp_host\\resolve.exe", "C:\\PROGRA~1\\ANSYS Inc\\v222\\fluent\\ntbin\\win64\\resolve.exe")
Copy("d:\\Demo\\libudf\\win64\\2ddp_host\\testUDF.c", "d:\\Demo\\libudf\\src\\testUDF.c")
c_sources ['testUDF.c', 'udf_names.c']
c_sources_ ['testUDF.c']
(system "copy "C:\PROGRA~1\ANSYS Inc\v222\fluent"\fluent22.2.0\src\udf\sconstruct.udf "libudf\\win64\2ddp_node\SConstruct" ")
1 file(s) copied.
(system "copy "C:\PROGRA~1\ANSYS Inc\v222\fluent"\fluent22.2.0\src\udf\scons_test.bat "libudf\\win64\2ddp_node\scons_test.bat" ")
1 file(s) copied.
(chdir "libudf")(chdir "win64\\2ddp_node")Compiler used is "C:\\PROGRA~1\\ANSYS Inc\\v222\\fluent"\\ntbin\\clang\\bin\\clang-cl
Linker used is "C:\\PROGRA~1\\ANSYS Inc\\v222\\fluent"\\ntbin\\clang\\bin\\lld-link
Copy("d:\\Demo\\libudf\\win64\\2ddp_node\\resolve.exe", "C:\\PROGRA~1\\ANSYS Inc\\v222\\fluent\\ntbin\\win64\\resolve.exe")
Copy("d:\\Demo\\libudf\\win64\\2ddp_node\\testUDF.c", "d:\\Demo\\libudf\\src\\testUDF.c")
c_sources ['testUDF.c', 'udf_names.c']
c_sources_ ['testUDF.c']
Done.
DESKTOP-HK2IOKB: Opening library "d:\\Demo\\libudf"...Done.
DESKTOP-HK2IOKB: Opening library "d:\\Demo\\libudf"...
test
Done.
可以看到UDF已经被顺利加载。
4、执行UDF
如果从TUI改造代码,按道理可以使用下面的代码调用此UDF:
solver.tui.define.user_defined.execute_on_demand("test::libudf")
然而不知道哪里出了问题,程序给出下面的错误信息,并且Fluent自动退出。
rror: eval: unbound variable
Error Object: test::libudf
Invalid string.
Error: %udf-on-demand: invalid function name
Error Object: #f
Error: %udf-on-demand: invalid function name
Error encountered in critical code section
看错误提示似乎是函数名test::libudf
不对,但是在Fluent中利用TUI命令/define/user-defined/execute-on-demand "test::libudf"
的确是可以运行的,如下图所示。
喝了口水,突然觉得应该是函数名必须使用字符串,灵机一动改成了下面的形式:
solver.tui.define.user_defined.execute_on_demand('"test::libudf"')
果然可以运行了,如下图所示。
这里只是一个简单的UDF编译调用测试案例,对于其他各种复杂案例,按理也可以依此方法进行处理。
(完)