ANSYS有APDL但ansys支持C語言嗎?你可嘗試C混合編程

2016-02-03  by:CAE仿真在線  來源:仿真在線

注意:本文不是討論利用C語言為ANSYS寫用戶子程序,而是討論結(jié)合APDL對ANSYS的現(xiàn)有的計(jì)算程序進(jìn)行復(fù)用。

實(shí)際上,到目前為止,ansys中除了fluent可以使用c語言開發(fā)子函數(shù)外,其他地方都不可以使用c原因進(jìn)行二次開發(fā)。

本文所謂混合開發(fā),指的是借助c語言,生成ansys所需要的數(shù)據(jù),仿真在線曾經(jīng)使用c#.net程序生成ansys的tabular 載荷-時(shí)間數(shù)據(jù),該數(shù)據(jù)超過3000行,該數(shù)據(jù)如果使用人來計(jì)算將相當(dāng)復(fù)雜且不準(zhǔn)確,但用程序開發(fā)產(chǎn)生,生成txt文件,然后導(dǎo)入ansys則很方便。

對ANSYS的apdl很強(qiáng)大,但是編寫的時(shí)候經(jīng)常有很多有規(guī)律性的apdl需要寫,這些規(guī)律性的東西,可能超過1萬行代碼,如果用人來寫,那簡直是災(zāi)難,但,如果用程序來輸出則可能一個(gè)循環(huán)就搞掂,幾分鐘的事情。


1. 為什么進(jìn)行混合編程

既然ANSYS已經(jīng)提供了APDL這么強(qiáng)大的編程語言,為什么還要用C語言來與APDL混合編程呢?下面的幾個(gè)原因,首先是前處理建模的要求,APDL并不能應(yīng)對實(shí)際中非常復(fù)雜的模型的構(gòu)建,本文的出發(fā)點(diǎn)之一就是復(fù)合材料分析中的幾何模型構(gòu)建問題,由于材料中的增強(qiáng)體為隨機(jī)的顆粒,每一次模擬中,顆粒都是隨機(jī)生成的,使用APDL并不方便;其次就是利用ANSYS的計(jì)算資源的考慮,比如上述問題,就可以利用C語言來生成模型的數(shù)據(jù),利用APDL來構(gòu)建幾何模型,以及剖分有限元網(wǎng)格,用于自己的計(jì)算程序;還有在一些問題中,其邊界條件,載荷等也是通過程序算出來的話,也可以通過混合編程對問題求解;另外,可以發(fā)揮C語言的優(yōu)勢,比如說計(jì)算效率,現(xiàn)有的庫等,總而言之,混合編程能更充分利用ANSYS的計(jì)算程序以及C語言的優(yōu)勢,并且可以實(shí)現(xiàn)計(jì)算機(jī)上的自動化計(jì)算。

2. 混合編程的原理

ANSYS與C語言混合編程的原理很簡單,實(shí)際上就是用C語言生成ANSYS的apdl命令流文件,然后通過命令行調(diào)用ANSYS進(jìn)行計(jì)算。這個(gè)過程同樣可以使用其他的編程語言(比如FORTRAN,Python等)來進(jìn)行,可以發(fā)揮各種語言的優(yōu)勢以及對現(xiàn)有的程序庫的使用。

3. 如何使用C語言的實(shí)現(xiàn)

知道了混合編程的原理,那么就很簡單了,其過程無非就是利用C語言打開一個(gè)文件,寫入命令流,關(guān)閉文件,調(diào)用ANSYS進(jìn)行計(jì)算。

文件操作需要使用的函數(shù)有

 1 fp=fopen("mac.inp","w");                      //打開文件
 2 fprintf(fp, "APDL_Commands,%f\n",SomeData);   //寫入文件
 3 fclose(fp);                                   //關(guān)閉文件

     調(diào)用ANSYS的命令行計(jì)算則使用

system("D:\\Progra~1\\AnsysI~1\\v100\\ANSYS\\bin\\intel\\ansys100 -b -i temp.inp -o mesh.log");

4. 實(shí)例

       下面給幾個(gè)APDL和C語言混合編程的實(shí)例

4.1  復(fù)合材料中的圓性顆粒網(wǎng)格剖分

    圖中的顆粒是C語言中隨機(jī)生成的圓形,結(jié)果如圖所示:

cube 

相應(yīng)的生成上述網(wǎng)格的函數(shù)為

1 /*調(diào)用ANSYS生成網(wǎng)格*/

