本人是CFD入坑不久,主要用于记录自己在学习过程中学习到的干货,在此要感谢所有愿意分享自己宝贵经验的CFD大神们。
如有疑问可以留言,大家可以一起交流,共同攻克!
前情提要:
1、UDF出现错误,Fluent会显示错误代码,即error code:****,可以在网上搜错误代码寻找解决办法;
2、UDF是通过宏(组命令)来完成的;
3、UDF中的传址调用:把参数B的存储地址传给A,使得这两个参数的指针指向同一个地址;
4、编辑器:VS、VScode等;
5、UDF中变量用的是国际单位;(特殊情况:气体常量的单位)
6、Fluent版本不同时,UDF需要重新加载;
7、UDF默认使用串行;
基本知识:
一、基本数据类型
1、UDF支持的数据类型: int long float double char real;
其中real=double(双精度求解器)/real=float(单精度求解器)
2、C语言中所有变量在使用前都必须定义(创建变量+变量类型);
全局变量---可以被源文件中所有函数使用;
局部变量---只在函数体内起作用,在函数外无法起作用;
3、数组,name--变量名称,size--数组里存储的单元数量,从0开始;
4、指针:存储变量内存地址的变量(指向另外一个变量的内存地址)
int *ip //指针变量ip,可以利用取地址运算符,将其余变量的地址赋给指针变量,也可以赋值
当指针作为函数的参数,为传址调用;在函数体内,修改指针参数的值,则调用函数时相应参数的值也会改变,后面会补充UDF的例子便于理解。
二、常用语句(具体回顾C语言)
1、if语句
2、循环语句(for/while)
三、UDF的类型
引用自胡坤老师
UDF宏有两种方式可以被Fluent所接受:编译和解释。其中有一些宏既可以被解释也可以被编译,而一些宏则只能被解释。有一些场合只接受编译后的UDF(如动网格中的一些宏),而有些场合既可以接受编译的UDF,还能接受解释后的UDF。
1、解释型UDF
解释型UDF不需要额外的编译器,利用Fluent软件自身即可解释源代码。在解释过程中,UDF源代码被C预处理器解释成中间的,独立于计算机体系之外的机器代码。之后在调用UDF的过程中,这些被解释器生成的机器代码将在内部仿真器或解释器上被执行。当然,这种以解释的方式运行无可避免的会损失计算性能。但是以解释方式运行的UDF有个好处:其可以不加修改的在不同体系的计算机上、不同的操作系统以及不同的Fluent版本中运行。
在UDF被解释后保存cas文件,之后再打开cas文件时,UDF能够直接被加载,而无需重新解释。
注意:当UDF的计算性能很重要时,建议以编译的形式运行UDF。所有解释型UDF都可以以编译的方式被Fluent加载。
2、编译型UDF
编译型UDF则可以全面使用C语言的所有功能。编译型UDF的构建方式与ANSYS Fluent可执行文件自身的构建方式相同。在代码构建过程中,其利用一个名为Makefile的脚本文件来调用C编译器构建一个目标代码库。该对象库与其编译过程中所使用的Fluent版本及计算机体系结构相关。因此,若改变了计算机操作系统或Fluent版本的话,UDF对象库必须重新构建。UDF的编译过程通常涉及到源代码的编译和加载两个步骤。
编译软件推荐VS、VScode等;
四、UDF中的网格结构与数据类型

这张图来自FLUENT帮助文档,没有帮助文档可以通过网盘下载。
链接:https://pan.baidu.com/s/1c9nX1vx29IQmdCkeakUnSA?pwd=wxez
提取码:wxez
注意:2d和3d情况下部分定义不同
node---网格节点; cell---网格单元; face---网格面; edge---网格边;
node thread---网格节点集合; face thread---网格面集合; cell thread---网格单元集合;
cell center---网格中心;
domain---域、相(包含了网格节点、网格面以及网格单元的集合);
可以理解为domain>thread>其余定义
数据类型(所有ANSYS Fluent数据类型都是区分大小写的。)
Node:一种结构数据类型,用于存储与网格点相关的数据。结构数据即一批数据组合而成。
face_t:一种整数数据类型,在一个面线程中标识一个特定的面。
cell_t:一种整数数据类型,用于标识单元格线程中的特定单元格。
Thread:一种结构数据类型,用于存储它所表示的网格单元或网格面所共有的数据。在Thread数据类型中,有一个指针数组(存储),每个指针指向特定变量(如压力、速度或梯度)的网格单元或网格面。在该指针数组中,用于标识指向特定变量数组(网格单元或网格面)的指针的索引类型Svar。在多相流问题中,每一相及混合相都有一个单独的Thread结构。这里不多做解释,后面在多相流的章节,继续探讨。
Svar:用于标识线程存储中的指针的索引
Domain:一种结构数据类型,用于存储与网格中的节点、面和单元线程集合相关联的数据。在多相流问题中,每一相及混合相都有一个单独的Domain结构。这里不多做解释,后面在多相流的章节,继续探讨。
Thread限定于cell/face/node,Domain是各个Thread的集合
6万+

被折叠的 条评论
为什么被折叠?



