udf编译的经验总结

合集下载

第七章 UDF的编译与链接

第七章 UDF的编译与链接

第七章 UDF的编译与链接编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。

在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。

_ 第 7.1 节: 介绍_ 第 7.2 节: 解释 UDF_ 第 7.3 节: 编译 UDF7.1 介绍解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。

编译后的UDF由C语言系统的编译器编译成本地目标码。

这一过程须在FLUENT运行前完成。

在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。

另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。

这一代码调用时是在内部模拟器或解释器上运行。

与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。

如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。

为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。

解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。

编译UDF的控制面板里有个“Open按钮”,当点击“Open按钮” 时会“打开”或连接目标代码库运行FLUENT(此时在运行FLUENT之前需要编译好目标码)。

当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。

因此,只要读取case文件,这个库会自动地链接到FLUENT处理过程。

同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。

只要读取这个case文件,这些函数会被自动编译。

注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。

一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。

UDF 编译疑难问题

UDF 编译疑难问题
至于为什么意思语句编译会出错就需要更加专业的程序员来解释。
接下来如果编译如下的程序
#include "udf.h"
DEFINE_TRANS_FLENGTH(user_Flength, c, t)
{
real Flength = 31.468;
return Flength;
}
DEFINE_TRANS_RETHETA_C(user_Re_thetac, c, t)
_Check_return_ _ACRTIMP double __cdecl cbrt(_In_ double _X);(求立方根函数)
改成
//_Check_return_ _ACRTIMP double __cdecl cbrt(_In_ double _X);(求立方根函数)
即忽略这样一个函数的定义。结果就可以成功的编译UDF了。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(99): errorC2059:语法错误:“;”
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(101): error C2061:语法错误:标识符“__ATTRIBUTES”
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(101): error C2059:语法错误:“;”
说明这条头文件是必须的。所以这种方法又失败了。
所以还是回到微软自己提供的math.h文件。解决以上出现的编译问题其实解决的思路很简单将

UDF 编译疑难问题

UDF 编译疑难问题
至于为什么意思语句编译会出错就需要更加专业的程序员来解释。
接下来如果编译如下的程序
#include "udf.h"
DEFINE_TRANS_FLENGTH(user_Flength, c, t)
{
real Flength = 31.468;
return Flength;
}
DEFINE_TRANS_RETHETA_C(user_Re_thetac, c, t)
如果你查找ycheck.h,想加入这个头文件来解决这个问题的话,你会发现在中文资料库里根本就查不到这样的头文件。这可能是该公司内部开发的一个头文件。所以这条路又行不通。那么如果将这条预处理程序忽略掉呢?结果就会出现以下的编译错误:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\math.h(99): error C2061:语法错误:标识符“__ATTRIBUTES”
{
real Re_thetac = 176.396;
return Re_thetac;
}
DEFINE_TRANS_RETHETA_T(user_Re_thetat, c, t)
{
real Re_thetat = 210;
return Re_etat;
}
会出现如下的错误,许多人认为这个程序是直接从fluent帮助文件里拷贝的应该没什么问题,但是阅读资料应该全面,注意到t的声明在程序里没有给出,但是却在帮助文件的前半部分查到。Fluent里面默认thread为一个指针,而t不是所以将t改成thread应该就可以了,结果证实我的推理是正确的。
udf_names.c(7): error C2059:语法错误:“}”udf_names.c(8): warning C4034: sizeof返回0

fluent udf学习总结

fluent udf学习总结

fluent udf 阶段性小结——Flying_U因工作需要,最近开始学习fluent二次开发功能。

现在,根据工作日志将这一段时间主要的学习过程和总结的经验整理如下。

学习计划:从4月5号开始,计划花上一个月的时间了解和学习fluent udf的基本知识。

目标是能够运用udf初步实现物理模型简化、掌握udf的基本用法并能根据工作需要实现相关udf功能。

4.5-4.6:浏览网站尽可能更多了解udf的知识,结合自己的实际情况分析那些知识是自己需要进一步深入学习的。

此阶段总结:1.udf是用户自定义函数的简称,其通过与fluent接口连接实现扩展fluent功能的作用。

udf的主要功能有:●定制边界条件、材料属性、表面和体积反应率、fluent输运方程的源项、用户自定义的标量方程的源项、扩散函数等●调整每次迭代后的计算结果●初始化流场的解●在需要时进行udf的异步执行●强化后处理功能●强化现有的udf模型●传送返回值、修改fluent变量、操作外部文件案例和data文件2. 自己现在想要实现的是udf功能是定制边界条件、定制fluent输运方程的源项、初始化流场的解和强化后处理功能;(刚开始自己也不太明确自己到底想用udf来做什么,对应上udf的主要功能是哪一部分,然后对自己不懂没理解的功能一一查询。

)3. 有相关资料的渠道有:百度知道,百度文库和doc88。

