Fluent UDF【4】:C语言

Fluent UDF利用的是C语言,本文简单介绍在UDF中经常会用到的C语言常识。
本文部分内容来自UDF手册。

1 C语言中的注释

C语言中的注释利用/*及*/来实现。例如:

/*这是一个注释*/

注释也可以跨行实现,如:

/*这是一个
跨行注释*/

注意:在编写UDF的过程中,不能把DEFINE宏(如DEFINE_PROFILE)放置在注释中,否则会引起编译错误

2 基本数据类型

Fluent UDF解释器支持的标准C数据类型包括:

  • int。整形,存储形如1,2,3之类的整数。
  • long。长整形。存储数据与int类似,但范围更广。
  • float。浮点型。存储小数,如1.234等
  • double。双精度浮点型。与float类似。
  • char。字符型,如'a','b','c'等。
    Fluent UDF中还有real型,其实这是Fluent自定义的数据类型,在双精度求解器中,real类型与double类型相同,而在单精度求解器中,real类型等同于float类型。UDF自动进行转换,因此在需要浮点数时,可以全部采用real类型。

3 常数

在C语言中可以利用#define来定义常数。需要注意的是,定义为常数类型后,该变量的值不能改变。如:

#define WALL_ID 5
#define YMIN 0.0
#define YMAX 0.4

这样定义完毕后,WALL_ID的值不能再发生改变,因此如下的语句会引发编译错误:

WALL_ID = WALL_ID +1 ;

4 变量

变量用于存储数据。所有变量都包含类型、名称以及值,有时候还包含存储标记(如静态变量和外部变量)。C语言中所有的变量在使用之前都必须声明,这样C编译器才会知道该如何为此变量分配内存。

4.1 全局变量和局部变量

C语言中的全局变量定义在函数的外部,该变量可以被源文件中所有的函数引用。全局变量如果未被声明为静态变量的话,还可以被外部函数引用。如下例中的全局变量声明:

#include "udf.h"
real volume; /*此处定义的是全局变量*/
DEFINE_ADJUST(vol,domain)
{/*此处可以访问变量volume*/
}

局部变量一般定义在函数体内,其只在函数体内起作用,在函数体外无法被访问到。如下程序中的局部变量定义。

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;elsemu_lam = 1.;return mu_lam;
}

4.2 外部变量

当在某个源文件中定义了一个未加static的全局变量后,若想在另一个源文件中调用此变量,此时可以使用外部变量声明来实现。采用如下声明:

extern real volume;

注意:extern声明只能用于编译型UDF中。
以下是一个利用extern的案例。
假设在源文件file1.c中定义了全局变量:

#include "udf.h"
real volume;
DEFINE_ADJUST(compute_volume, domain)
{volume = ....
}

若其他的的源文件想要利用此全局变量volume, 此时可以创建头文件,并将变量volume声明为extern变量,如创建头文件extfile.h,写入内容:

extern real volume;

之后就可以在其他的源文件中使用此变量volume了,如在源文件file2.c中:

#include "udf.h"
#include "extfile.h"
DEFINE_SOURCE(heat_source,c,t,ds,eqn)
{real total_source = ...;real source;source = total_source/volume;return source;
}

温馨提示:外部变量使用起来很麻烦也很容易出错,如果对其不甚了解的话,建议不要使用。

4.3 静态变量

静态变量(声明时添加static关键字)在用于局部变量或全局变量时具有不同的作用。局部变量被声明为static时,当函数返回后变量并不销毁,变量的值依旧被保留。
全局变量被声明为static时,该变量能够被此源文件中的所有函数调用,但不能被其他源文件中的函数调用。实际上是变量被隐藏了。
例如在文件mysource.c中有如下代码:

#include "udf.h"
static real abs_coeff = 1.0; /*静态全局变量*//* 此变量只能被本文件中的其他函数调用 */DEFINE_SOURCE(energy_source, c, t, dS, eqn)
{real source; /* 局部变量*/int P1 = ....; /* 局部变量*/
/*变量只能被当前函数调用,但在函数返回时变量并不释放 */dS[eqn] = -16.* abs_coeff;source =-abs_coeff *(4.* SIGMA_SBC );return source;
}DEFINE_SOURCE(p1_source, c, t, dS, eqn)
{real source;int P1 = ...;dS[eqn] = -abs_coeff;source = abs_coeff *(4.* SIGMA_SBC);return source;
}

