UDFudf中的C语言.docx

上传人:1513****116 文档编号:96537980 上传时间:2023-12-18 格式:DOCX 页数:12 大小:36.61KB
返回 下载 相关 举报
UDFudf中的C语言.docx_第1页
第1页 / 共12页
UDFudf中的C语言.docx_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《UDFudf中的C语言.docx》由会员分享,可在线阅读,更多相关《UDFudf中的C语言.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、其次章.UDF 的 C 语言根底本章介绍了 UDF 的 C 语言根底2.1 引言2.2 注释你的C 代码2.3 FLUENT 中的C 数据类型2.4 常数2.5 变量2.6 自定义数据类型2.7 强制转换2.8 函数2.9 数组2.10 指针2.11 声明2.12 常用C 操作符2.13 C 库函数2.14 用#define 实现宏置换2.15 用#include 实现文件包含2.16 与 FORTRAN 比较2.1 引言本章介绍了C 语言的一些根本信息,这些信息对处理 FLUENT 的UDF 很有帮助。本章首先假定你有一些编程阅历而不是 C 语言的初级介绍。本章不会介绍诸如 while-do

2、 循环, 联合,递归,构造以及读写文件的根底学问。假设你对C 语言不生疏可以参阅 C 语言的相关书籍。2.2 注释你的 C 代码生疏 C 语言的人都知道,注释在编写程序和调试程序等处理中是很重要的。注释的每一行以“/*”开头,后面的是注释的文本行,然后是“*/”结尾如:/* This is how I put a comment in my C program*/2.3 FLUENT 的 C 数据类型FLUENT 的UDF 解释程序支持下面的C 数据类型: Int:整型Long:长整型Real:实数Float:浮点型Double:双精度Char:字符型留意:UDF 解释函数在单精度算法中定义r

3、eal 类型为float 型,在双精度算法宏定义real 为double 型。由于解释函数自动作如此安排,所以使用在 UDF 中声明全部的 float 和 double 数据变量时使用real 数据类型是很好的编程习惯。2.4 常数常数是表达式中所使用确实定值,在C 程序中用语句#define 来定义。最简洁的常数是十进制整数如:0,1,2包含小数点或者包含字母e 的十进制数被看成浮点常数。按惯例,常数的声明一般都使用大写字母。例如,你可以设定区域的 ID 或者定义YMIN 和 YMAX 如下:#define WALL_ID 5#define YMIN 0.0#define YMAX 0.40

4、642.5 变量变量或者对象保存在可以存储数值的内存中。每一个变量都有类型、名字和值。变量在使用之前必需在 C 程序中声明。这样,计算机才会提前知道应当如何安排给相应变量的存储类型。2.5.1 声明变量变量声明的构造如下:首先是数据类型,然后是具有相应类型的一个或多个变量的名字。变量声明时可以给定初值,最终面用分号结尾。变量名的头字母必需是 C 所允许的合法字符,变量名字中可以有字母,数字和下划线。需要留意的是,在 C 程序中,字母是区分大小写的。下面是变量声明的例子:int n;/*声明变量 n 为整型*/int i1, i2;/*声明变量 i1 和 i2 为整型*/float tmax =

5、 0.;/* tmax 为浮点型实数,初值为 0 */real average_temp = 0.0;/* average_temp 为实数,赋初值为 0.1*/2.5.2 局部变量局部变量只用于单一的函数中。当函数调用时,就被创立了,函数返回之后,这个变量就不存在了,局部变量在函数内部大括号内声明。在下面的例子中,mu_lam 和 temp 是局部变量。DEFINE_PROPERTY(cell_viscosity, cell, thread)real mu_lam;real temp = C_T(cell, thread);if (temp 288.) mu_lam = 5.5e-3;els

6、e if (temp 286.)mu_lam = 143.2135 - 0.49725 * temp; elsemu_lam = 1.;return mu_lam;2.5.3 全局变量全局变量在你的UDF 源文件中是对全部的函数都起作用的。调用一个 UDF 源文件可能会包括一系列的连接函数。它们是在单一函数的外部定义的。全局变量一般是在预处理程序之后的文件开头处声明。2.5.4 外部变量假设全局变量在某一源代码文件中声明,但是另一个源代码的某一文件需要用到它,那么你必需在另一个文件中声明它是外部变量。外部变量的声明很简洁,你只需要在变量声明的最前面加上extern 即可。假设有几个文件涉及到该

