关闭

关闭

封号提示

内容

首页 fluent UDF第二章.doc

fluent UDF第二章.doc

fluent UDF第二章.doc

上传者: 怀念日光倾城的美好 2017-10-19 评分 5 0 111 15 505 暂无简介 简介 举报

简介:本文档为《fluent UDF第二章doc》,可适用于IT/计算机领域,主题内容包含fluentUDF第二章UDFCUDFC引言注释你的C代码FLUENT中的C数据类型常数变量自定义数据类型强制转换函数数组指针声明常用C操作符C库函符等。

fluentUDF第二章UDFCUDFC引言注释你的C代码FLUENT中的C数据类型常数变量自定义数据类型强制转换函数数组指针声明常用C操作符C库函数用#define实现宏置换用#include实现文件包含与FORTRAN比较本章介绍了C语言的一些基本信息这些信息对处理FLUENT的UDF很有帮助。本章首先假定你有一些编程经验而不是C语言的初级介绍。本章不会介绍诸如whiledo循环联合递归结构以及读写文件的基础知识。如果你对C语言不熟悉可以参阅C语言的相关书籍。C熟悉C语言的人都知道注释在编写程序和调试程序等处理中是很重要的。注释的每一行以“*”开始后面的是注释的文本行然后是“*”结尾如:*ThisishowIputacommentinmyCprogram*FLUENTCFLUENT的UDF解释程序支持下面的C数据类型:Int:整型Long:长整型Real:实数Float:浮点型Double:双精度Char:字符型注意:UDF解释函数在单精度算法中定义real类型为float型在双精度算法宏定义real为double型。因为解释函数自动作如此分配所以使用在UDF中声明所有的float和double数据变量时使用real数据类型是很好的编程习惯。常数是表达式中所使用的在C程序中用语句#define来定义。最简单的常数是十进制整数(如:)包含小数点或者包含字母e的十进制数被看成浮点常数。按惯例常数的声明一般都使用大写字母。例如你可以设定区域的ID或者定义YMIN和YMAX如下:#defineWALLID#defineYMIN#defineYMAX变量或者对象保存在可以存储数值的内存中。每一个变量都有类型、名字和值。变量在使用之前必须在C程序中声明。这样计算机才会提前知道应该如何分配给相应变量的存储类型。变量声明的结构如下:首先是数据类型然后是具有相应类型的一个或多个变量的名字。变量声明时可以给定初值最后面用分号结尾。变量名的头字母必须是C所允许的合法字符变量名字中可以有字母数字和下划线。需要注意的是在C程序中字母是区分大小写的。下面是变量声明的例子:intn*声明变量n为整型*inti,i*声明变量i和i为整型*floattmax=*tmax为浮点型实数初值为*realaveragetemp=*averagetemp为实数赋初值为*局部变量只用于单一的函数中。当函数调用时就被创建了函数返回之后这个变量就不存在了局部变量在函数内部(大括号内)声明。在下面的例子中mulam和temp是局部变量。DEFINEPROPERTY(cellviscosity,cell,thread){realmulamrealtemp=CT(cell,thread)if(temp>)mulam=eelseif(temp>)mulam=*tempelsemulam=returnmulam}全局变量在你的UDF源文件中是对所有的函数都起作用的。(调用一个UDF源文件可能会包括一系列的连接函数。)它们是在单一函数的外部定义的。全局变量一般是在预处理程序之后的文件开始处声明。如果全局变量在某一源代码文件中声明但是另一个源代码的某一文件需要用到它那么你必须在另一个文件中声明它是外部变量。外部变量的声明很简单你只需要在变量声明的最前面加上extern即可。如果有几个文件涉及到该变量最方便的处理方法就是在头文件(h)中加上extern的定义然后在所有的c文件中引用该头文件即可。只有一个c文件应该包括没有extern关键字的变量声明如下所示。注意:extern只用于编译过的UDF。例子:*fileah**包含外部定义的头文件*externrealvolume*fileac**调用头文件fileah中声明的volumn的C函数*#include"udfh"#include"fileah"realvolumeDEFINEADJUST(computevolume,domain){*计算某些区域volumn的代码*volume=}*filebc**调用头文件fileah中声明的volumn的另一个C函数*#include"udfh"#include"fileah"DEFINESOURCE(heatsource,c,t,ds,eqn){*用总数来计算每个单位体积的源项的代码**flieac的computevolum计算出的volume*realtotalsource=realsourcesource=totalsourcevolumereturnsource}static声明对于全局变量和局部变量的影响是不一样的。静态局部变量在函数调用返回之后该变量不会被破坏。静态全局变量则在定义该变量的c源文件之外对任何函数保持不可见。静态声明也可以用于函数使该函数只对定义它的c源文件保持可见。下面是静态全局变量声明的例子。注意:extern只用于编译过的UDF。例子:#include"udfh"staticrealabscoeff=*吸收系数*realsourceDEFINESOURCE(energysource,c,t,dS,eqn){intP=dSeqn=*abscoeff*SIGMASBC*pow(CT(c,t),)source=abscoeff*(*SIGMASBC*pow(CT(c,t),)CUDSI(c,t,P))returnsource}DEFINESOURCE(psource,c,t,dS,eqn){intP=dSeqn=abscoeffsource=abscoeff*(*SIGMASBC*pow(CT(c,t),)CUDSI(c,t,P))returnsource}C还允许你用结构和typedef创建自定义数据类型。下面是一个结构列表的定义。注意:typedef只用于编译过的UDF。例子:typedefstructlist{intarealbintc}mylist*mylist为类型结构列表*mylistx,y,z*x,y,z为类型结构列表*你可以通过强制转换将某一数据类型转换为另一种。强制由类型来表示其中的类型包括intfloat等等如下例所示:intx=realy=intz=x((int)y)*z=*函数是用完成一定任务的一系列语句。在定义该函数的同一源代码中这些任务可能对其它的函数有用也可能会被用于完成源文件以外的函数中。每个函数都包括一个函数名以及函数名之后的零行或多行语句其中有大括号括起来的函数主体可以完成所需要的任务。函数可以返回特定类型的数值。C函数通过数值来传递数据。函数有很多数据类型如realvoid等其相应的返回值就是该数据类型如果函数的类型是void就没有任何返回值。要确定定义UDF时所使用的DEFINE宏的数据类型你可以参阅udfh文件中关于宏的#define声明一节也可以参阅附录A的列表。!!C函数不能改变它们的声明但是可以改变这些声明所指向的变量。数组的定义格式为:名字数组元素个数C数组的下标是从零开始的。变量的数组可以具有不同的数据类型。inta,brealradiia=*变量a为一个一维数组*radii=*变量radii为一个一维数组*b=*变量b为一个二维数组*指针变量的数值是其它变量存储于内存中的地址值。C程序中指针变量的声明必须以*开头。指针广泛用于提取结构中存储的数据以及在多个函数中通过数据的地址传送数据。例如:int*ip本语句声明了一个指向整型变量的指针变量ip。此时你可以为指针变量分配一个地址值了。现在假定你要将某一地址分配给指针ip你可以用取地址符来实现。例如:ip=a就分配给指针ip变量a的地址值了。要得到指针变量所指向的单元的值你可以使用:*ip你还可以为指针ip所指向的变量赋值例如:*ip=将赋给指针ip所指向的变量。下面是使用指针的例子:inta=int*ipip=a*a返回了变量a的地址值*printf("contentofaddresspointedtobyip=dn",*ip)*ip=*a=*printf("nowa=dn",a)在上面的语句中整型变量赋初值为。然后为整型变量声明一个指针。然后整型变量a的地址值分配给指针ip。然后用*ip来输出指针ip所指向的值(该值为)。然后用*ip间接的给变量a赋值为。然后输出a的新值。指针还可以指向数组的起始地址在C中指针和数组具有紧密的联系。C函数可以通过指针进入和修改它们的自变量。在FLUENT中线程和域指针是UDF常用的自变量。当你在UDF中指定这些自变量时FLUENT解算器会自动将指针所指向的数据传送给UDF从而使你的函数可以存取解算器的数据(你不必声明作为自变量从解算器传送给UDF的指针)。例如某一传送给指定(由DEFINEPROFILE宏来定义的)自定义轮廓UDF的自变量是一个指向应用于边界条件的线程的指针。DEFINEPROFILE函数会存取线程指针所指向的数据。你可以使用控制语句如if,ifelse和循环来控制C程序中语句的执行顺序。控制语句决定了程序序列中下一步该执行的内容ifif语句是条件控制语句的一种。格式为:if(逻辑表达式){语句}其中逻辑表达式是判断条件语句是条件满足时所要执行的代码行。if(q!=){a=b=}ifelseifelse语句是另一种条件控制语句。格式为:if(逻辑表达式){语句}else{语句}如果逻辑表达式条件满足则执行第一个语句否则执行下面的语句。if(x<)y=xelse{x=xy=x}下面是等价的FORTRAN代码大家可以比较一下:IF(XLT)THENY=XELSEX=XY=XENDIFforfor循环是C程序最为基本的循环控制语句。它和FORTRAN中的do循环很类似。格式为:for(起点终点增量){语句}其中起点是在循环开始时执行的表达式终点是判断循环是否结束的逻辑表达式增量是循环迭代一次之后执行的表达式(通常是增量计数器)。*输出整数及它们的平方*inti,j,n=for(i=i<=ni){j=i*iprintf("ddn",i,j)}下面是等价的FORTRAN代码大家可以做一比较:INTEGERI,JN=DOI=,J=I*IWRITE(*,*)I,JENDDOC运算符是内部的C函数当它们对具体数值运算时会得到一个结果。常用的C运算符是算术运算符和逻辑运算符。下面是一些常用的算术运算符。=赋值加减*乘除取模增量减量注意:乘、除和取模运算的优先级要高于加、减运算。除法只取结果的整数部分。取模只取结果的余数部分。运算符是增量操作的速记符。下面是一些逻辑运算符。<小于<=小于或等于>大于>=大于或等于==等于!=不等于C当你书写UDF代码时你可以使用C编译器中包括的标准数学库和IO函数库。下面各节介绍了标准C库函数。标准C库函数可以在各种头文件中找到(如:globalh)。这些文件都被包含在udfh文件中。下面的三角函数都是计算变量x(只有一个还计算y)的三角函数值。函数和变量都是双精度实数变量。具体的意义大家应该都很清楚就不具体介绍了。doubleacos(doublex)返回x的反余弦函数doubleasin(doublex)返回x的反正弦函数doubleatan(doublex)返回x的反正切函数doubleatan(doublex,doubley)返回xy的反正切函数doublecos(doublex)返回x的余弦函数doublesin(doublex)返回x的正弦函数doubletan(doublex)返回x的正切函数doublecosh(doublex)返回x的双曲余弦函数doublesinh(doublex)返回x的双曲正弦函数doubletanh(doublex)返回x的双曲正切函数下面列表中左边是C函数右边是对应数学函数:xydoublesqrt(doublex)doublepow(doublex,doubley)xxdoubleexp(doublex)edoublelog(doublex)lnxdoublelog(doublex)logxdoublefabs(doublex)xdoubleceil(doublex)不小于x的最小整数doublefloor(doublex)不大于x的最大整数IOC中有大量的标准输入输出(IO)函数。在很多情况下这些函数在指定的文件中工作。下面是一些例子。FILE*fopen(char*filename,char*type)打开一个文件intfclose(FILE*fd)关闭一个文件intfprintf(FILE*fd,char*format,)格式化输出到一个文件intprintf(char*format,)输出到屏幕intfscanf(FILE*fd,char*format,)格式化读入一个文件函数fopen和fclose分别打开和关闭一个文件。函数fprintf以指定的格式写入文件函数fscanf以相同的方式从某一文件中将数据读入。函数printf是一般的输出函数。fd是一个文件指针它所指向的是包含所要打开文件的信息的C结构。除了fopen之外所有的函数都声明为整数这是因为该函数所返回的整数会告诉我们这个文件操作命令是否成功执行。在下面的例子中需要打开的数据文件的名字用双引号括起来。fopen中的选项r表明该文件是以可读形式打开的。fscan函数从fd所指向的文件中读入两个浮点数并将它们存储为f和f。关于C的标准输入输出函数其它更多的信息你可以查阅相关手册(如:)。FILE*fdfd=fopen("datatxt","r")*opensafilenameddatatxt*fscanf(fd,"f,f'',f,f)fclose(fd)#defineUDF解释程序支持宏置换的C预处理程序命令。当你使用#define宏置换命令C预处理程序(如cpp)执行了一个简单的置换并用替换文本替换宏中定义的每一个自变量。#definemacroreplacementtext如下面的宏置换命令:#defineRAD预处理程序会在UDF中所有的变量RAD出现的地方将RAD替换为。在你的函数中可能会有很多涉及到变量RAD的地方但是你只需要在宏命令中定义一次预处理程序会在所有的代码中执行替换操作。在下面这个例子中:#defineAREARECTANGLE(X,Y)((X)*(Y))你的UDF中所有的AREARECTANGLE(X,Y)都会被替换为(X)和(Y)的乘积。#includeUDF解释程序还支持文件包含的C前处理命令。当你使用#include包含一个文件时C前处理程序会将#includefilename行替换为文件名对应的文件内容。#include"filename"文件名对应的文件必须在当前目录中。只有udfh文件例外这是因为FLUENT解算器会自动将它读入。如下面的文件包含命令:#include"udfh"会将文件udfh包含进你的源代码中。FORTRAN很多简单的C函数和FORTRAN函数的子程序很相似例子如下:简单的C函数等价的FORTRAN函数intmyfunction(intx)INTEGERFUNCTIONMYFUNCTION(X){intx,y,zINTEGERX,Y,Zy=Y=z=xyZ=XYprintf("z=d",z)WRITE(*,)ZreturnzMYFUNCTION=Z}END

类似资料

该用户的其他资料

古诗探情.doc

初二,我来了.doc

[通知/申请]赣州银监分局及银行业金融机构重大金融突发事件报告制度.doc

[教学研究]九品往生一览表.doc

会计报表附注英文摘要.doc

职业精品

精彩专题

用户评论

0/200
    暂无评论
上传我的资料

精选资料

热门资料排行换一换

  • 团队沟通.ppt

  • 5800 2.3版程序.d…

  • 准提法文章汇总.doc

  • 租房合同.docx

  • 12世纪末威尼斯企图征服拜占庭帝…

  • 中国十大名花.ppt

  • 背部按摩手法详细图解.doc

  • 韩非子.doc

  • 中医精粹图解.pdf

  • 资料评价:

    / 17
    所需积分:0 立即下载

    意见
    反馈

    返回
    顶部