更多关于static的描述可参见文章[www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html] (www.cnblogs.com/stoneJin/archive/2011/09/21/2183313.html)
温馨提示:与全局变量类似,静态变量也尽量少用,容易造成不必要的麻烦。

5 用户自定义数据类型

C语言允许用户自己定义数据类型,通过使用结构体及typedef关键字。如定义类型:

typedef struct list
{int a;real b;int c;
}mylist;
mylist x,y,z;

上例定义了一个结构体类型mylist,并定义了三个结构体变量x,y,z。

6 强制转换

在C语言中,有时需要对类型进行强制转换,如将浮点型强制转换为整形,如下例中。

int x =1;
real y=3.1415926;
int z=x+(int)y;

计算完毕后,z=4。

7 函数

C语言中的函数执行独立的任务。函数能够被同一源文件中的其他函数调用,也可以由源文件之外的函数调用。
函数定义包含函数名以及被传递给函数的零个或多个参数列表。函数包含一个包含在大括号内的主体,主体中包含执行任务的指令。 函数可以返回特定类型的值。
函数返回特定数据类型的值(例如,实数),如果类型为void,则不返回任何值。 要确定DEFINE宏的返回数据类型,可查看udf.h文件中宏的相应#define语句。

8 数组

C语言中数组变量定义为name[size],其中name为数组变量的名称,size为数组中存储的单元数量。C语言中数组索引从0开始。

int a[10], b[10][10];
/*a
real rad[5];
a[0] = 1;
rad[4] = 3.14159265;
b[10][10] = 4;

9 指针

指针是一种存储变量内存地址的变量。换句话说,指针是一个变量,这个变量指向另外一个变量的内存地址。指针变量的声明:

int *ip;/*定义指针变量ip*/

定义了指针变量后,可以利用取址运算符将其他变量的地址赋予指针变量,如:

int *ip;
ip =&a;

也可以为指针变量赋值,如:

*ip =4;

当指针作为函数的参数,此时为传址调用,在函数体内修改指针参数的值,会改变调用函数时传递的参数的值。此功能可以实现一个函数返回多个值。
如下的C程序:

#include <stdio.h>
int add(int *a,int b)
{int sum = 0;sum = *a + b;*a = 5;return sum;
}int main() {int *ip;int a = 1;int b = 2;int sum = 0;ip = &a;sum = add(ip,b);printf("sum=%d,a=%d\n",sum,a);return 0;
}

输出结果:

sum=3,a=5

传递的参数值被函数体内的程序改变。

10 流程控制

C语言中可以用逻辑判断和循环来进行流程控制。

10.1 if语句

if语句用于逻辑判断。可写成:

if(逻辑判断表达式)
{语句块;
}

例如:

if(q!=1)
{a=0;b=1;
}

若逻辑判断存在多个分支,可以采用if-else结构。如:

if(x<0)
{y = x/50;
}
else(x>=0 && x<3)
{x=-x;y = x/25;
}
else
{x= 0;y = 0;
}

10.2 for循环

for语句常用于循环表达。

int i,j,n<=10;
for(i=1;i<n;i++)
{j = i*i;printf("%d%d\n",i,j)
}

11 操作符

常用的代数操作符:

= 赋值操作
+ 加法计算
- 减法计算
* 乘法运算
/ 除法运算
% 求模运算
++ 累加
-- 累减

常用的逻辑操作符:

 <  小于
<= 小于等于>  大于>=  大于等于==  等于!=  不等于

12 C库函数

常用的三角函数:

double acos (double x);
double asin (double x);
double atan (double x);
double atan2 (double x, double y);
double cos (double x);
double sin (double x);
double tan (double x);
double cosh (double x);
double sinh (double x);
double tanh (double x);

常用的数学函数:

double sqrt (double x);
double pow(double x, double y);
double exp (double x);
double log (double x);
double log10 (double x);
double fabs (double x);
double ceil (double x);
double floor (double x);

一些常用的标准输入输出函数:

FILE *fopen(char *filename, char *mode);
int fclose(FILE *fp);
int printf(char *format,...);
int fscanf(FILE *fp, char *format,...);
int fscanf(FILE *fp, char *format,...);

更多的内容可参阅C语言教程。


更多CFD资料可微信扫描下方二维码关注微信公众号。

微信扫码关注公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 画砖块,钢笔画入门:教你画砖块

说到砖块很多朋友会想到搬砖&#xff0c;绘画吧今天要教大家用钢笔画一块砖&#xff0c;因为画建筑的时候经常要画砖墙&#xff0c;我们先从简单的砖块学起&#xff0c;之后绘画吧会给大家分享画一面砖墙的哦。绘制要点&#xff1a;本教程的主体物选择了一块有小残缺面的砖头。…

[转] Node.js的线程和进程

[From] http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑&#xff0c;Node.js到底是单线程的还是多线程的&#xff1f;通过本章的学习&#xff0c;能够让读者较为清晰的理解Node.js对于单/多线程的关系和支持情况。同时本章还将列举一些让…

第三方支付异步通知的陷阱

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/j16421881/article/details/78703792 用户下单后调用第三方支付付款&#xff0c;然后接收第三方支付的异步通知&#xff0c;以便确认支付是否成功。 如下图 但异步通知可能…

2.3 万 Star,Nginx 可视化配置工具

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;对于前后端开发工程师来说&#xff0c; Nginx 是必须掌握的工具&#xff0c;因为它不仅仅是一个 Web Server&#xff0c;还包含了其他…

城市智慧停车系统方案的产品设计体系介绍

最近几年随着大数据技术快速发展与应用&#xff0c;智慧城市随即被正式提出。而且&#xff0c;我们也可以深刻感受到“智慧”正在慢慢改变我们的生活方式和城市。要让城市变智慧的地方太多太多&#xff0c;当前我们接触做多的可能就是外出停车&#xff0c;比如很多商场的停车系…

vue.js:利用vue.js做一个抽奖小游戏

MVVM模式是什么&#xff1a;MModel(模型)&#xff0c;VView&#xff08;视图&#xff09;,VM ViewModel(简写成MVVM) . 代码如下&#xff1a; 运行代码结果&#xff1a; 1.你没有中奖&#xff1a; 2.恭喜你&#xff0c;你中奖了&#xff1a; 转载于:https://www.cnblogs.com/ya…

滚动加载数据 php,无刷新动态加载数据 滚动条加载适合评论等页面

滚屏加载更多数据,适合评论等页面本例的数据库很简单&#xff0c;一看就明了复制代码 代码如下:$querymysql_query("select * from content order by id desc limit 0,10");while ($rowmysql_fetch_array($query)) {?>js文件复制代码 代码如下:$(function(){var …

国际主流固件接口组织UEFI全面支持LoongArch,龙架构已完成上游TianoCore EDK2代码合并...

2022年9月初&#xff0c;UEFI官方组织在发布的UEFI specification V2.10规范中全面支持了LoongArch64架构以及部分LoongArch32架构。近期&#xff0c;龙芯团队又完成了LoongArch基础代码与UEFI上游TianoCore EDK2的合并&#xff0c;LoongArch进入TianoCore EDK2主分支&#xff…

Invalidate和postInvalidate

为什么80%的码农都做不了架构师&#xff1f;>>> Android提供了Invalidate方法实现界面刷新&#xff0c;但是Invalidate不能直接在线程中调用&#xff0c;因为他是违背了单线程模型&#xff1a;android UI操作并不是线程安全的&#xff0c;并且这些操作必须在UI线程…

.Net轻松处理亿级数据--clickhouse及可视化界面安装介绍

前言我是在17年就听说过Clickhouse,那时还未接触过亿数据的运算&#xff0c;那时我在的小公司对于千万数据的解决方案还停留在分库分表&#xff0c;最好的也是使用mycat做的集群。这些解决方案都比较复杂&#xff0c;毕竟通常来说那些需要大量存储的数据基本都是像日志&#xf…