其中,百度文库各种教程最多,百度知道能够快速定位回答具体的问题,doc88资料觉得更深入一些。

(对搜集的资料进行及时的整理和归纳对自己学习有很大助力,很多资料都是不完全的或者自己当时没有完全理解的需要不同版本或者前后不同时间段对照着学习。

)4.6-4.9 根据自己的需求在udf帮组手册中查找实例并尝试按实例进行对照练习,初步了解udf相关知识,打通udf实现的过程(udf编写、编译和连接)。

主要目的是了解udf的基本用法,初步了解udf宏命令。

此阶段总结:1.udf帮助手册里的实例对初学者特别有用,例子难度小,侧重流程和用法。

UDF总结

UDF总结

UDF使用技巧1、查找相应的函数的时候,可以现在word里面找到相应的函数名字,然后依次去中文帮助文档、英文帮助文档和网页帮助文档,看看详细解释并找找是否有相应的例子。

2、打个比方来说,thread就是公路,连接的cell和face,cell和face就相当于公路上汽车停靠的站点,cell_t这个面向的是单元,而face_t面向的是边或者面(二维或三维)在fluent循环过程中,一般是用thread作线程检索,而cell或者face作检索过程中位置(相当于指示位置的参数)参数的指示3、对于UDF来说,积分就是做加法,把通过面上每个网格的质量流量相加4、cell和face的区别,什么时候用cell,什么时候用face?5、1. begin, end_c_loop macro is used for looping over all the cells in particular thread for serial processing.2. For parallel processing, the cells inside a partition can be categorized as interior and exterior cells.3. The macros begin, end_c_loop_int; begin, end_c_loop_ext and begin, end_c_loop_all are used for looping over interior, exterior and all the cells (in a partition) respectively.4. In parallel simulations, both begin, end_c_loop and begin, end_c_loop_all macros will do the same job.5. For faces the looping macro in parallel are begin, end_f_loop_int; begin, end_f_loop_ext and begin, end_f_loop for looping over interior, boundary and all faces respectively. For all practical purpose, the user need not separate the interior and boundary faces of a partition. Hence, begin, end_f_loop_int and begin, end_f_loop_ext macros are rarely used.实际问题1、DEFINE_UDS_UNSTEADY中的apu包括的函数是不是不包括当前时刻的变量,而su包含前一时刻的变量,所以用了C_STORAGE_R存储前一时刻的变量。

python udf编译

python udf编译

python udf编译Python UDF编译:优化大数据处理的利器随着大数据时代的到来,数据量的急剧增长对数据处理的速度和效率提出了更高的要求。

在大数据处理中,用户定义函数(User-Defined Function,简称UDF)是一种非常常见的操作,它可以根据用户自定义的逻辑对数据进行处理和转换。

而Python UDF作为一种强大的工具,能够帮助开发人员更加高效地进行大数据处理。

本文将从编译角度探讨Python UDF的优势和应用方法。

一、Python UDF的基本概念Python UDF是指使用Python语言编写的用户自定义函数,它可以在大数据处理框架中被调用和执行。

Python UDF可以借助编译技术,在执行前将其转换为底层的机器码,从而提高运行效率。

相比于解释执行的方式,编译后的Python UDF能够更快地处理数据,并且具备更好的扩展性和灵活性。

二、Python UDF的优势1. 高效性:编译后的Python UDF可以直接在底层执行,避免了解释执行的性能损失,大大提高了数据处理的速度和效率。

2. 灵活性:Python作为一种动态语言,具备很高的灵活性和表达能力。

通过编写Python UDF,开发人员可以根据具体需求自定义数据处理的逻辑,从而实现更加灵活的数据转换和计算。

3. 易用性:Python语言简洁易懂,具备广泛的应用场景。

相比于其他编程语言,使用Python编写UDF更加简单直观,降低了开发门槛,提高了开发效率。

三、Python UDF的应用方法1. 数据清洗:在数据处理过程中,经常需要对原始数据进行清洗和过滤。

通过编写Python UDF,可以根据具体需求对数据进行清洗,如去除重复值、处理缺失值等。

2. 特征提取:在机器学习和数据挖掘领域,特征提取是一个非常重要的环节。

