Fluent-170-UDF-中文教程-第一章-UDF概述

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1前言首先说说为什么要翻译Fluent的UDF。其实在读研期间时间还是比较充裕的。有些时候,不给自己下一个目标,时间就在看看电视剧,看看舍友吃吃鸡中过去了,我自己的专业是与流动和燃烧相关,Fluent是必学的软件。可是网上关于UDF的中文例子又很少。当然,软件本身英文帮助是一种很好的学习材料,但无论我们英语多好,它毕竟不是我们的母语,我们理解起来还是有一定的困难的。因此,一方面为了加深自己的理解,另一方面也好给自己,给别人留个参考资料,所以我决定写下中文翻译版。在翻译的时候,也参考了一些网上的资料,比如网上本来就有的中文版UDF讲解,只是其版本比较旧,而且排版有点不是很舒服,有的地方翻译还有点变扭。所以决定给自己一个挑战,看看我自己能不能改善,或者是更新一下这个中文版的翻译。在翻译的过程中,我真正感受到Fluent的强大,其考虑到的内容实在是很宽很广。难道真的是核心科技都掌握在美国人手上么?我们中国人什么时候也能做出这样庞大的商业软件?或许有这种抱负的中国人不在少数,但是很多科研年轻人迫于生活,默默的顺从了它,找了份安定的工作,然后慢慢磨没了最初的理想。当然,这并不怪我们,也不该怪国家,怪社会。改革开放近40年来,我国已经取得了举世瞩目的成就,人民的生活水平得到了进一步提高,科技迅猛发展。但是我的同邻人他们,或者我们,还并没有不用考虑未来,还要想明天饭到那吃,工资到哪领,女朋友怎么找,房车怎么买。这样,就很难潜心做自己喜欢的事,我希望,我们的下一代,可以做自己喜欢的事,希望他们能够将自己喜欢的事情做到世界之最。但是很显然,我们这一代大多数人还不具备这样的条件。还有,现在我也没有全部翻译完,反正慢慢翻译吧,后年3月应该能翻译完了。Fluent17.0中将UDF的一个八章加三个附录,我会一章一章发。翻译后我也没有仔细校对。校对工作就靠大家了。希望与大家一同进步。如果大家有什么建议或者与意见的话我的邮箱:tang_jiyong@163.com唐继勇2017年09月18日于南京航空航天大学10号楼3192第一章UDF概述1.1什么是UDFUDF(UserDefinedFunction,用户自定义函数),可以用于被ANSYSFLUENT求解器动态加载以增强其标准功能的C语言程序。UDF归根结底是一段C语言代码,但是需要在FLUENT规定的框架范围内去定义,这样才能够被FLUENT认可并在其加载后以提供标准程序所不具备的功能。一般说来,任何一种软件都不可能满足每一个人的要求,FLUENT也一样,其标准界面及功能并不能满足每个用户的需要。UDF正是为解决这种问题而来,使用它我们可以编写FLUENT代码来满足不同用户的特殊需要。当然,FLUENT的UDF并不是什么问题都可以解决的,在下面的章节中我们就会具体介绍一下FLUENTUDF的具体功能。现在先简要介绍一下UDF的一些功能。在FLUENT中,可以利用UDF来延伸fluent自身的功能。比如说以下一些典型的应用:(1)自定义属性。如边界条件、材料属性、化学反应速率、输运方程源项、UDS等;(2)迭代中调整计算中;(3)初始化;(4)异步执行命令;(5)迭代完后执行命令;(6)增强后处理;(7)增强现有的模型(如离散相模型、多相流模型等等)当然了,FLUENT本身已经具备了较多强大的功能,并不是所有的计算模型都需要使用UDF。虽然说UDF是利用C程序,但是毕竟是需要存在于FLUENT所订立的规则之下,因此其具有其特殊的特征:(1)UDF是利用的C程序语言,故源文件的扩展名为.c,可以用文本编辑器进行编辑。另外,UDF程序必须符合C语言语法要求;(2)UDF程序都是利用FLUENT提供的DEFINE宏进行定义;(3)所有的UDF程序都需要包含udf.h头文件;(4)UDF程序可以通过两种方式进行加载:解释与编译;解释型的UDF不需要外部编译器,而解释型的UDF则需要C编译器,在windows环境中常使用Visualstudio,而在Linux环境中,则通常使用GCC。1.2UDF的一些限制UDF不是万能的,虽然说在很多地方可以应用UDF以增强FLUENT自身的能力,但是毕竟局限于FLUENT的圈圈之类,还是存在一些局限性:(1)UDF中使用的物理量以及返回值均采用SI单位制;(2)若更换FLUENT运行环境(如FLUENT版本、操作系统环境等),则UDF需要重新进行编译加载。1.3使用DEFINE宏来定义UDFUDF通过FLUENT提供的函数申明(即所谓的宏)来定义。这些定义UDF的函数申明在代码中作为宏执行,可在作为DEFINE(全部大写)宏的文献中查阅。对每DEFINE3宏的完整描述和它的应用例子都可以在**中查询。DEFINE宏的通用格式为:DEFINE_MACRONAME(udf_name,passed-invariables)这里括号内第一个自变量是你的UDF的名称。名称自变量是情形敏感的,必须用小写字母指定。一旦函数被解释或者编译,你定义的UDF的名字在FLUENT下拉列表中将变成可见的和可选的。第二套输入到DEFINE宏的自变量是从FLUENT求解器传递到你的函数的变量。在下面的例子中,宏DEFINE_PROFILE(inlet_x_velocity,thread,index)用两个从FLUENT传递到函数的变量thread和index定义了名字为inlet_x_velocity的分布函数。这些passed-in变量是边界条件区域的ID(作为指向thread的指针)而index确定了被存储的变量。一旦UDF被解释或编译,它的名字(例如inlet_x_velocity)将在FLUENT适当的边界条件面板(例如,VelocityInlet面板)的下拉列表中变为可见的和可选的。!!注意:·所有用于DEFINE宏的自变量必须放在你的源代码的同一行上。分割DEFINE的声明为几行可能导致编译错误。·宏名称和第一个括号之间不可以有空格,会导致错误。·不要在源代码的注释中写宏名称(比如DEFINE_PROFILE),会导致编译错误。1.3.1在你的UDF源文件中包含udf.h头文件udf.h头文件包含:·DEFINE宏的定义·C语言头文件库的编译指令#include·FLUENT提供的其他宏或者函数的头文件(比如mem.h)(也就是说,如果在UDF源文件中包含来udf.h头文件,就相当于包含了FLUENT中预先定义的DEFINE宏+C语言的头文件+FLUENT提供的其他宏或者函数的头文件)还有,当你编译你的UDF时,你不必放置udf.h的拷贝在你的当地目录下;一旦你的UDF被编译,FLUENT求解器会自动地从path\ANSYSInc\v180\fluent18.0.0.0\src目录来读取udf.h文件。1.4解释型和编译型UDF在FLUENT中,UDF的源代码可以是解释型的,也可以是编译型的。两种类型的UDF代码均可以被编译,但是两种方式的源代码的编译方式以及编译后的得到的代码并不相同。1.4.1编译型UDF编译型UDF和FLUENT本身运行的方式是相同的,即通过一个名为Makefile的脚本文件来调用C编译器构建一个目标代码库。我们可以点击在CompiledUDFs对话框中的Build来启动这个过程。目标代码库中包含了能够编译高级C语言源代码的原始机器语言。在FLUENT运行时必须通过一个叫“dynamicloading”的过程来加载该目标代码库。我们可以点击在CompiledUDFs对话框中的Loading来启动这个过程。该对象库与其编译过程中所使用的Fluent版本及计算机体系结构相关。因此,若改变了4计算机操作系统或Fluent版本的话,UDF对象库必须重新构建。总而言之,如果想要使用GUI来编译UDF源代码的话,就必须包含两个步骤。这两个步骤都在CompiledUDFs对话框中设置,包括1)利用UDF源代码来构建一个目标代码库。2)加载该目标代码库到FLUENT中1.4.2解释型UDF解释型UDF仅仅需要一步就可以通过GUI来解释。这个过程发生在(FLUENT)运行时。解释解释型UDF是在InterpretedUDFs对话框中设置的。在FLUENT内,解释型UDF的源代码会被C语言前处理器编译成一种中间的,跟架构没有关系的机器代码。然后当该UDF被启动时,这种机器代码就会被FLUENT内的编译器编译,这种额外一层代码会造成计算性能的下降,但是可以让解释型UDF在不同的计算机体系结构,操作系统,ANSYS版本中使用。如果运行速度并不是一个大问题的话,那么解释型UDF可以不做任何修改就以编译型UDF的方式编译。解释型UDF所用的编译器并不具备标准C语言编译器的所有功能,而且并不支持所有的并行UDF宏。1.4.3编译型UDF和解释型UDF的不同点编译型UDF和解释型UD最大的不同点就是解释型UDF不可以使用直接架构来获取FLUENT求解器中的数据。解释型UDF只能通过FLUENT提供的宏来获取数据。以下是编译型UDF和解释型UDF的不同点总结:•解释型UDFo对其它平台是可移动的(portable)。o可作为编译型来运行。o不需C编译器。o比compiledUDF慢。o在使用C语言上有限制。o不能与编译系统或用户库(compiledsystemoruserlibraries)连接。o只能使用预定义宏来获得FLUENT结构中的数据。•编译型UDFo比解释型UDF运行快。o在使用C语言上不存在限制。o能调用以其他语言编写的函数o如果包含有FLUENT解释器(interpreter)不能处理得C语言元素,则不能作为解释型UDF运行。总的来说,当决定使用那种类型的UDF时:•使用interpretedUDF作为简单的函数•使用compiledUDF作为复杂的函数,这些函数o对CPU有较大要求(例如每次运行时,在每个单元上均须调用的属性UDF。o需要使用编译库1.5将UDF连接到ANSYSFluent中当UDF被编译或者解释完后,在FLUENT相应的下拉菜单中就可以选择了,即可连接到5FLUENT中。具体内容我们将在第六章中讨论。1.6网格术语大多数的用户定义函数都是从FLUENT求解器中获取的。因为FLUENT求解器中的数据都是定义在网格上的,所以在使用UDF之前,必须理解网格拓扑学的术语。下面是显示在图1.1中的网格实体的定义。图1.1网格拓扑英文名中文名解释Node节点网格点Edge边3D中面的边界Face面单元的边界Cell单元单元Nodethread节点线索节点组Facethread面线索面组Cellthread单元线索单元组Cellcenter单元中心单元数据存储的坐标domain区域节点组,面组,单元组的组合表1.1网格拓扑术语网格被分成控制容积(单元)。每个单元被一系列节点,单元中心,面组成。FLUENT用内部数据结构来定义网格区域(domain),以确定单元,面,节点的顺序,以在单元之间建立联系。线索(Thread)是FLUENT中用来存储边界区或单元区信息的一种数据结构(应该6就是把FLUENT把网格信息数据化后把这些信息叫Thread,包括Nodethread,facethread和cellthread)。单元线索是一组单元,面线索是一组面,节点线索是一组节点。线索数据结构的指针通常被用到各个函数当中,以获取该线索所代表的边界或者单元区的各种信息。我们在FLUENT的boundaryconditions对话框中所定义的每个边界区域或者单元区都有一个整数ZoneID与之对应,这个ZoneID对应了该区域内的网格数据。在FLUENT对话框中我们并不会看到Thread这个选项,但是在编写UDF的时候,我们可以想象有一个所谓的thread数据结构,存储了对应ID的zone的数据信息。单元和面是用来定义模型的物理组成部分(例如进口,出口,壁面,流体域等)。一个面是一个或者两个单元的边界,这取决于这个面是边界面(boundary)还是内部面(interior)。区域(

1 / 11
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功