STAR-CCM+二次开发——User Code
User Code是用户自己用编译语言(例如C,C++或Fortran)编写的函数,用来和Simcenter STAR-CCM+动态链接,实现标准界面无法完成的一些需求(比如自定义边界,自定义初始化等)。
下面我们通过将入口边界设置为层流充分发展边界这样一个简单的例子来介绍其使用方法
模型如下:
物性参数:
密度:1kg/m³
粘度:2×10-3N·s/㎡
管道层流入口充分发展满足下面的关系:
其中:
Um表示入口的平均速度
r0表示管径
User Code的编写步骤如下:
①新建一个头文件,命名为uclib.h,内容如下:
注:上面头文件的名称和格式都是固定的,照着写就行了,不要去改动
②编写User Code的源码,新建一个.c或者.cpp文件都可以,这里我们新建一个demo.cpp文件,内容如下:
说明:
上面的源码主要分为三个部分
这部分是头文件,不用多说,注意uclib.h这个头文件必须要包含,其他的都是c语言或者c++的头文件了
这部分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,下图将固定格式和对应例子结合说明一下。
本例中args表示一个参数,当然后面还可以有更多的参数,比如Simcenter STAR-CCM+ 2019.2 User Guide当中就的
就跟着两个参数
args声明参数的方法和对应方式参考下表
这么声明的方法,基本上和上面的result参数理解类似,比如本例我们需要获取入口面单元的坐标信息,因为前面有size参数,在本例中这个size参数等于4263,那么这里的
CoordReal (*centroid)[3]
就相当于
CoordReal centroid[4263][3]
4263表示单元数目,后面的3表示x,y,z的索引,那么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坐标,其他类似的理解。
当然用户自定义函数不止一个,有多少个就写多少即可
最后一部分见上图是注册用户自定义的函数,格式是固定的,格式如下:
每个用户自定义函数都需要注册,每个用户自定义函数传入的不定参数也需要注册
注册用户的自定义函数的函数格式为
ucfunc(void *func, char *type, char *name);
其中:
func是用户自定义函数的函数名,比如本例中我们的函数名为ParabolicVelocity,
type必须是
"BoundaryProfile"、
"RegionProfile"、
"ScalarFieldFunction"、
"VectorFieldFunction"
这四种当中的一种,比如本例中我们是设置边界条件,故选择BoundaryProfile
name则表示为在STAR-CCM+中模型树的Tools->User Code->libuser.dll显示名称和调用时选取的名称,比如本例中我们设置的是边界条件,那么在模型树和边界条件设置的名称就应该是这里的name,见下图
注意一下有多少个用户自定义函数就需要写多少个这样的变量注册用户自定义函数的函数
注册用户自定义函数传入的不定参数的函数格式为
ucarg(void *func, char *type, char *variable, int size);
其中:
func参数含义与上面ucfunc函数中func参数的含义是一致
type参数必须是
"Cell"、
"Face"、
"Vertex"、
这三种当中的一种,Cell表示获取体单元的属性,Face表示获取面单元的属性,Vertex表示获取点的属性。
比如本例中我们是设置边界条件,故选择Face
variable参数必须是STAR-CCM+中可用的变量,比如温度(Temperature)、矩心(Centroid)等等
最后一个参数size的写法是固定的,但是注意一下这里的size和前面用户自定义函数传入的那个size参数是不一样的,这里的size需要传入变量数组的一个元素所需的字节数,采用sizeof来计算,比如本例中sizeof(CoordReal[3]),其他的类似sizeof(Real)、sizeof(int[2])等等,注意一下用户自定义函数当中的不定参数传入了多少个参数就需要写多少个这样的变量注册函数,比如本例不定参数只传入了1个参数,所以我们就需要注册1个。
总结一下上面注册函数的内容,由于本例当中我们只编写了1个用户自定义函数,不定参数只传入了1个参数,所以们写为下面的形式
如果多个用户自定函数和不定参数传入多个参数的情况就参照Simcenter STAR-CCM+ 2019.2 User Guide当中的写法
接下来就是编译User Code
首先我们找到UserFunctions.lib
我的路径为:
然后我们再找到vcvarsall.bat
由于我安装了两个版本的vs,所以会有两个vcvarsall.bat文件,我们vs2013的路径
我们以管理员权限启动cmd
输入下面的命令
上面命令汇总一下:
"D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
cl /MD /EHsc /DDOUBLE_PRECISION /D_WINDOWS -c *.cpp
link -dll /out:libuser.dll *.obj "D:\Program Files\Siemens\14.04.011-R8\STAR-CCM+14.04.011-R8\star\lib\win64\intel18.3vc14-r8\lib\UserFunctions.lib"
启动STAR-CCM+,新建一个项目,展开模型树的Tools,找到User Code,然后加载User Code。
其余的设置没什么难点
在边界中使用User Code
计算残差
计算完成后速度分布云图
入口速度分布
从上面的结果可以看出User Code的设置满足我们的需求
模型、网格、User Code源码、STAR-CCM+结果文件链接:
https://pan.baidu.com/s/1Y__MU4sQoVIUg_fo3KIsKA
提取码: fqrd