• 【转载】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
    ",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
    ");
     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<N0; 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  复合材料中的椭圆形颗粒网格剖分

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

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

    4.上述方法的缺点

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

  • 相关阅读:
    多任务并行
    不同方法来移动数据库(更改磁盘时用)(转)
    ASP.NET执行SQL超时的解决方案
    SQL Server 简单模式下,误删除堆表记录如何恢复(绕过页眉校验) (转)
    关于跟踪标记
    .NET分布式事务处理
    安装SQL Server 2005时出现COM+的警告/错误,下面是微软给出的解决方法。
    PHP中如何获取多个checkbox的值
    C# 模拟post数据提交时 出现如下错误: System.Net.WebException: 远程服务器返回错误: (417) Expectation Failed 的解决办法
    winform出现"LC.exe"已退出,代码为1
  • 原文地址:https://www.cnblogs.com/dyl-HelloWorld/p/6006952.html
Copyright © 2020-2023  润新知