2 void GenMesh(struct circle0 *circle,double xmax,double xmin,double ymax,double ymin)

 3 {

 4 5 FILE* ansysfile;

 6 ansysfile=fopen("temp.inp","w");

 7 8 fprintf(ansysfile,"/CLEAR,NOSTART\n");

9 fprintf(ansysfile,"/PREP7\n");

10 11 //創(chuàng)建基體

12 fprintf(ansysfile,"RECTNG,%f,%f,%f,%f,\n",xmin,xmax,ymin,ymax);

13 14 //創(chuàng)建顆粒

15 for (int i=0; i<N0; i++)

16 {

17 if (circle[i].r<0.00000001)

18 { 19 continue; 20 }

21 fprintf(ansysfile,"K,%d,%f,%f\n",i+1000,

22 circle[i].centre_x,circle[i].centre_y);

23 fprintf(ansysfile,"CIRCLE,%d,%f\n",i+1000,circle[i].r);

24 }

25 fprintf(ansysfile,"ASBL,1,ALL\n");

26 fprintf(ansysfile,"AGLUE,All\n");

27 28 //創(chuàng)建單元類型

29 fprintf(ansysfile,"ET,1,PLANE42\n");

30 //創(chuàng)建材料

31 fprintf(ansysfile,"MP,DENS,1,0.1\n");//材料一

32 fprintf(ansysfile,"MP,DENS,2,10\n");//材料二

33 //為基體賦一號材料值 34 fprintf(ansysfile,"ASEL,S,AREA,,ARINQR(0,14)\n");

35 fprintf(ansysfile,"AATT,1\n");

36 37 //為顆粒賦二號材料值

38 fprintf(ansysfile,"ASEL,ALL\n");

39 fprintf(ansysfile,"ASEL,U,AREA,,ARINQR(0,14)\n");

40 fprintf(ansysfile,"AATT,2\n");

41 fprintf(ansysfile,"ALLSEL,ALL\n");

42 43 //生成網(wǎng)格 44 //網(wǎng)格尺寸 45 fprintf(ansysfile,"SMRT,3\n");

46 //fprintf(ansysfile,"AESIZE,ALL,0.6,\n");

47 48 fprintf(ansysfile,"MSHAPE,1,2D\n");

49 fprintf(ansysfile,"MSHKEY,0\n");

50 //開始劃分網(wǎng)格 51 fprintf(ansysfile,"AMESH,ALL\n");

52 53 //輸出網(wǎng)格

54 // fprintf(ansysfile,"/INPUT,ExportMesh,inp\n"); 55 56 fclose(ansysfile);

57 //---------------調(diào)用ANSYS生成網(wǎng)格

58 system("D:\\Progra~1\\AnsysI~1\\v100\\ANSYS\\bin\\intel\\ansys100 -b -i temp.inp -o mesh.log");

59 // system("tec360 tecplot.plt");

60 }

4.2  復(fù)合材料中的橢圓形顆粒網(wǎng)格剖分

        對于橢圓形顆粒,網(wǎng)格剖分結(jié)果如圖所示

Snap1 