7、变量,最便利的处理方法就是在头文件.h中加上extern 的定义,然后在全部的.c 文件中引用该头文件即可。只有一个.c 文件应当包括没有extern 关键字的变量声明,如下所示。留意:extern 只用于编译过的UDF。例子:/* filea.h*/*包含外部定义的头文件*/ extern real volume;/* filea.c*/*调用头文件filea.h 中声明的volumn 的 C 函数*/ #include “udf.h“#include “filea.h“ real volume;DEFINE_ADJUST(compute_volume, domain)/*计算某些区域vol

8、umn 的代码*/ volume = ./* fileb.c*/*调用头文件filea.h 中声明的volumn 的另一个C 函数*/ #include “udf.h“#include “filea.h“ DEFINE_SOURCE(heat_source,c,t,ds,eqn)/* 用总数来计算每个单位体积的源项的代码*/*fliea.c 的 compute_volum 计算出的 volume*/ real total_source = .;real source;source = total_source/volume;return source;2.5.5 静态变量static 声明对于

9、全局变量和局部变量的影响是不一样的。静态局部变量在函数调用返回之后,该变量不会被破坏。静态全局变量则在定义该变量的.c 源文件之外对任何函数保持不行见。静态声明也可以用于函数,使该函数只对定义它的.c 源文件保持可见。下面是静态全局变量声明的例子。留意:extern 只用于编译过的UDF。例子:#include “udf.h“static real abs_coeff = 1.0;/* 吸取系数*/ real source;DEFINE_SOURCE(energy_source, c, t, dS, eqn)int P1 =;dSeqn = -16.* abs_coeff * SIGMA_SB

