您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > Fluent-UDF-第二章--C语言基础
第二章.UDF的C语言基础第二章.UDF的C语言基础本章介绍了UDF的C语言基础2.1引言2.2注释你的C代码2.3FLUENT中的C数据类型2.4常数2.5变量2.6自定义数据类型2.7强制转换2.8函数2.9数组2.10指针2.11声明2.12常用C操作符2.13C库函数2.14用#define实现宏置换2.15用#include实现文件包含2.16与FORTRAN比较2.1引言本章介绍了C语言的一些基本信息,这些信息对处理FLUENT的UDF很有帮助。本章首先假定你有一些编程经验而不是C语言的初级介绍。本章不会介绍诸如while-do循环,联合,递归,结构以及读写文件的基础知识。如果你对C语言不熟悉可以参阅C语言的相关书籍。2.2注释你的C代码熟悉C语言的人都知道,注释在编写程序和调试程序等处理中是很重要的。注释的每一行以“/*”开始,后面的是注释的文本行,然后是“*/”结尾如:/*ThisishowIputacommentinmyCprogram*/第二章.UDF的C语言基础2.3FLUENT的C数据类型FLUENT的UDF解释程序支持下面的C数据类型:Int:整型Long:长整型Real:实数Float:浮点型Double:双精度Char:字符型注意:UDF解释函数在单精度算法中定义real类型为float型,在双精度算法宏定义real为double型。因为解释函数自动作如此分配,所以使用在UDF中声明所有的float和double数据变量时使用real数据类型是很好的编程习惯。2.4常数常数是表达式中所使用的绝对值,在C程序中用语句#define来定义。昀简单的常数是十进制整数(如:0,1,2)包含小数点或者包含字母e的十进制数被看成浮点常数。按惯例,常数的声明一般都使用大写字母。例如,你可以设定区域的ID或者定义YMIN和YMAX如下:#defineWALL_ID5#defineYMIN0.0#defineYMAX0.40642.5变量变量或者对象保存在可以存储数值的内存中。每一个变量都有类型、名字和值。变量在使用之前必须在C程序中声明。这样,计算机才会提前知道应该如何分配给相应变量的存储类型。2.5.1声明变量变量声明的结构如下:首先是数据类型,然后是具有相应类型的一个或多个变量的名字。变量声明时可以给定初值,昀后面用分号结尾。变量名的头字母必须是C所允许的合法字符,变量名字中可以有字母,数字和下划线。需要注意的是,在C程序中,字母是区分大小写的。下面是变量声明的例子:intn;/*声明变量n为整型*/inti1,i2;/*声明变量i1和i2为整型*/第二章.UDF的C语言基础floattmax=0.;/*tmax为浮点型实数,初值为0*/realaverage_temp=0.0;/*average_temp为实数,赋初值为0.1*/2.5.2局部变量局部变量只用于单一的函数中。当函数调用时,就被创建了,函数返回之后,这个变量就不存在了,局部变量在函数内部(大括号内)声明。在下面的例子中,mu_lam和temp是局部变量。DEFINE_PROPERTY(cell_viscosity,cell,thread){realmu_lam;realtemp=C_T(cell,thread);if(temp288.)mu_lam=5.5e-3;elseif(temp286.)mu_lam=143.2135-0.49725*temp;elsemu_lam=1.;returnmu_lam;}2.5.3全局变量全局变量在你的UDF源文件中是对所有的函数都起作用的。(调用一个UDF源文件可能会包括一系列的连接函数。)它们是在单一函数的外部定义的。全局变量一般是在预处理程序之后的文件开始处声明。2.5.4外部变量如果全局变量在某一源代码文件中声明,但是另一个源代码的某一文件需要用到它,那么你必须在另一个文件中声明它是外部变量。外部变量的声明很简单,你只需要在变量声明的昀前面加上extern即可。如果有几个文件涉及到该变量,昀方便的处理方法就是在头文件(.h)中加上extern的定义,然后在所有的.c文第二章.UDF的C语言基础件中引用该头文件即可。只有一个.c文件应该包括没有extern关键字的变量声明,如下所示。注意:extern只用于编译过的UDF。例子:/*filea.h*//*包含外部定义的头文件*/externrealvolume;/*filea.c*//*调用头文件filea.h中声明的volumn的C函数*/#includeudf.h#includefilea.hrealvolume;DEFINE_ADJUST(compute_volume,domain){/*计算某些区域volumn的代码*/volume=....}/*fileb.c*//*调用头文件filea.h中声明的volumn的另一个C函数*/#includeudf.h#includefilea.hDEFINE_SOURCE(heat_source,c,t,ds,eqn){/*用总数来计算每个单位体积的源项的代码*//*fliea.c的compute_volum计算出的volume*/realtotal_source=...;realsource;source=total_source/volume;returnsource;}第二章.UDF的C语言基础2.5.5静态变量static声明对于全局变量和局部变量的影响是不一样的。静态局部变量在函数调用返回之后,该变量不会被破坏。静态全局变量则在定义该变量的.c源文件之外对任何函数保持不可见。静态声明也可以用于函数,使该函数只对定义它的.c源文件保持可见。下面是静态全局变量声明的例子。注意:extern只用于编译过的UDF。例子:#includeudf.hstaticrealabs_coeff=1.0;/*吸收系数*/realsource;DEFINE_SOURCE(energy_source,c,t,dS,eqn){intP1=....;dS[eqn]=-16.*abs_coeff*SIGMA_SBC*pow(C_T(c,t),3.);source=-abs_coeff*(4.*SIGMA_SBC*pow(C_T(c,t),4.)-C_UDSI(c,t,P1));returnsource;}DEFINE_SOURCE(p1_source,c,t,dS,eqn){intP1=...;dS[eqn]=-abs_coeff;source=abs_coeff*(4.*SIGMA_SBC*pow(C_T(c,t),4.)-C_UDSI(c,t,P1));returnsource;}2.6自定义数据类型C还允许你用结构和typedef创建自定义数据类型。下面是一个结构列表的定义。注意:typedef只用于编译过的UDF。例子:typedefstructlist{第二章.UDF的C语言基础inta;realb;intc;}mylist;/*mylist为类型结构列表*/mylistx,y,z;/*x,y,z为类型结构列表*/2.7强制转换你可以通过强制转换将某一数据类型转换为另一种。强制由类型来表示,其中的类型包括int,float等等,如下例所示:intx=1;realy=3.14159;intz=x+((int)y);/*z=4*/2.8函数函数是用完成一定任务的一系列语句。在定义该函数的同一源代码中,这些任务可能对其它的函数有用,也可能会被用于完成源文件以外的函数中。每个函数都包括一个函数名以及函数名之后的零行或多行语句,其中有大括号括起来的函数主体可以完成所需要的任务。函数可以返回特定类型的数值。C函数通过数值来传递数据。函数有很多数据类型,如real,void等,其相应的返回值就是该数据类型,如果函数的类型时void就没有任何返回值。要确定定义UDF时所使用的DEFINE宏的数据类型你可以参阅udf.h文件中关于宏的#define声明一节,也可以参阅附录A的列表。!!C函数不能改变它们的声明,但是可以改变这些声明所指向的变量。2.9数组数组的定义格式为:名字[数组元素个数],C数组的下标是从零开始的。变量的数组可以具有不同的数据类型。例子inta[10],b[10][10];第二章.UDF的C语言基础realradii[5];a[0]=1;/*变量a为一个一维数组*/radii[4]=3.14159265;/*变量radii为一个一维数组*/b[10][10]=4;/*变量b为一个二维数组*/2.10指针指针变量的数值是其它变量存储于内存中的地址值。C程序中指针变量的声明必须以*开头。指针广泛用于提取结构中存储的数据,以及在多个函数中通过数据的地址传送数据。例如:int*ip;本语句声明了一个指向整型变量的指针变量ip。此时你可以为指针变量分配一个地址值了。现在假定你要将某一地址分配给指针ip,你可以用取地址符&来实现。例如:ip=&a;就分配给指针ip变量a的地址值了。要得到指针变量所指向的单元的值,你可以使用:*ip你还可以为指针ip所指向的变量赋值,例如:*ip=4;将4赋给指针ip所指向的变量。下面是使用指针的例子:inta=1;int*ip;ip=&a;/*&a返回了变量a的地址值*/第二章.UDF的C语言基础printf(contentofaddresspointedtobyip=%d\n,*ip);*ip=4;/*a=4*/printf(nowa=%d\n,a);在上面的语句中,整型变量赋初值为1。然后为整型变量声明一个指针。然后整型变量a的地址值分配给指针ip。然后用*ip来输出指针ip所指向的值(该值为1)。然后用*ip间接的给变量a赋值为4。然后输出a的新值。指针还可以指向数组的起始地址,在C中指针和数组具有紧密的联系。2.10.1作为函数自变量的指针C函数可以通过指针进入和修改它们的自变量。在FLUENT中,线程和域指针是UDF常用的自变量。当你在UDF中指定这些自变量时,FLUENT解算器会自动将指针所指向的数据传送给UDF,从而使你的函数可以存取解算器的数据(你不必声明作为自变量从解算器传送给UDF的指针)。例如,某一传送给指定(由DEFINE_PROFILE宏来定义的)自定义轮廓UDF的自变量是一个指向应用于边界条件的线程的指针。DEFINE_PROFILE函数会存取线程指针所指向的数据。2.11控制语句你可以使用控制语句,如if,if-else和循环来控制C程序中语句的执行顺序。控制语句决定了程序序列中下一步该执行的内容2.11.1if语句if语句是条件控制语句的一种。格式为:if(逻辑表达式){语句}其中逻辑表达式是判断条件,语句是条件满足时所要执行的代码行。例子第二章.UDF的C语言基础if(q!=1){a=0;b=1;}2.11.2if-else语句if-else语句是另一种条件控制语句。格式为:if(逻辑表达式){语句}else{语句}如果逻辑表达式条件满足,则执行第一个语句,否则执行下面的语句。例子if(x0.)y=x/50.;else{x=-x;y=x/25.;}下面是等价的FORTRAN代码,大家可以比较一下:IF(X.LT.0.)THENY=X/50.ELSEX=-XY=X/25.ENDIF2.11.3for循环第二章.UDF的C语言基础for循环是C程序昀为基本的循环控制语句。它和FORTRAN中的do循环很类似。格式为:for(起点;终点;增量){语句}其中起点是在循环开始时执行的表达式;终点是判断循环是否结束的逻辑表达式;增量是循环迭代一次之后执行的表达式(通常是增量计数器)。例子:/*输出整数1-10及它们的平方*/inti,j,n=10;for(i=1;i=n;i++){j=i*i;printf(%d%d\n,i,j);}下面是等价的FORTRAN代码,大家可以做一比较:INTEGERI,JN=10DOI=1,10J=I*IWRITE
本文标题:Fluent-UDF-第二章--C语言基础
链接地址:https://www.777doc.com/doc-2983920 .html