NET CORE读取Excel.xlsx单元格内的图片,并关联当前业务ID推送图片到指定服务器...

NET CORE读取Excel.xlsx单元格图片的场景&#xff0c;一般是批量导入业务数据&#xff0c;例如&#xff1a;药品的图片&#xff0c;医师资格证&#xff0c;商品上架、商家营业资质、水果信息、用户头像等等这里我截个图&#xff0c;图文并茂更好理解特别声明&#xff1a;粘贴图…

RocketMQ 5.0 大手笔,拥抱云原生,支持流处理,高可用架构升级!

大家好&#xff0c;我是君哥。RocketMQ 5.0 已经发布一段时间了&#xff0c;今天来分享一下 RocketMQ 5.0 有哪些新特性。1 架构变化RocketMQ 5.0 架构上的变化主要是为了更好的走向云原生。RocketMQ 4.x 架构如下&#xff1a;Broker 向 Name Server 注册 Topic 路由信息&#…

php验证码显示乱码,如何解决php验证码乱码问题

php验证码乱码的解决办法&#xff1a;1、修改访问验证码生成方法函数的路径&#xff1b;2、修改文件编码&#xff0c;并去掉BOM头&#xff1b;3、检查验证码生成方法&#xff1b;4、修改服务环境。具体问题&#xff1a;php验证码输出全是乱码...<?php session_start();head…

中国HBase技术社区第五届MeetUp ——HBase技术解析及应用实践(深圳站)

HBase—Hadoop Database是一个分布式的、面向列的开源数据库&#xff0c;该技术来源于 Fay Chang 所撰写的Google论文“Bigtable&#xff1a;一个结构化数据的分布式存储系统”。HBase的特点是高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;如今HBase已经广泛应…

如何查找Power BI本地报表服务器产品密钥

Power BI 报表服务器产品密钥&#xff0c;以便在生产环境中安装服务器。 已下载 Power BI 报表服务器&#xff0c;并已购买 SQL Server Enterprise 软件保障协议。 或者&#xff0c;已购买 Power BI Premium。 希望在生产环境中安装服务器&#xff0c;但需要产品密钥才能进行安…

【.NET番外篇】Rust环境搭建+基础开发入门+Rust与.NET6、C++的基础运算性能比较

前言&#xff1a;突然想打算把Rust作为将来自己主要的副编程语言。当然&#xff0c;主语言还是C#&#xff0c;毕竟.NET平台这么强大&#xff0c;写起来就是爽。缘起&#xff1a;之前打算一些新的产品或者新的要开发的东西&#xff0c;由于没有历史包袱&#xff0c;就想重新选型…

团队-中国象棋-最终程序

托管平台地址:https://gitee.com/zhanghongjian666/ZhongGuoXiangQi 小组名称:exciting 小组成员合照: 程序运行方法:html 程序运行示例及运行结果:转载于:https://www.cnblogs.com/qwsa/p/7944093.html

java原子类场景,CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题...

CAS你知道吗&#xff1f;原子类AtomicInteger的ABA问题谈谈&#xff1f;&#xff0c;原子共面问题(1)CAS是什么&#xff1f;比较并交换举例1, CAS产生场景代码&#xff1f;importjava.util.concurrent.atomic.AtomicInteger;public classCASDemo {public static voidmain(Stri…

深入分析JavaWeb Item7 -- HttpServletResponse详解

Web服务器收到客户端的http请求&#xff0c;会针对每一次请求&#xff0c;分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即然代表请求和响应&#xff0c;那我们要获取客户机提交过来的数据&#xff0c;只需要找request对象就行了。…

Spring.net学习记录

Spring.Net功能&#xff1a; 1、控制反转&#xff08;IOC&#xff09;&#xff1a;就是创建对象的权利由开发人员自己控制New&#xff0c;转到了有容器来控制 2、依赖注入&#xff08;DI&#xff09;&#xff1a;就是通过容器来创建对象的时候&#xff0c;在对象初始化时给一些…