通过编写Python UDF,可以针对具体的特征提取需求,自定义特征提取函数,从原始数据中提取出有效的特征信息。

udf编译

udf编译

udf编译UDF编译什么是UDF?UDF(User Defined Function)即用户自定义函数,是一种用户可以自行编写并添加到数据库中的函数。

它可以扩展数据库的功能,使得用户可以使用自己定义的函数来完成一些特定的操作。

UDF编译过程在MySQL中,UDF是通过动态链接库(DLL)实现的。

因此,要使用UDF,必须先将其编译成动态链接库。

1. 编写UDF源代码首先需要编写一个C/C++源文件来实现自己想要实现的功能。

这个源文件需要包含以下内容:- 头文件:包含必要的头文件,如mysql.h、stdio.h等。

- 函数声明:声明需要实现的函数。

- 函数定义:实现需要实现的函数。

例如,下面是一个简单的UDF源代码示例:```#include <stdio.h>#include <mysql.h>my_bool hello_init(UDF_INIT *initid, UDF_ARGS *args, char *message);void hello_deinit(UDF_INIT *initid);char* hello(UDF_INIT *initid, UDF_ARGS *args, char* result, unsigned long* length, char* is_null, char* error);my_bool hello_init(UDF_INIT *initid, UDF_ARGS *args, char *message){return 0;}void hello_deinit(UDF_INIT *initid){return;}char* hello(UDF_INIT *initid, UDF_ARGS *args, char* result, unsigned long* length, char* is_null, char* error){sprintf(result, "Hello, %s!", args->args[0]);*length = strlen(result);return result;}```这个UDF实现的功能是将输入的字符串加上“Hello, ”前缀输出。

udf-使用经验总结

udf-使用经验总结

我接触UDF的时间不算长,2007年7月份开始看UDF的中文帮助,花了一周时间大体看完后,第一感觉:不难啊,至少不像以前别人给我讲的很高深的样子。

然后就是UDF编程,直到10月底吧。

然后用的时间就不多了。

然后就是这两周,我马上就要研究生毕业了,可能这周结束后用UDF编程的可能性会很小了,所以想写点东西,给刚刚学UDF编程的人,希望对大家有用。

对于UDF高手,估计是不用向下看了。

UDF框架光看书,感觉UDF不难。

看例子,有些看个四五遍之后才能差不多看懂。

原来,得靠UDF帮助。

我主要用的是fluent v6.3自带的html格式的帮助,里面东西很全,当然也包括UDF Manual。

里面自带的search功能相当好,只是要注意用好+或-号(逻辑符号),另外,这个功能似乎有些浏览器支持不太好,不过基本上用IE不太容易出问题。

对于从零开始学习UDF,建议还是先看一下UDF中文帮助,我估计大家知道的都是马世虎翻译的那本吧,感觉挺好。

(没想到马世虎跟我是校友,去年给安世亚太投过一份简历,他给我打过电话,当时一阵兴奋,呵呵。

)1. 对于只涉及到边界条件或物性等的UDF,一般用interpret就可以的,这些我觉得只需要根据例子改一下就是了。

$$ 对于要添加UDS方程的,相对难一点。

我编程用的是三到五个UDS,几十个UDM。

一开始编程时,没有头绪,后来看别人编的,才慢慢发现了一些基本思路。

比如,可以用枚举定义UDS或UDM,这样用起来方便。

enum{NP,RHOH2O_Y_UP_X,RHOH2O_Y_UP_Y,RHOH2O_Y_UP_Z,N_REQUIRED_UDS};//枚举UDS变量名对于UDM,则用N_REQUIRED_UDM代表个数。

