您的位置:网站首页 > Ansys教程

使用ANSYS APDL和C语言实现混合编程

时间:2011-01-30 12:07:50 来源:未知

本文探讨了使用ANSYS APDL和C语言实现混合编程的相关内容。

  本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序),而是讨论结合APDL对ANSYS的现有的计算程序进行复用,例如对ANSYS强大的前后处理程序,包括网格剖分,计算结果显示等,或者利用有限元计算部分的模块,使用ANSYS方便的边界条件加载,方程组求解等。

  0. 为什么进行混合编程

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

  1. 混合编程的原理

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

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

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

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

  1 fp=fopen("mac.inp","r"); //打开文件

  2 fprintf(fp, "APDL_Commands,%f",SomeData); //写入文件

  3 fclose(fp); //关闭文件

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

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

  3. 实例

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

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

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

图1

 

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

  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");

  9 fprintf(ansysfile,"/PREP7");

  10

  11 //创建基体

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

  13

  14 //创建颗粒

  15 for (int i=0; i

  16 {

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

  18 {

  19 continue;

  20 }

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

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

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

  24 }

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

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

  27

  28 //创建单元类型

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

  30 //创建材料

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

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

  33 //为基体赋一号材料值

  34 fprintf(ansysfile,"ASEL,S,AREA,,ARINQR(0,14)");

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

  36

  37 //为颗粒赋二号材料值

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

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

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

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

  42

  43 //生成网格

  44 //网格尺寸

  45 fprintf(ansysfile,"SMRT,3");

  46 //fprintf(ansysfile,"AESIZE,ALL,0.6,

  ");

  47

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

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

  50 //开始划分网格

  51 fprintf(ansysfile,"AMESH,ALL");

  52

  53 //输出网格

  54 // fprintf(ansysfile,"/INPUT,ExportMesh,inp

  ");

  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 }

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

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

图2

 

  生成上述网格的代码为

  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");

  11 fprintf(ansysfile,"/CLEAR,NOSTART");

  12 fprintf(ansysfile,"/PREP7");

  13

  14 //创建基体

  15 fprintf(ansysfile,"RECTNG,%f,%f,%f,%f,",xmin,xmax,ymin,ymax);

  16

  17 //创建椭圆颗粒

  18 for (int i=0; i

  19 {

  20 //把工作平面移到椭圆圆心。

  21 fprintf(ansysfile,"wpave,%f,%f",ellipse[i].center_x,ellipse[i].center_y);

  22 //旋转工作平面

  23 fprintf(ansysfile,"wprota,%f",180.0/pi*ellipse[i].theta);

  24 //激活当前活动坐标系为工作平面

  25 fprintf(ansysfile,"csys,4");

  26 //生成上半个椭圆

  27 fprintf(ansysfile,"k,%d,%f",2*i+1000,ellipse[i].a);

  28 fprintf(ansysfile,"k,%d,%f",2*i+1001,-ellipse[i].a);

  29 fprintf(ansysfile,"cswpla,%d,2,%f",2000+2*i,(ellipse[i].b/ellipse[i].a));

  30 fprintf(ansysfile,"l,%d,%d",2*i+1000,2*i+1001);

  31 fprintf(ansysfile,"reflect_line=_return");//记录线的编号

  32 fprintf(ansysfile,"csys,4"); //切换活动坐标系为工作平面

  33 fprintf(ansysfile,"lsymm,y,reflect_line");//反射生成椭圆

  34 //调整工作平面使其与整体坐标系重合

  35 fprintf(ansysfile,"wprota,%f",-180.0/pi*ellipse[i].theta);

  36 fprintf(ansysfile,"CSYS,0");

  37 fprintf(ansysfile,"WPAVE,0,0,0");

  38 }

  39

  40 fprintf(ansysfile,"ASBL,1,ALL");

  41 fprintf(ansysfile,"AGLUE,All");

  42

  43 //创建单元类型

  44 fprintf(ansysfile,"ET,1,PLANE42");

  45 //创建材料

  46 fprintf(ansysfile,"MP,DENS,1,0.1");//材料一

  47 fprintf(ansysfile,"MP,DENS,2,10");//材料二

  48 //为基体赋一号材料值

  49 fprintf(ansysfile,"ASEL,S,AREA,,ARINQR(0,14)");

  50 fprintf(ansysfile,"AATT,1");

  51 //为颗粒赋二号材料值

  52 fprintf(ansysfile,"ASEL,ALL");

  53 fprintf(ansysfile,"ASEL,U,AREA,,ARINQR(0,14)");

  54 fprintf(ansysfile,"AATT,2");

  55 fprintf(ansysfile,"ALLSEL,ALL");

  56 //生成网格

  57 //网格尺寸

  58 fprintf(ansysfile,"SMRT,3");

  59 //fprintf(ansysfile,"AESIZE,ALL,0.6,

  ");

  60

  61 fprintf(ansysfile,"MSHAPE,1,2D");

  62 fprintf(ansysfile,"MSHKEY,0");

  63 //划分网格

  64 fprintf(ansysfile,"AMESH,ALL");

  65

  66 //输出网格

  67 fprintf(ansysfile,"/INPUT,ExportMesh,inp");//输出网格到Tecplot

  68 fprintf(ansysfile,"EWRITE,elemlist1,txt");//输出单元

  69 fprintf(ansysfile,"NWRITE,nodelist1,txt");//输出节点

  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 }