新浪博客

STAR-CCM+二次开发——User Code

2020-02-09 18:16阅读:
User Code是用户自己用编译语言(例如CC++Fortran)编写的函数,用来和Simcenter STAR-CCM+动态链接,实现标准界面无法完成的一些需求(比如自定义边界,自定义初始化等)
下面我们通过将入口边界设置为层流充分发展边界这样一个简单的例子来介绍其使用方法
模型如下:
STAR-CCM+二次开发——User Code
STAR-CCM+二次开发——User Code
物性参数:
密度:1kg/m³
粘度:2×10-3N·s/
管道层流入口充分发展满足下面的关系:
STAR-CCM+二次开发——User Code 其中:
Um表示入口的平均速度
r0表示管径
User Code的编写步骤如下:
新建一个头文件,命名为uclib.h,内容如下:
STAR-CCM+二次开发——User Code 注:上面头文件的名称和格式都是固定的,照着写就行了,不要去改动
编写User Code的源码,新建一个.c或者.cpp文件都可以,这里我们新建一个demo.cpp文件内容如下:
STAR-CCM+二次开发——User Code 说明:
上面的源码主要分为三个部分
STAR-CCM+二次开发——User Code 这部分是头文件,不用多说,注意uclib.h这个头文件必须要包含,其他的都是c语言或者c++的头文件了
STAR-CCM+二次开发——User Code 这部分User Code自定义函数的主体部分,格式是固定的,其格式为:
STAR-CCM+二次开发——User Code name表示函数名,名称可以随便,只要符合c或者c++的命名规则即可。
对于返回值是标量(比如温度、压力和合速度)的时候result就写为
Real *result
这里可以将result理解为一个数组
注:数组和指针不能直接划等号。
对于返回值是矢量(比如速度的三个分量)的时候result就写为
Real (*result)[3]
这里可以将result理解为一个二维数组,(*result)[0](*result)[1](*result)[2]分别是一个一维数组,存储不同的量,比如速度三个分量就分别放在三个一维数组当中。
第二个参数size是前面result的维数,对应的单元(面单元,体单元)的数量,比如以本例来说,入口面有4263个面单元,那么这里的size就等于4263,那么这里的Real *result就相当于Real result[4263]
args...表示不定参数,表示后面跟的参数可能不止一个,类似printf,下图将固定格式和对应例子结合说明一下。
STAR-CCM+二次开发——User Code 本例中args表示一个参数,当然后面还可以有更多的参数,比如Simcenter STAR-CCM+ 2019.2 User Guide当中就的
STAR-CCM+二次开发——User Code 就跟着两个参数
args声明参数的方法和对应方式参考下表
STAR-CCM+二次开发——User Code 这么声明的方法,基本上和上面的result参数理解类似,比如本例我们需要获取入口面单元的坐标信息,因为前面有size参数,在本例中这个size参数等于4263,那么这里的
CoordReal (*centroid)[3]
就相当于
CoordReal centroid[4263][3]
4263表示单元数目,后面的3表示xyz的索引,那么centroid[0][0]就表示第一个单元的x坐标,centroid[0][1]就表示第一个单元的y坐标,centroid[0][2]就表示第一个单元的z坐标,所以centroid[xxx][0]就表示第xxx个单元的x坐标,centroid[xxx][1]就表示第xxx个单元的y坐标,centroid[xxx][2]就表示第xxx个单元的z坐标,其他类似的理解。
当然用户自定义函数不止一个,有多少个就写多少即可
STAR-CCM+二次开发——User Code
STAR-CCM+二次开发——User Code
最后一部分见上图是注册用户自定义的函数,格式是固定的,格式如下:
STAR-CCM+二次开发——User Code 每个用户自定义函数都需要注册,每个用户自定义函数传入的不定参数也需要注册
注册用户的自定义函数的函数格式为
ucfunc(void *func, char *type, char *name);
其中:
func是用户自定义函数的函数名,比如本例中我们的函数名为ParabolicVelocity
type必须是
'BoundaryProfile'
'RegionProfile'
'ScalarFieldFunction'
'VectorFieldFunction'
这四种当中的一种,比如本例中我们是设置边界条件,故选择BoundaryProfile
name则表示为在STAR-CCM+中模型树的Tools->User Code->libuser.dll显示名称和调用时选取的名称,比如本例中我们设置的是边界条件,那么在模型树和边界条件设置的名称就应该是这里的name,见下图
STAR-CCM+二次开发——User Code STAR-CCM+二次开发——User Code 注意一下有多少个用户自定义函数就需要写多少个这样的变量注册用户自定义函数的函数
注册用户自定义函数传入的不定参数的函数格式为
ucarg(void *func, char *type, char *variable, int size);
其中:
func参数含义与上面ucfunc函数中func参数的含义是一致
type参数必须是
'Cell'
'Face'
'Vertex'
这三种当中的一种,Cell表示获取体单元的属性,Face表示获取面单元的属性,Vertex表示获取点的属性。
比如本例中我们是设置边界条件,故选择Face
variable参数必须是STAR-CCM+中可用的变量,比如温度(Temperature

我的更多文章

下载客户端阅读体验更佳

APP专享