生成上述網(wǎng)格的代碼為

 1 
 2 //生成顆粒是橢圓時(shí)的網(wǎng)格
 3 //橢圓的數(shù)據(jù)結(jié)構(gòu)是下面的struct
 4 //Genmesh函數(shù)是調(diào)用ANSYS生成網(wǎng)格的函數(shù)
 5 void GenMesh(struct elliptic0 *ellipse,int ellipsenum,double xmax,double xmin,double ymax,double ymin)
 6 {
 7 
 8     FILE* ansysfile;
 9     ansysfile=fopen("temp.inp","w");
10     fprintf(ansysfile,"FINISH\n");
11     fprintf(ansysfile,"/CLEAR,NOSTART\n");
12     fprintf(ansysfile,"/PREP7\n");
13 
14     //創(chuàng)建基體
15     fprintf(ansysfile,"RECTNG,%f,%f,%f,%f,\n",xmin,xmax,ymin,ymax);
16 
17     //創(chuàng)建橢圓顆粒
18     for (int i=0; i<ellipsenum; i++)
19     {
20         //把工作平面移到橢圓圓心。
21         fprintf(ansysfile,"wpave,%f,%f\n",ellipse[i].center_x,ellipse[i].center_y);
22         //旋轉(zhuǎn)工作平面
23         fprintf(ansysfile,"wprota,%f\n",180.0/pi*ellipse[i].theta);
24         //激活當(dāng)前活動坐標(biāo)系為工作平面
25         fprintf(ansysfile,"csys,4\n");
26         //生成上半個(gè)橢圓
27         fprintf(ansysfile,"k,%d,%f\n",2*i+1000,ellipse[i].a);
28         fprintf(ansysfile,"k,%d,%f\n",2*i+1001,-ellipse[i].a);
29         fprintf(ansysfile,"cswpla,%d,2,%f\n",2000+2*i,(ellipse[i].b/ellipse[i].a));
30         fprintf(ansysfile,"l,%d,%d\n",2*i+1000,2*i+1001);
31         fprintf(ansysfile,"reflect_line=_return\n");//記錄線的編號
32         fprintf(ansysfile,"csys,4\n");        //切換活動坐標(biāo)系為工作平面
33         fprintf(ansysfile,"lsymm,y,reflect_line\n");//反射生成橢圓
34         //調(diào)整工作平面使其與整體坐標(biāo)系重合
35         fprintf(ansysfile,"wprota,%f\n",-180.0/pi*ellipse[i].theta);
36         fprintf(ansysfile,"CSYS,0\n");
37         fprintf(ansysfile,"WPAVE,0,0,0\n");
38     }
39 
40     fprintf(ansysfile,"ASBL,1,ALL\n");
41     fprintf(ansysfile,"AGLUE,All\n");
42 
43     //創(chuàng)建單元類型
44     fprintf(ansysfile,"ET,1,PLANE42\n");
45     //創(chuàng)建材料
46     fprintf(ansysfile,"MP,DENS,1,0.1\n");//材料一
47     fprintf(ansysfile,"MP,DENS,2,10\n");//材料二
48     //為基體賦一號材料值
49     fprintf(ansysfile,"ASEL,S,AREA,,ARINQR(0,14)\n");
50     fprintf(ansysfile,"AATT,1\n");
51     //為顆粒賦二號材料值
52     fprintf(ansysfile,"ASEL,ALL\n");
53     fprintf(ansysfile,"ASEL,U,AREA,,ARINQR(0,14)\n");
54     fprintf(ansysfile,"AATT,2\n");
55     fprintf(ansysfile,"ALLSEL,ALL\n");
56     //生成網(wǎng)格
57     //網(wǎng)格尺寸
58     fprintf(ansysfile,"SMRT,3\n");
59     //fprintf(ansysfile,"AESIZE,ALL,0.6,\n");
60 
61     fprintf(ansysfile,"MSHAPE,1,2D\n");
62     fprintf(ansysfile,"MSHKEY,0\n");
63     //劃分網(wǎng)格
64     fprintf(ansysfile,"AMESH,ALL\n");
65 
66     //輸出網(wǎng)格
67     fprintf(ansysfile,"/INPUT,ExportMesh,inp\n");//輸出網(wǎng)格到Tecplot
68     fprintf(ansysfile,"EWRITE,elemlist1,txt\n");//輸出單元
69     fprintf(ansysfile,"NWRITE,nodelist1,txt\n");//輸出節(jié)點(diǎn)
70 
71     fclose(ansysfile);
72     //---------------調(diào)用ANSYS生成網(wǎng)格
73     system("D:\\Progra~1\\AnsysI~1\\v100\\ANSYS\\bin\\intel\\ansys100 -b -i temp.inp -o mesh.log");
74     system("tec360 tecplot.plt");
75 }

5、總結(jié)

實(shí)際上很多cae工程師都缺乏編程經(jīng)驗(yàn),但從本文來看,所需要的編程技巧并不多,也許cae人員都該試試,有些時(shí)候可以大大加快工作的精度,這個(gè)在ansys經(jīng)典和ansys workbench都能使用的著,而且也適用于所有能夠通過運(yùn)行腳本來分析的軟件平臺,不僅僅限于ansys,也不僅僅限于c語言,其他語言都可以,如.net,c++,Python,vb等。


開放分享:優(yōu)質(zhì)有限元技術(shù)文章,助你自學(xué)成才

相關(guān)標(biāo)簽搜索:ANSYS有APDL但ansys支持C語言嗎?你可嘗試C混合編程 ansys apdl c語言在ansys中的應(yīng)用 Ansys有限元培訓(xùn) Ansys workbench培訓(xùn) ansys視頻教程 ansys workbench教程 ansys APDL經(jīng)典教程 ansys資料下載 ansys技術(shù)咨詢 ansys基礎(chǔ)知識 ansys代做 

編輯
在線報(bào)名:
  • 客服在線請直接聯(lián)系我們的客服,您也可以通過下面的方式進(jìn)行在線報(bào)名,我們會及時(shí)給您回復(fù)電話,謝謝!
驗(yàn)證碼

全國服務(wù)熱線

1358-032-9919

廣州公司:
廣州市環(huán)市中路306號金鷹大廈3800
電話:13580329919
          135-8032-9919
培訓(xùn)QQ咨詢:點(diǎn)擊咨詢 點(diǎn)擊咨詢
項(xiàng)目QQ咨詢:點(diǎn)擊咨詢
email:kf@1cae.com