Fluent UDF 中文教程2

第二章.UDF的C语言基础
本章介绍了UDF的C语言基础
2.1引言
2.2注释你的C代码
2.3FLUENT中的C数据类型
2.4常数
2.6自定义数据类型
2.7强制转换
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语言的人都知道,注释在编写程序和调试程序等处理中是很重要的。注释的每一行以“/*”开始,后面的是注释的文本行,然后是“*/”结尾
如:/* This is how I put a comment in my C program  */
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如下:#define WALL_ID 5
#define YMIN 0.0
#define YMAX 0.4064
2.5变量
变量或者对象保存在可以存储数值的内存中。每一个变量都有类型、名字和值。变量在使用之前必须在C程序中声明。这样,计算机才会提前知道应该如何分配给相应变量的存储类型。
2.5.1声明变量
变量声明的结构如下:首先是数据类型,然后是具有相应类型的一个或多个变量的名字。变量声明时可以给定初值,最后面用分号结尾。变量名的头字母必须是C所允许的合法字符,变量名字中可以有字母,数字和下划线。需要注意的是,在C程序中,字母是区分大小写的。下面是变量声明的例子:
int n;                  /*声明变量n为整型*/
int i1, i2;                /*声明变量i1i2为整型*/
float tmax = 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;
  else if (temp > 286.)
    mu_lam = 143.2135 - 0.49725 * temp;
  else
    mu_lam = 1.;
  return mu_lam;
}
2.5.3全局变量
全局变量在你的UDF源文件中是对所有的函数都起作用的。(调用一个UDF源文件可能会包括一系列的连接函数。)它们是在单一函数的外部定义的。全局变量一般是在预处理程序之后的文件开始处声明。
2.5.4外部变量
如果全局变量在某一源代码文件中声明,但是另一个源代码的某一文件需要用到它,那么
你必须在另一个文件中声明它是外部变量。外部变量的声明很简单,你只需要在变量声明的最前面加上extern即可。如果有几个文件涉及到该变量,最方便的处理方法就是在头文件(.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)
{
  /*计算某些区域volumn的代码*/
  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声明对于全局变量和局部变量的影响是不一样的。静态局部变量在函数调用返回之后,该变量不会被破坏。静态全局变量则在定义该变量的.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 = ....;
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));
return source;
}
DEFINE_SOURCE(p1_source, c, t, dS, eqn)
{
int P1 = ...;
dS[eqn] = -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创建自定义数据类型。下面是一个结构列表的定义。注意:typedef只用于编译过的UDF。
例子:
typedef struct list
{
    int 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函数
函数是用完成一定任务的一系列语句。在定义该函数的同一源代码中,这些任务可能对其它的函数有用,也可能会被用于完成源文件以外的函数中。每个函数都包括一个函数名以及函数名之后的零行或多行语句,其中有大括号括起来的函数主体可以完成所需要的任务。函数可以返回特定类型的数值。C函数通过数值来传递数据。
函数有很多数据类型,如real,void等,其相应的返回值就是该数据类型,如果函数的类型
是void就没有任何返回值。要确定定义UDF时所使用的DEFINE宏的数据类型你可以参阅udf.件中关于宏的#define声明一节,也可以参阅附录A的列表。
!! C函数不能改变它们的声明,但是可以改变这些声明所指向的变量。
2.9 数组
数组的定义格式为:名字[数组元素个数],C数组的下标是从零开始的。变量的数组可以具有不同的数据类型。
例子
int a[10], b[10][10];
real radii[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所指向的变量。下面是使用指针的例子:
int a = 1;
int *ip;
ip = &a;                /* &a返回了变量a的地址值*/
printf("content of address pointed to by ip = %d\n", *ip);
*ip = 4;                /* a = 4  */

本文发布于:2024-09-21 11:11:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/387393.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:变量   函数   声明   定义   文件
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议