开头先放上我自己整理的代码
!========================================================
! 目的:将关键点KP在受力后的位移,应变和,KP受力后的应力输出到TXT文件
! 参数:
! KPSTRAIN数组-存储KP受载后的坐标,
! 应该是KP数量行7列,第一列是编号,X,Y,Z,XY,YZ,XZ
! KPDIS数组-存储KP受载后的位移,
! 应该是KP数量行4列,第一列是编号,xyz三个方向
! KPSTRESS数组-存储KP受载后的应力
! 应该是KP数量行4列,第一列是编号,xyz三个方向
! 输出:
! EX72ANSYSKPSTRAIN.TXT - 这是用来保存ANSYS 存储KP受载后的坐标,下次可以直接加载
! EX72ANSYSKPDIS.TXT-这是用来ANSYS保存位移的文件,下次ANSYS可以直接加载
! EX72ANSYSKPSTRESS.TXT-这是用来ANSYS保存应力的文件,ANSYS可以直接加载
! EX72KPSTRAIN.TXT - 这是ANSYS将存储KP受载后的坐标保存到TXT文件,有利于matlab读取的
! EX72KPDIS.TXT - 这是ANSYS将kp位移数组保存到TXT文件,有利于matlab读取的
! EX72KPSTRESS.TXT - 这是ANSYS将KP应力保存到TXT文件,有利于matlab读取的
! 注意:
! 超过kp数量的node应力会报错 Requested data is not stored for node 6200. line=*Get, NODESTR,NODE,J,S,X无效
!=========================================================
!========= 定义一个参数获取KP数量
/PREP7
*DIM, KPNUM, ARRAY, 1, 1 ! 定义一个参数专门存KP数量
*GET, KPNUM(1,1), KP, 0, NUM, MAXD ! 存储KP的数量
FINISH
/POST1
! ========= 定义应变数组并赋值,然后存储为ANSYS读取文件
*DIM, KPSTRAIN, ARRAY,KPNUM(1,1),7 ! 定义位移数组,
*DO, I, 1, KPNUM(1,1)
*SET, KPSTRAIN(I,1,1),I ! 点编号
*GET, KPSTRAIN(I,2), NODE, I, EPTO, X
*GET, KPSTRAIN(I,3), NODE, I, EPTO, Y
*GET, KPSTRAIN(I,4), NODE, I, EPTO, Z
*GET, KPSTRAIN(I,5), NODE, I, EPTO, XY
*GET, KPSTRAIN(I,6), NODE, I, EPTO, YZ
*GET, KPSTRAIN(I,7), NODE, I, EPTO, XZ
*ENDDO
PARSAV, ALL, 'EX72ANSYSKPSTRAIN', 'TXT', ' ' ! 保存为给ANSYS读取的文件
! =========定义位移数组并赋值,然后存储为ANSYS读取文件
*DIM, KPDIS, ARRAY,KPNUM(1,1),4 ! 定义位移数组,292472是list node看出的数量
*DO, I, 1, KPNUM(1,1)
*SET, KPDIS(I,1,1),I ! 点编号
*GET, KPDIS(I,2), NODE, I, U, X
*GET, KPDIS(I,3), NODE, I, U, Y
*GET, KPDIS(I,4), NODE, I, U, Z
*ENDDO
PARSAV, ALL, 'EX72ANSYSKPDIS', 'TXT', ' ' ! 保存为给ANSYS读取的文件
! =========定义应力数组并赋值,然后存储为ANSYS读取文件
*DIM, KPSTRESS, ARRAY, KPNUM(1,1),4 ! 定义应力
*DO, J, 1, KPNUM(1,1)
*SET, KPSTRESS(J,1,1),J ! 点编号
*GET, KPSTRESS(J,2), NODE, J, S, X
*GET, KPSTRESS(J,3), NODE, J, S, Y
*GET, KPSTRESS(J,4), NODE, J, S, Z
*ENDDO
PARSAV, ALL, 'EX72ANSYSKPSTRESS', 'TXT', ' ' ! 保存为给ANSYS读取的文件
FINISH
/REPLO !????是否要加这一行
! =========将数组保存至TXT文件当中
*CREATE,ansuitmp
*CFOPEN, 'EX72KPSTRAIN', 'TXT', ' ' ! ( 在(7F12.6)之间不可以加注释的)
*VWRITE, KPSTRAIN(1,1), KPSTRAIN(1,2), KPSTRAIN(1,3),KPSTRAIN(1,4), KPSTRAIN(1,5), KPSTRAIN(1,6),KPSTRAIN(1,7),,,,,,
(7F12.6)
*CFCLOS
*END
/INPUT, ansuitmp
*CREATE,ansuitmp
*CFOPEN, 'EX72KPDIS', 'TXT', ' ' ! ( 在(4F12.6)之间不可以加注释的)
*VWRITE, KPDIS(1,1), KPDIS(1,2), KPDIS(1,3), KPDIS(1,4),,,,,,
(4F12.6)
*CFCLOS
*END
/INPUT, ansuitmp
*CREATE,ansuitmp
*CFOPEN, 'EX72KPSTRESS', 'TXT', ' ' ! ( 在(4F12.6)之间不可以加注释的)
*VWRITE, KPSTRESS(1,1), KPSTRESS(1,2), KPSTRESS(1,3),KPSTRESS(1,4),,,,,,
(4F12.6)
*CFCLOS
*END
/INPUT, ansuitmp
FINISH
可以用 MATLAB 从 TXT 文件中读取,读取代码可以参考 数据处理技巧(5):MATLAB 读取txt中的数据
目的:将ANSYS的数据复制给数组,以便后续数组导出操作
格式:GET, Par, Entity, ENTNUM, Item1, IT1NUM, Item2, IT2NUM
应用:需要用get*命令来将每一个关键点计算后的位移和应力赋值给数组
Par:
被赋值的数组名称和行列,比如result(1,1)
Entity:
实体的关键词,有效关键词比如:NODE, ELEM, KP, LINE, AREA, VOLU , 等
ENTUM:
实体的数字或者标签,如果是0或者空格表示代表所有实体。
Item1:
特定项目的名称,具体需要查表
IT1NUM:
特定项目的数量,具体需要查表
Item2, IT2NUM:
第二套特定项目的名称和数量,具体查表。
*GET 返回一个值赋值给特性项目参数、一个参数或者用户自定的参数。项目是由关键字,标签和数量来确定的。用法可以参考 *SET 命令的介绍。
举例: *GET (p. 782), A, ELEM, 5, CENT, X 返回第五个网格(element 5)的中心x坐标的值,赋值给参数A
有相似函数 *VGET ,可以参考
大多数项在计算后存储在数据库中,之后随时可用。项目根据它们通常首先定义或计算的位置分组。预处理数据常常不能反映剖面数据的计算值。不要使用 GET (p. 782) 从使用计算截面数据的单元(如梁或壳)获得数据。
可以从以下几个方面找表格,发现GET在每个处理器中都是有用的。
举例,以下表格可以获得,关键点 KP 在预处理时候的坐标 (x,y,z) 等
在求解的项目中,没有关键点 kp 的选项,同样在 postprocessing 中也没有
举例,将点位移赋值给数组的代码示例:
*GET, NODEDIS(1,1), NODE, 1, U, X ! 尝试输出第一个关键点在求解之后的位移
*GET, NODEDIS(1,2), NODE, 1, U, Y
*GET, NODEDIS(1,3), NODE, 1, U, Z
*GET, NODESTR(1,1), NODE, 1, S, X ! 尝试输出第一个关键点在求解之后的应力
*GET, NODESTR(1,2), NODE, 1, S, Y
*GET, NODESTR(1,3), NODE, 1, S, Z
如何获得 NODE 在划分好网格之后的数量的代码示例:
NODE 数量获取的时候,是在/PREP7求解器中,所以要写成以下模样:
/PREP7
*DIM, NODENUM, ARRAY, 1,1 ! 定义一个参数专门存储NODE数量
*GET, NODENUM(1,1), NODE, 0, NUM, MAXD ! MAXD表示已定义的NODE的数量的最大值
Keypoint是最早输入 ANSYS 建模的点,node 是网格划分后的所有点(当然包括 keypoint )。所以假如 keypoint 点有 6217 个,那么 node 点中前 6217 个的点坐标和 keypoint 完全一样,说明 node 在 6217 个点之后的点是另外插值得到的,只能在list页面看,但是没有保存下来,所以命令流无法读取。
ANSYS存储应力应变之类的数据的时候,实际上只存储了 KEYPOINT的应力应变,其余的 node 数据都是通过 KEYPOINT 数据进行插值的。所以如果要查看应力应变数据,在 GUI 中通过 General Post -> Plot Result -> contour Plot -> Nodal Solu 选择一个,保证图像已经绘制出来(一定要先绘制)。然后 LIST -> Results -> Nodal Solution -> Nodal Solution -> Total mechanical stran 应变 -> von Mises total mechanical strain 这样就可以看到下图的 EPTO1/2/3/INT/EQV , 可以发现,在 list 页面中每一个 node 都有对应的数据,但是通过命令流给参数赋值的时候不是所有NODE都有应力应变数据的。
相关想法已经在 ANSYS APDL学习(10):解释命令流报错requested data is not stored for node ___ .的原因与应对办法介绍了,这里就不再重复。
所以,要导出求解之后的数据,一共有两个方法:
①只导出ANSYS保存的结点数据,也就是kp关键点的个数,比如关键点有6217个,那么就导出node前6217个点的应力和应变,这样不会报错。
② 如果需要全部结点node的数据,不能用命令流,否则会报错:requested data is not stored for node ___ . 所以要在GUI中手动先绘制图像 General Post -> Plot Result -> contour Plot -> Nodal Solu 选择一个,保证图像已经绘制出来**(一定要先绘制)。然后 LIST -> Results -> Nodal Solution -> Nodal Solution -> Total mechanical stran 应变 -> von Mises total mechanical strain。可以通过list应力、应变的页面,点击 FILE -> SAVE AS 然后直接将这个页面保存下来,可以用txt**方式打开。
目前选择第一种,只导出KP的应力应变数据
可能哪里出了问题?可能是**的地方,没有应力,所以没给它赋值的原因
本来不想把这些内容放上来,一是这是我自己根据 Mechanical APDL Product 16.0 自己尝试出来的,有的网上没有,有的写的不全。二是这是我的部分笔记和记录,没有那么大的兴趣帮助别人毕业。
但是还是有很多人问如何将ANSYS数据导出来,其实这不应该是我们日常工作中的问题,但是需要不懂的人花费大量的时间去查找。所以还是决定放出来。毕竟也就是一些写在帮助文件中,有时候会被忽略的内容。
同时,只有交流才能知道我在哪里有问题,尤其是后续使用的时候,发现导出的单元中点应变和点求解中的点应变的值不同,甚至同一个点在同一个单元的应变值都有两行不同的应变数据。这个我也还没有解决,只能等网友的帮忙了
《ANSYS Mechanical APDL Basic Analysis Guide》:有很多很实用的例子,推荐查阅
《Ansys Mechanical APDL Command Reference》:如果专门搞ANSYS APDL的,强烈推荐下载,很好用。
知乎:Ansys APDL 读取所有节点坐标及其应变值并写入文件:里面的命令流有涉及到如何给导出的txt中增加每一列的标题和补充信息,如果要导出的文件非常多,标题对信息的整理非常有帮助。