技术背景
利用ANSYS进行有限元建模的工作可以分为两部分:
- 在专业知识层面,对实际结构的有限元模型抽象;
- 在编程技术层面,通过ANSYS的APDL语言建立模型,分析求解,后处理;
正确区分两类关系有助于抓住重点,以更清晰的思路解决问题。
而在APDL编程的问题又可以分为以下几个部分:
- 模型建立,包括材料定义,几何模型,有限元模型(/PREP7)
- 边界条件与荷载施加,模型求解(/SOLU)
- 后处理,位移内力提取,变形图、振型绘制(/POST1,/POST26)
- 数据的格式化读取和输出(I/O)
在实际工作中,对于小型问题求解,数据的读写操作可以通过手动处理解决;然而对于复杂问题,如复杂模型建立,迭代循环计算等等,数据的格式化批处理成为解决问题的控制性环节,因此有必要对数据读写技术数量掌握。
本文仅对数组化数据的读写进行总结,涉及*VREAD
和*VWRITE
函数。
数据读取
数据类型及操作步骤
常用数据类型是指*VREAD支持的数组数据,在实际操作中往往三种形式使用:
- 行向量
- 列向量
- 矩阵
一般的小批量参数输入更常用行列向量,即一维数组,因而调用*VREAD
一维简化形式,减小了操作的复杂性。
数据读取需要三个步骤:
- 定义数据文件
- 定义数组变量
- 文件数据,变量赋值
向量数据读取
读取数据前首先要定义txt数据文件,txt中行列数据的格式为:行数据以逗号分隔(英文),列数据以断行分隔,如图 1。为了方便,一般一类数据放在一个文件最佳。非标准格式的数据读取可能出错。
有了数据文件,在读取前还需定义数组变量用于存储数据。读取以上行向量的一维数组如表 1所示。
表 1 一维数组定义
*DIM,Par,Type,IMAX,JMAX,KMAX,Var1,Var2,Var3,CSYSID
! Defines an array parameter and its dimensions.
Par - parameter
Type - Array type : ARRAY(default),ARR4,CHAR,TABLE,TAB4,STRING
IMAX - Extent of first dimension (row)
*DIM,MYDATA,,1,5 ! 1行5列数组
下一步通过VREAD函数将txt文件的数据赋值到数组变量,如表 2。VREAD具体用法可以很复杂,在此处我们仅需要考虑的参数有:
- MYDATA(1,1) - 数组变量及赋值起点
- DATA,TXT – 数据文件及扩展名
- JIK – 读取顺序,此处表示先行后列,对于列数据为IJK
- 5,1 – 数组赋值范围(J:1-5,I:1-1),此处需谨慎,具体参考help文件
- (5F10.0) – 每行读取的格式,5个数值,10个字符宽度,小数点取0位
表 2 一维数组读取
*VREAD,MYDATA(1,1),DATA,TXT,,JIK,5,1
(5F10.0)
矩阵数据读取
矩阵数据读取的规范实际上就是行类数据规范的综合,需要注意的数据读取顺序和赋值范围的参数定义,读取方向的定义错误可能导致读入原始数据的转置矩阵。
表 3 矩阵读取
*DIM,MYDATA,,4,3
*VREAD,MYDATA(1,1),DATA3,TXT,,JIK,3,3
(3F10.0)
数据输出
数据输出操作步骤
数据的输出格式实质上只有一种表格化的txt文件,可以任意指定文件扩展名,以便后续处理的便利。
基本操作步骤有:
- 指定输出数据文件(filename.ext)并打开
- 指定要输出的数据变量,定义一行的数据输出格式
- 关闭数据文件
以上步骤需要注意两点,
- 3成对出现,在编程性的文件I/O操作及数据库操作中,这是一种最基本的处理流程,保证内存的正确操作,不熟悉数据库概念的朋友需格外注意;
- 数据的输出是以“一行数据”为基准的,故列数据及矩阵数据的输出本质上只是多行数据的连续输出,故下一节仅探讨行数据的输出。
行数据的输出
行数据的输出示例如表 4,在*VWRITE
后列出第一行输出的数据,即MYDATA
在第一行的五个元素,在其后的格式定义中给出各数据的格式及空格定义,没有空格和间距的数据文件是难以阅读的。
表 4 行数据的输出
*CFOPEN,RESULT,TXT
*VWRITE,MYDATA(1,1),MYDATA(1,2),MYDATA(1,3),MYDATA(1,4),MYDATA(1,5)
(F10.0,' 'F10.0,' 'F10.0,' 'F10.0,' 'F10.0)
*CFCLOS
总结
数据的I/O操作是一个相对规程化又琐碎的工作,在学习的初期并不显得重要,但其控制性作用随着处理问题的复杂性而相应提升。对于这样的常规而又琐碎的处理过程,如果每次遇到就诉诸度娘或help不失为一种临时解决方案,但长期下来耗费的精力和时间是不可忽视的。
我的心得的是,要掌握数据I/O操作技术为我所用,必须在练习中掌握,而且应该从最简单示例——行向量数据的读写做起。简化问题,分解步骤,才能专注于关键环节,或说“天下大事必成于细,天下难事必成于易”。
此外,最好将典型的数据读写代码写成标准化模板如,以便随时套用。本文代码详见附件DataTest。