【转载】ANSYS的APDL与C语言混合编程(实例)
原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html
本文讨论的不是利用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语言中随机生成的圆形,结果如图所示:
![]()
相应的生成上述网格的函数为
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 复合材料中的椭圆形颗粒网格剖分
对于椭圆形颗粒,网格剖分结果如图所示
![]()
生成上述网格的代码为
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.上述方法的缺点
--------先想想在写。
【转载】ANSYS的APDL与C语言混合编程(实例)的更多相关文章
- Java语言与C语言混合编程(2)--在Java中调用C语言本地库
在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...
- Java语言与C语言混合编程(1)--Java native 关键字
一. 什么是 native Method 简单地讲,一个 native Method 就是一个java调用非java代码的接口.一个 native Method 是这样一个java的方法:该方法的实现 ...
- Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- Swift 与 C 语言混合编程
前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...
- Dart 调用C语言混合编程
Dart 调用C语言本篇博客研究Dart语言如何调用C语言代码混合编程,最后我们实现一个简单示例,在C语言中编写简单加解密函数,使用dart调用并传入字符串,返回加密结果,调用解密函数,恢复字符串内容 ...
- SQL+C#:一次多语言混合编程的经验总结
1.用JAVA做,采取轮询策略: 2.用sql语言+C#混合编程,采取触发策略
- 5种语言混合编程:C++、JS、python、Lisp、汇编
/* 混合C++.JS.python.Lisp.汇编 1种语言,5种语法 */ main { //C++ vector<int> v; v.push(2); putsl(v.size()) ...
- Swift语言与Objective-C语言混合编程
首先创建一个Swift的Single View工程 然后直接在工程中新建OC文件: 然后选择OC语言之后会问你是否自动创建OC和Swift的中间文件: 然后工程文件夹里就有了三个文件: 现在OC头文件 ...
随机推荐
- 怎样去除ul li a标签文字下的下划线
这个主要是text-decoration属性,颜色的话就是普通的了 <style> ul li a{ text-decoration:none; } ul li a { color: ...
- Nbimer族助手 部分控件不能用的解决方法(转)
用户提出的问题现象: 我两天笔记本安装的都是win7 SP1系统,一台为64为一台为32位,网络环境是移动宽带通过D-Link路由器实现无线局域网,DHPC自动分配IP地址.每次打开IE或者Chrom ...
- 火狐浏览器Firefox上DownThemAll插件
DownThemAll插件支持断点续传.多线程下载,可以大幅度提高下载速度. 在Windows平台上,要下载大量的文件,迅雷自然是首选:但在非Windows平台上,只要安装一个火狐浏览器,再安装Dow ...
- 使用window.print实现网页打印
Window.print()方法用于在浏览器中打印当前窗口的内容,如果想要打印当前窗口中指定部分的内容的话需要其他的一些特殊的处理; Demo: <html> <head> & ...
- t检验
例子:以往通过大规模调查已知某地新生儿出生体重为3.30kg.从该地难产儿中随机抽取35名新生儿作为研究样本,平均出生体重为3.42kg,标准差为0.40kg. 问该地难产儿出生体重是否与一般新生儿体 ...
- 【matlab】查看程序运行时间
程序开头 profile on 结尾 profile viewer 然后就会很贴心滴出现下面的界面,可以从中展开,查看每段运行的时间
- CSS和Js样式属性的对照关系
注意:1.在使用js时,如newTD.style.paddingLeft="200";(错误),正确生效的写法是newTD.style.paddingLeft="200p ...
- python——初识socket
什么是socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链 ...
- 为什么高手离不了Linux系统?这就是我的理由
摘要: 通过本文来记录下我在Linux系统的学习经历,聊聊我为什么离不了Linuxx系统,同时也为那些想要尝试Linux而又有所顾忌的用户答疑解惑,下面将为你介绍我所喜欢的Linux系统,这里有一些你 ...
- 【63测试20161111】【BFS】【DP】【字符串】
第一题: tractor 题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1 ...