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