ANSYS的APDL与C语言混合编程(实例)

 
摘要:

本文介绍了如何使用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","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");
3. 实例

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

        3.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 }
3.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 }
4.上述方法的缺点

    --------先想想在写。

转载于:https://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.ANSYS SOLID65环向布置钢筋的例子 3 2.混凝土非线性计算实例(1)- MISO单压 5 3.混凝土非线性计算实例(2)- MISO约束压 6 4.混凝土非线性计算实例(3)- KINH滞回 9 5.混凝土非线性计算实例(4)- KINH压-拉裂 11 6.混凝土非线性计算实例(5) 12 7.混凝土非线性计算实例(6) 14 8.混凝土非线性计算实例(7)- MISO滞回 16 9.混凝土非线性计算实例(8) 18 10.混凝土非线性计算实例(9)-梁平面应力 20 11.四层弹簧-质点模型的地震分析 22 12.悬臂梁地震分析 48 13.用beam 54单元描述变截面梁的例子 72 14.变截面梁实例 73 15.拱桥浇筑过程分析-单元生死应用实例 74 16.简支梁实体与预应力钢筋分析实例 75 17. 简单的二维焊接分析-单元生死实例 77 18.隧道开挖(三维)的命令流 84 19.岩土接触分析实例 101 20.钢筋混凝土管的动力响应特性分析实例 109 21.隧道模拟开挖命令流(入门) 116 22.螺栓连接的模拟实现问题 119 23.道路的基层、垫层模量与应力之间的关系 129 23.滞回分析 151 24.模拟某楼层浇注 153 25.在面上施加移动的面力 155 27.在任意面施加任意方向任意变化的压力 159 28.预紧分析 160 29.几何非线性+塑性+接触+蠕变 162 30.埋设在地下的排水管道 167 32.幕墙企业玻璃简化计算 172 33.等截面杆单元生死应用实例 188 34.梁板建模联系 189 36.简单的例子-如何对结构的振动控制分析 192 37.模态分析结果的输出实例 194 38.火车过桥动态加载实例(部分) 196 39.悬索结构的找形和计算的例题 213 40.陶瓷杆撞击铝板的例子 218 41.求反作用力的APDL命令法 221 42.LS-DYNA实例(部分) 222 43.路面分层填筑对路基的影响 223 44.一个例子(含地震影响,求振兴与频率) 227 45.接触面上的压力总和 231 46.施加位置函数荷载 235 47.非线性分析考虑刚度退化 236 48.一个圆形水池的静力分析 237 49.ANSYS中混凝土模式预应力模拟的算例 238 50.悬臂梁受重力作用发生大变形求其固有频率 240 51.循环对称结构模态分析 242 52.三角平台受谐波载荷作用的结构响应 244 53.三角平台受一地震谱激励的应力分布和支反力 246 54.三角平台受时程载荷作用的应力分布和变形过程 248 55.经典层合板理论 250 56.定易圆轨迹的例子 257 57.模拟门式刚架施工-单元生死 257 58.钢筋混凝土整体式模型例子 260 59.在荷载步之间改变材料属性例子 262 60.含预应力的特征值屈曲计算 263 61.振型叠加计算及工况组合例子 265 62.柱子稳定分析算(预应力,特征值屈曲,初始缺陷) 268 63. module MConcrete !混凝土模板 271 64.混凝土开裂实例 279 65.螺栓网格划分 280 66.自由液面的土石坝平面渗流分析 281 67.导出刚度矩阵 285 68.某混凝土拱坝工程施工期及运行期温度场仿真分析 286 69.移动温度荷载计算 293 70.SHSD用于壳-实体装配实例An 295 71.ansys显示-隐式-回弹分析实例 299 72.工况组合的经典例子 314
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值