ANSYS有APDL但ansys支持C语言吗?你可尝试C混合编程

2016-02-03  by:CAE仿真在线  来源:仿真在线

注意:本文不是讨论利用C语言为ANSYS写用户子程序,而是讨论结合APDL对ANSYS的现有的计算程序进行复用。

实际上,到目前为止,ansys中除了fluent可以使用c语言开发子函数外,其他地方都不可以使用c原因进行二次开发。

本文所谓混合开发,指的是借助c语言,生成ansys所需要的数据,仿真在线曾经使用c#.net程序生成ansys的tabular 载荷-时间数据,该数据超过3000行,该数据如果使用人来计算将相当复杂且不准确,但用程序开发产生,生成txt文件,然后导入ansys则很方便。

对ANSYS的apdl很强大,但是编写的时候经常有很多有规律性的apdl需要写,这些规律性的东西,可能超过1万行代码,如果用人来写,那简直是灾难,但,如果用程序来输出则可能一个循环就搞掂,几分钟的事情。


1. 为什么进行混合编程

既然ANSYS已经提供了APDL这么强大的编程语言,为什么还要用C语言来与APDL混合编程呢?下面的几个原因,首先是前处理建模的要求,APDL并不能应对实际中非常复杂的模型的构建,本文的出发点之一就是复合材料分析中的几何模型构建问题,由于材料中的增强体为随机的颗粒,每一次模拟中,颗粒都是随机生成的,使用APDL并不方便;其次就是利用ANSYS的计算资源的考虑,比如上述问题,就可以利用C语言来生成模型的数据,利用APDL来构建几何模型,以及剖分有限元网格,用于自己的计算程序;还有在一些问题中,其边界条件,载荷等也是通过程序算出来的话,也可以通过混合编程对问题求解;另外,可以发挥C语言的优势,比如说计算效率,现有的库等,总而言之,混合编程能更充分利用ANSYS的计算程序以及C语言的优势,并且可以实现计算机上的自动化计算。

2. 混合编程的原理

ANSYS与C语言混合编程的原理很简单,实际上就是用C语言生成ANSYS的apdl命令流文件,然后通过命令行调用ANSYS进行计算。这个过程同样可以使用其他的编程语言(比如FORTRAN,Python等)来进行,可以发挥各种语言的优势以及对现有的程序库的使用。

3. 如何使用C语言的实现

知道了混合编程的原理,那么就很简单了,其过程无非就是利用C语言打开一个文件,写入命令流,关闭文件,调用ANSYS进行计算。

文件操作需要使用的函数有

 1 fp=fopen("mac.inp","w");                      //打开文件
 2 fprintf(fp, "APDL_Commands,%f\n",SomeData);   //写入文件
 3 fclose(fp);                                   //关闭文件

     调用ANSYS的命令行计算则使用

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

4. 实例

       下面给几个APDL和C语言混合编程的实例

4.1  复合材料中的圆性颗粒网格剖分

    图中的颗粒是C语言中随机生成的圆形,结果如图所示:

cube 

相应的生成上述网格的函数为

1 /*调用ANSYS生成网格*/

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 //创建基体

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

13 14 //创建颗粒

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 //创建单元类型

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

30 //创建材料

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 //生成网格 44 //网格尺寸 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 //开始划分网格 51 fprintf(ansysfile,"AMESH,ALL\n");

52 53 //输出网格

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

57 //---------------调用ANSYS生成网格

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  复合材料中的椭圆形颗粒网格剖分

        对于椭圆形颗粒,网格剖分结果如图所示

Snap1 

生成上述网格的代码为

 1 
 2 //生成颗粒是椭圆时的网格
 3 //椭圆的数据结构是下面的struct
 4 //Genmesh函数是调用ANSYS生成网格的函数
 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     //创建基体
15     fprintf(ansysfile,"RECTNG,%f,%f,%f,%f,\n",xmin,xmax,ymin,ymax);
16 
17     //创建椭圆颗粒
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         //旋转工作平面
23         fprintf(ansysfile,"wprota,%f\n",180.0/pi*ellipse[i].theta);
24         //激活当前活动坐标系为工作平面
25         fprintf(ansysfile,"csys,4\n");
26         //生成上半个椭圆
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");        //切换活动坐标系为工作平面
33         fprintf(ansysfile,"lsymm,y,reflect_line\n");//反射生成椭圆
34         //调整工作平面使其与整体坐标系重合
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     //创建单元类型
44     fprintf(ansysfile,"ET,1,PLANE42\n");
45     //创建材料
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     //生成网格
57     //网格尺寸
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     //划分网格
64     fprintf(ansysfile,"AMESH,ALL\n");
65 
66     //输出网格
67     fprintf(ansysfile,"/INPUT,ExportMesh,inp\n");//输出网格到Tecplot
68     fprintf(ansysfile,"EWRITE,elemlist1,txt\n");//输出单元
69     fprintf(ansysfile,"NWRITE,nodelist1,txt\n");//输出节点
70 
71     fclose(ansysfile);
72     //---------------调用ANSYS生成网格
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、总结

实际上很多cae工程师都缺乏编程经验,但从本文来看,所需要的编程技巧并不多,也许cae人员都该试试,有些时候可以大大加快工作的精度,这个在ansys经典和ansys workbench都能使用的着,而且也适用于所有能够通过运行脚本来分析的软件平台,不仅仅限于ansys,也不仅仅限于c语言,其他语言都可以,如.net,c++,Python,vb等。


开放分享:优质有限元技术文章,助你自学成才

相关标签搜索:ANSYS有APDL但ansys支持C语言吗?你可尝试C混合编程 ansys apdl c语言在ansys中的应用 Ansys有限元培训 Ansys workbench培训 ansys视频教程 ansys workbench教程 ansys APDL经典教程 ansys资料下载 ansys技术咨询 ansys基础知识 ansys代做 

编辑
在线报名:
  • 客服在线请直接联系我们的客服,您也可以通过下面的方式进行在线报名,我们会及时给您回复电话,谢谢!
验证码

全国服务热线

1358-032-9919

广州公司:
广州市环市中路306号金鹰大厦3800
电话:13580329919
          135-8032-9919
培训QQ咨询:点击咨询 点击咨询
项目QQ咨询:点击咨询
email:kf@1cae.com