【vc++精品源码栏目提醒】:以下是网学会员为您推荐的vc++精品源码-UDF的编译与链接【精品推荐-doc】 - 销售管理,希望本篇文章对您学习有所帮助。
第七章 UDF的编译与链接编写好UDF件详见第三章后接下来则准备编译或链接它。
在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。
_ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.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必须用DEFINE宏进行定义DEFINE宏的定义是在udf.h文件中。
因此在用户编译UDF之前udf.h文件必须被放到一个可被找到的路径或者放到当前的工作目录中。
udf.h文件放置在 path/Fluent.Inc/fluent6.x/src/udf.h 其中path是Fluent软件的安装目录即Fluent.Inc目录。
X代表了你所安装的版本号。
通常情况下用户不应该从安装默认目录中复制udf.h文件。
编译器先在当前目录中寻找该文件如果没找到编译器会自动到/src目录下寻找。
如果你升级了软件的版本但是没有从你的工作目录中删除旧版本的udf.h文件你则不能访问到该文件的最新版本。
在任何情况下都不应该改变udf.h文件。
7.2 UDF解释 这一节介绍编译经过解释的UDF的步骤。
一旦经过解释的UDF被编译用户自定义的C函数的名称与内容将会被存放到case文件中。
只要读取这个case文件这些函数便会自动被编译。
编译被解释的UDF的一般程序如下 1. 如果用户没有在网络Windows计算机上使用并行的FLUENT版本则需要确定UDF的C源码和case文件与当前工作目录一致。
具体步骤见7.2.2节。
如果源码不在当前工作目录则用户编译UDF时用户必须在解释UDF的控制面板里输入文件的完全路径而不是只输入文件名。
2. 在当前工作目录下运行FLUENT。
3. 读取或建立case文件。
4. 打开“Interpreted UDFs panel”编译UDF如vprofile.c。
图7.2.1 解释的UDF的控制面板 a 在“Source File Name”下输入C源码的文件名如vprofile.c。
如果自定义的C源码不在工作目录中用户必须输入完全的自定义的C函数路径。
当写入case文件时自定义源码的名称或源码的完全路径会存放到case文件中。
b 在“CPP Command Name”指定为C的预处理程序。
当然也有其它有效的ANSI C预处理程序包括gcc -E和cc –E。
详细检查所用的计算机系统管理。
c 如果自定义函数局部变量数不引起栈的溢出则保持“Stack Size”的默认值为1000。
此时所设 “Stack Size” 的数要远远大于局部变量用的数。
d 选择“Display Assembly Listing”则当函数编译汇编码的清单会出现在窗口的控制台内。
这一选项会保存于case文件当用户接着运行FLUENT时汇编码会自动显示。
e 如果用户使用“Fluent Inc”提供的C预处理程序选择“Use Contributed CPP”。
f 点击“Compile”编译UDF。
自定义C程序的名称和内容会存入于所写的case文件。
只要编译UDF汇编码会出现在控制窗口所示范例如下。
g 编译结束点击“Close”。
如果在一次模拟中使用多于一个的UDF用户需要将这些函数连接在一个C文件中例如all.c。
然后用“Interpreted UDFs”面板编译连接的文件。
这些函数可以作为边界条件、源项及特性等。
7.2.2 基于Windows并行网络的目录结构 在基于Windows网络上使用并行FLUENT版本需要专门的方法组织用户文件。
具体步骤如下 1. 在“Fluent.Inc”目录下创建一个名为“udf” 的可写子目录。
2. 在udf目录下创建子目录如Fluent.Incudfmyudf将UDF的C源码存放于这个目录下。
如果在同一串下多个用户运行工作每个用户在udf目录下创建自己的子目录如Fluent.Incudfabcudf和xyzudf。
因为源码不在当前工作目录下所以在编译UDF时必须在“Interpreted UDFs”面板中输入文件的完全路径。
例如编译example.c文件时输入如下 Fluent.Incudfmyudfexample.c 应输入用户所安装FLUENT的计算机名如myserver。
3. 确定所建立的case文件在当前工作目录下。
7.2.3 调试解释的UDF 编译UDF时出错信息会出现在控制窗口中。
用户有可能因错误滚动太快不能看到所用的出错信息。
因此调试UDF时用户想关掉“Display Assembly Listing”。
如果在调试UDF的过程中一直打开“Interpreted UDFs”面板由于在独立窗口进行编辑编译按钮则会不断重复编译。
然后直到无出错信息调试和编译才会结束。
下面介绍一个出错例子即在“Interpreted UDFs”控制面板中编译被解释过的UDF时指定了错误的源文件。
上面曾介绍过如果仅仅从当前工作目录下启动FLUENT在“Interpreted UDFs”控制面板中键入用户的C源码的文件名则case文件和C源码被指定于当前工作目录下。
如果用户编译的C源码与工作目录是不同的路径用户必须输入C源码所在的完整路径。
否则会出现以下的错误信息 gcc: vprofile.c: No such file or directory gcc: No input files Error: vprofile.c: line 1: syntax error. 如果编译UDF写完case文件后接着移动C源码到不同位置会在接着运行FLUENT的过程中产生同样的错误信息。
为了避免错误只需要在“Interpreted UDFs”控制面板中的“Source File Name”下输入完全的路径名然后点击“Compile”。
此时写case文件会保存C源码的新路径。
7.3 编译UDF 这一节介绍如何链接编译好的UDF。
这一过程需要使用C编译器。
大部分UNIX的操作系统提供了C编译器。
如果在PC机上运行需要安装VC编译器如微软C、v6.0或更高的版本。
一旦编译好的UDF库文件在FLUENT运行时链接到FLUENT处理过程和共享库相关的东西会保存到case文件。
因此只要读取case文件编译的库文件会自动链接到FLUENT处理过程。
在控制窗口将会出现链接状态的报告如下 Opening library libp1/ultra/2d/libudf.so... p1_adjust energy_source p1_source p1_diffusivity p1_bc Done. 7.3.1 一般程序 编译和链接一个编译好的UDF的一般程序如下所示 1. 在当前工作目录下建立专门的目录结构见7.3.2节。
2. 编译用户的UDF和修建共享库见7.3.3节。
3. 在当前工作目录下运行FLUENT。
4. 读取或
上一篇:
【精品】模拟计算器程序
下一篇:
让我掉下眼泪的