2. 然后在INIT与ADJUST函数中,检查变量个数时则比较方便,如:DEFINE_INIT(init_parameter,domain){if (n_uds <N_REQUIRED_UDS)Error("Not enough user defined scalars!(init)\n");if (n_udm<N_REQUIRED_UDM)Error("Not enough user defined memories(init)!\n");initialise(domain);//代表初始化}DEFINE_A DJUST(adjust_compute,domain){if (n_uds <N_REQUIRED_UDS)Error("Not enough user defined scalars!(adjust)\n");if (n_udm<N_REQUIRED_UDM)Error("Not enough user defined memories(adjust)!\n");update_parameter(domain);//代表主函数}3. 初始化时,则可:cell_t c;Thread *t;int i;thread_loop_c(t,d){if(NNULLP(T HREA D_STORA GE(t,SV_UDS_I(NP)))&&NNULLP(T HREA D_STORA GE(t,SV_UDS_I(NP_R)))) //为各UDS提供存储空间{begin_c_loop(c, t){for (i=0; i<N_REQUIRED_UDS; i++)C_UDSI(c,t,i) = 0.0;}end_c_loop(c, t);}if(NNULLP(T HREA D_STORA GE(t,SV_UDM_I))){begin_c_loop(c, t){for (i=0; i<N_REQUIRED_UDM; i++)C_UDMI(c,t,i) = 0.0;}end_c_loop(c, t);}}4. 对于各UDM量,则可:real udm_v;udm_v=0;//用之前对变量进行初始化...//UDM相关运行C_UDM I(c,t,UDM_V)=udm_v;//把值输入给UDM,当然之前要对UDM_V进行定义用UDM有个好处,一是可以在后处理中显示,二是传递变量相当方便,比如在ADJUST中计算的量用于源项或对流项等,用UDM可以直接调用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

转帖 udf编译的经验总结
关于:"nmake"不是内部命令或外部命令,也不是可运行程序
我在编译UDF时出现如下错误:
Error: Floating point error: divide by zero
Error Object: ()
> "nmake"不是内部命令或外部命令,也不是可运行程序
Error Object: ()
Error: open_udf_library:系统找不到指定目录
Error: Floating point error: divide by zero
Error Object: ()
我原来装的时turbo c/c++编译器,可能时环境变量没有设好的缘故。

换用vc++6.0以后就没有这个问题了,另外,我用的是fluent6.2.16,希望遇到同样问题的同学借鉴一下,呵
呵。

udf编译的经验总结1)安装vc时候,只要选择了“环境变量”这一项,就不需要在“我
的电脑 > 属性 > 高级 > 环境变量”中
更改“include”“lib”“path”变量的值,保持默认状态即可;
2)如果是fluent6.1以上的版本,读入你的case文件,只要在
define->user-defined->functions->complied中,
add你的udf源文件(*.c)和“udf.h”头文件,然后确定用户共享库(library name)的
名称,按“build”,就
相当于nmake用户共享库;在这一步中常出现的错误:
(a)(system "move user_nt.udf libudf\ntx86\2d")0
(system "copy C:\Fluent.Inc\fluent6.1.22\src\makefile_nt.udf
libudf\ntx86\2d\makefile")已复制 1 个文件。

(chdir "libudf")()
(chdir "ntx86\2d")()
'nmake' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

'nmake' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

Done.
而点击load时则出现不可编译的错误:
Opening library "libudf"...
Error: open_udf_library: 系统找不到指定的文件。

Error Object: ()
原因:没有安装vc或者没有选择环境变量。

解决方法:安装vc,并选择环境变量;没有正确设置环境变量的,按以下方法:
. 在我的电脑 > 属性 > 高级 > 环境变量中设置“include”“lib”“path”变量
的值,
. include:D:\Program Files\Microsoft Visual Studio .NET\Vc7\include\ . lib:D:\Program Files\Microsoft Visual Studio .NET\Vc7\lib\
. 找到Microsoft Visual Studio .NET\Vc7\bin\cl.exe的动态链接库mspdb70.dll,
将mspdb70.dll的
路径加入到path的值。

cl.exe 是 the Microsoft Visual Studio的编辑执行文件,只要正确设置环境变量
后,你才能看到以下信息:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption...
(b)(system "move user_nt.udf libudf\ntx86\3d")0
(system "copy C:\fluent.inc\fluent6.1\src\makefile_nt.udf
libudf\ntx86\3d\makefile")已复制 1 个文件。

(chdir "libudf")()
(chdir "ntx86\3d")()
udf.c
# Generating udf_names.c because of makefile udf.obj
udf_names.c
udf_names.c(7) : error C2059: syntax error : '}'
udf_names.c(8) : warning C4034: sizeof returns 0
我在c里调试已经通过了,但是在fluent编译时出现问题,我该怎么调试呀?
Done.
解决方法:找到一个带udf的例题,如果udf能正确运行,将该例题的udf源文件example.c
另存为一个新文件;
然后,将上面的内容全部删除,将你编写的udf源文件的内容copy到新文件
中去,存储这个新文件后,
最后编译和创建用户共享库(build),就不会出现上述问题了。

原因:可能是自己编写udf源文件的模板不对,具体原因我也不太清楚,请大家指教了。

3)然后在define->user-defined->functions->complied中按“load”,即连接共享库
到fluent可执行文件中。

请楼主参考一下吧,应该照着做就可以解决这个问题了.
或者你不要用compile编译,用interupt(如果udf比较简单的话)。

相关文档
最新文档