10、C * pow(C_T(c,t),3.);source =-abs_coeff *(4.* SIGMA_SBC * pow(C_T(c,t),4.) - C_UDSI(c,t,P1); return source;DEFINE_SOURCE(p1_source, c, t, dS, eqn)int P1 = .;dSeqn = -abs_coeff;source = abs_coeff *(4.* SIGMA_SBC * pow(C_T(c,t),4.) - C_UDSI(c,t,P1); return source;2.6 自定义数据类型C 还允许你用构造和typedef创立自定义数据类型。

11、下面是一个构造列表的定义。留意:typedef只用于编译过的UDF。例子:typedef struct listint a; real b; int c;mylist;/* mylist 为类型构造列表*/mylist x,y,z;/* x,y,z 为类型构造列表*/2.7 强制转换你可以通过强制转换将某一数据类型转换为另一种。强制由类型来表示,其中的类型包括 int,float 等等,如下例所示:int x = 1;real y = 3.14159;int z = x+(int) y);/* z = 4 */2.8 函数函数是用完成肯定任务的一系列语句。在定义该函数的同一源代码中,这些任务可

12、能对 其它的函数有用,也可能会被用于完成源文件以外的函数中。每个函数都包括一个函数名以 及函数名之后的零行或多行语句,其中有大括号括起来的函数主体可以完成所需要的任务。函数可以返回特定类型的数值。C 函数通过数值来传递数据。函数有很多数据类型,如real,void 等,其相应的返回值就是该数据类型,假设函数的类型是void 就没有任何返回值。要确定定义 UDF 时所使用的DEFINE 宏的数据类型你可以参阅 udf.h 文件中关于宏的#define 声明一节,也可以参阅附录A 的列表。! C 函数不能转变它们的声明,但是可以转变这些声明所指向的变量。2.9 数组数组的定义格式为:名字数组元素个

13、数,C 数组的下标是从零开头的。变量的数组可以具有不同的数据类型。例子int a10, b1010;real radii5;a0 = 1;/* 变量 a 为一个一维数组*/ radii4 = 3.14159265;/*变量 radii 为一个一维数组*/ b1010 = 4;/*变量 b 为一个二维数组*/2.10 指针指针变量的数值是其它变量存储于内存中的地址值。C 程序中指针变量的声明必需以* 开头。指针广泛用于提取构造中存储的数据,以及在多个函数中通过数据的地址传送数据。例如:int *ip;本语句声明白一个指向整型变量的指针变量ip。此时你可以为指针变量安排一个地址值了。现在假定你要将

14、某一地址安排给指针ip,你可以用取地址符&来实现。例如:ip = &a;就安排给指针ip 变量a 的地址值了。要得到指针变量所指向的单元的值,你可以使用:*ip你还可以为指针ip 所指向的变量赋值,例如:*ip = 4;将 4 赋给指针ip 所指向的变量。下面是使用指针的例子: int a = 1;int *ip;ip = &a;/* &a 返回了变量a 的地址值*/ printf(“content of address pointed to by ip = %dn“, *ip);*ip = 4;/* a = 4*/printf(“now a = %dn“, a);在上面的语句中,整型变量赋初

15、值为1。然后为整型变量声明一个指针。然后整型变量a 的地址值安排给指针ip。然后用*ip 来输出指针ip 所指向的值该值为 1。然后用*ip 间接的给变量a 赋值为 4。然后输出a 的值。指针还可以指向数组的起始地址,在C 中指针和数组具有严密的联系。2.10.1 作为函数自变量的指针C 函数可以通过指针进入和修改它们的自变量。在FLUENT 中,线程和域指针是UDF 常用的自变量。当你在UDF 中指定这些自变量时, FLUENT 解算器会自动将指针所指向的数据传送给UDF,从而使你的函数可以存取解算器的数据你不必声明作为自变量从解 算器传送给UDF 的指针。例如,某一传送给指定由DEFINE

16、_PROFILE 宏来定义的 自定义轮廓UDF 的自变量是一个指向应用于边界条件的线程的指针。DEFINE_PROFILE 函数会存取线程指针所指向的数据。2.11 掌握语句你可以使用掌握语句,如if, if-else 和循环来掌握C 程序中语句的执行挨次。掌握语句打算了程序序列中下一步该执行的内容2.11.1 if 语句if 语句是条件掌握语句的一种。格式为: if (规律表达式)语句其中规律表达式是推断条件,语句是条件满足时所要执行的代码行。例子if (q != 1)a = 0; b = 1;2.11.2 if-else 语句if-else 语句是另一种条件掌握语句。格式为: if (规律

17、表达式)语句 else语句假设规律表达式条件满足,则执行第一个语句,否则执行下面的语句。例子if (x 0.)y = x/50.; elsex = -x;y = x/25.;下面是等价的FORTRAN 代码,大家可以比较一下:IF (X.LT.0.) THEN Y = X/50.ELSEX = -XY = X/25.ENDIF2.11.3 for 循环for 循环是C 程序最为根本的循环掌握语句。它和FORTRAN 中的do 循环很类似。格式为:for (起点;终点;增量)语句其中起点是在循环开头时执行的表达式;终点是推断循环是否完毕的规律表达式;增量是循环迭代一次之后执行的表达式通常是增量计

18、数器。例子:/* 输出整数 1-10 及它们的平方*/ int i, j, n = 10;for (i = 1 ; i = n ; i+)j = i*i;printf(“%d %dn“,i,j);下面是等价的FORTRAN 代码,大家可以做一比较:INTEGER I,J N = 10DO I = 1,10 J = I*IWRITE (*,*) I,J ENDDO2.12 常用的 C 运算符运算符是内部的C 函数,当它们对具体数值运算时会得到一个结果。常用的C 运算符是算术运算符和规律运算符。2.12.1 算术运算符下面是一些常用的算术运算符。=赋值+加-减*乘/除%取模+ 增量- 减量留意:乘

19、、除和取模运算的优先级要高于加、减运算。除法只取结果的整数局部。取模只取结果的余数局部。+运算符是增量操作的速记符。2.12.2 规律运算符下面是一些规律运算符。小于大于=大于或等于=等于!=不等于2.13 C 库函数当你书写UDF 代码时,你可以使用C 编译器中包括的标准数学库和I/O 函数库。下面各节介绍了标准C 库函数。标准C 库函数可以在各种头文件中找到如:global.h。这些文件都被包含在udf.h 文件中。2.13.1 三角函数下面的三角函数都是计算变量x只有一个还计算y的三角函数值。函数和变量都是双精度实数变量。具体的意义大家应当都很清楚,就不具体介绍了。double acos

20、 (double x);返回 x 的反余弦函数double asin (double x);返回 x 的反正弦函数double atan (double x);返回 x 的反正切函数double atan2 (double x, double y); 返回 x/y 的反正切函数double cos (double x);返回 x 的余弦函数double sin (double x);返回 x 的正弦函数double tan (double x);返回 x 的正切函数double cosh (double x);返回 x 的双曲余弦函数double sinh (double x);返回 x 的双

21、曲正弦函数double tanh (double x);返回 x 的双曲正切函数2.13.2 各种数学函数下面列表中,左边是C 函数,右边是对应数学函数:double sqrt (double x);xdouble pow(double x, double y);x ydouble exp (double x);double log (double x);e xln(x)double log10 (double x);log10(x)double fabs (double x);xdouble ceil (double x);不小于x 的最小整数double floor (double x);

22、不大于x 的最大整数2.13.3 标准 I/O 函数C 中有大量的标准输入输出I/O函数。在很多状况下,这些函数在指定的文件中工作。下面是一些例子。FILE *fopen(char *filename, char *type); 翻开一个文件int fclose(FILE *fd);关闭一个文件int fprintf(FILE *fd, char *format, .);格式化输出到一个文件int printf(char *format, .);输出到屏幕int fscanf(FILE *fd, char *format, .);格式化读入一个文件函数fopen和fclose分别翻开和关闭一个

23、文件。函数fprintf 以指定的格式写入文件,函数fscanf 以一样的方式从某一文件中将数据读入。函数 printf 是一般的输出函数。fd 是一个文件指针, 它所指向的是包含所要翻开文件的信息的C 构造。除了fopen 之外全部的函数都声明为整数, 这是由于该函数所返回的整数会告知我们这个文件操作命令是否成功执行。在下面的例子中,需要翻开的数据文件的名字用双引号括起来。fopen 中的选项r 说明该文件是以可读形式翻开的。fscan 函数从fd 所指向的文件中读入两个浮点数并将它们存储为f1 和 f2。关于C 的标准输入输出函数其它更多的信息,你可以查阅相关手册如:2。例子:FILE *

24、fd;fd = fopen(“data.txt“,“r“);/*opens a file named data.txt*/ fscanf(fd, “%f ,%f”, &f1, &f2);fclose(fd);2.14 用#define 实现宏置换UDF 解释程序支持宏置换的C 预处理程序命令。当你使用#define 宏置换命令,C 预处理程序如,cpp执行了一个简洁的置换,并用替换文本替换宏中定义的每一个自变量。#define macro replacement-text如下面的宏置换命令:#define RAD 1.2345预处理程序会在UDF 中全部的变量RAD 消灭的地方将RAD 替换为

25、 1.2345。在你的函数中可能会有很多涉及到变量RAD 的地方,但是你只需要在宏命令中定义一次,预处理程序会在全部的代码中执行替换操作。在下面这个例子中:#define AREA_RECTANGLE(X,Y) (X)*(Y)你的UDF 中全部的AREA_RECTANGLE(X,Y)都会被替换为(X)和(Y)的乘积。2.15 用#include 实现文件包含UDF 解释程序还支持文件包含的C 前处理命令。当你使用#include 包含一个文件时,C 前处理程序会将#include filename 行替换为文件名对应的文件内容。#include “ filename “文件名对应的文件必需在当

26、前名目中。只有udf.h 文件例外,这是由于 FLUENT 解算器会自动将它读入。如下面的文件包含命令:#include “udf.h“会将文件udf.h 包含进你的源代码中。2.16 与 FORTRAN 的比较很多简洁的C 函数和FORTRAN 函数的子程序很相像,例子如下:简洁的C 函数等价的FORTRAN 函数int myfunction(int x) INTEGER FUNCTION MYFUNCTION(X)int x,y,z;INTEGER X,Y,Zy = 11;Y = 11z = x+y;Z = X+Yprintf(“z = %d“,z);WRITE (*,100) Zreturn z;MYFUNCTION = ZEND

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