ANSYS输出的单元和节点文件的C语言读入
ANSYS中使用EWRITE来输出当前选择的单元到文件。他的参数为
其中前两个分别是文件名和后缀,KAPPND表明是否清空单元文件来进行输出(用0和1 表示),Format则是说明输出文
件的位宽,其中SHORT是默认选项,表示用六位位宽输出,而LONG是表示8为位宽输出。
同样的,ANSYS使用NWRITE来输出当前选择的节点到文件。其输入参数与EWRITE的输入参数的含义相同,只不过没有位宽
的选项。但是节点的输出文件的中第一列为节点号位宽是8位,而第二到第四列为节点坐标,各20为位宽,各列之间没
有空格。
在使用C语言读入网格数据的时候,可以使用上述的文件来读入.通常比较方便的做法是知道节点个数,和单元个数然后
在依次读入C程序中。但是上述输出的单元和节点的文件并没有提供这个信息。
不过可已通过一下方式来产生这种文件:在APDL中先读取单元数和节点数,分别写入对应的单元和节点文件,然后以追
加方式写节点和单元文件。
下面是一个简单的用C语言读取二维的三角网格的例子(没有写入单元和节点的个数,而是通过计算行数来得到的)
1 #include <stdio.h>
2 #include <stdlib.h>
3 //ANSYS 's element output format
4
5 char NodeFormat[]="%*8c%20s%20s"; //节点的行格式
6 char ELongFormat[]="%8d%8d%8d%*40c%8d";//单元文件三角网格的长格式
7 char EShortFormat[]="%6d%6d%6d%*30c%6d";//单元文件三角网格的短格式
8
9
10
11
12 int main(int argc, const char *argv[])
13 {
14 FILE* fp;
15 char buffer[200];
16 char xx[21];
17 char yy[21];
18 int ch;
19 int mat,num;
20 int linenum=0;
21 int a[3]={0};
22 char NodeFile[]="nodelist1.n";//节点文件
23 char ElemFile[]="elemlist1.e";//单元文件
24
25 fp=fopen(NodeFile,"r");
26
27 //计算节点数目
28 while((ch=fgetc(fp))!=EOF)
29 {
30 if(ch=='\n')linenum++;
31 }
32 rewind(fp);
33 printf("节点数是%d\n",linenum);
34 //读入节点的坐标
35 while(fgets(buffer,200,fp)!=NULL)
36 {
37 xx[0]='\0';
38 yy[0]='\0';
39 sscanf(buffer,NodeFormat,xx,yy);
40 printf("%f,%f\n",atof(xx),atof(yy));
41 }
42 fclose(fp);
43
44 fp=fopen(ElemFile,"r");
45 int linenum=0;//计算单元的数目
46 while((ch=fgetc(fp))!=EOF)
47 {
48 if(ch=='\n')linenum++;
49 }
50 rewind(fp);
51 printf("单元数是%d\n",linenum);
52 //读入单元
53 while(fgets(buffer,200,fp)!=NULL)
54 {
55 sscanf(buffer,EshortFormat,&a[0],&a[1],&a[2],&mat);
56 printf("%8d %8d %8d %8d\n",a[0],a[1],a[2],mat);
57 }
58 fclose(fp);
59
60
61 return 0;
62 }
63
2 #include <stdlib.h>
3 //ANSYS 's element output format
4
5 char NodeFormat[]="%*8c%20s%20s"; //节点的行格式
6 char ELongFormat[]="%8d%8d%8d%*40c%8d";//单元文件三角网格的长格式
7 char EShortFormat[]="%6d%6d%6d%*30c%6d";//单元文件三角网格的短格式
8
9
10
11
12 int main(int argc, const char *argv[])
13 {
14 FILE* fp;
15 char buffer[200];
16 char xx[21];
17 char yy[21];
18 int ch;
19 int mat,num;
20 int linenum=0;
21 int a[3]={0};
22 char NodeFile[]="nodelist1.n";//节点文件
23 char ElemFile[]="elemlist1.e";//单元文件
24
25 fp=fopen(NodeFile,"r");
26
27 //计算节点数目
28 while((ch=fgetc(fp))!=EOF)
29 {
30 if(ch=='\n')linenum++;
31 }
32 rewind(fp);
33 printf("节点数是%d\n",linenum);
34 //读入节点的坐标
35 while(fgets(buffer,200,fp)!=NULL)
36 {
37 xx[0]='\0';
38 yy[0]='\0';
39 sscanf(buffer,NodeFormat,xx,yy);
40 printf("%f,%f\n",atof(xx),atof(yy));
41 }
42 fclose(fp);
43
44 fp=fopen(ElemFile,"r");
45 int linenum=0;//计算单元的数目
46 while((ch=fgetc(fp))!=EOF)
47 {
48 if(ch=='\n')linenum++;
49 }
50 rewind(fp);
51 printf("单元数是%d\n",linenum);
52 //读入单元
53 while(fgets(buffer,200,fp)!=NULL)
54 {
55 sscanf(buffer,EshortFormat,&a[0],&a[1],&a[2],&mat);
56 printf("%8d %8d %8d %8d\n",a[0],a[1],a[2],mat);
57 }
58 fclose(fp);
59
60
61 return 0;
62 }
63