ANSYS中表格数组的定义及使用举例

来源:互联网 发布:网络连接异常 编辑:程序博客网 时间:2024/06/05 10:20

本文转载自:http://blog.sina.com.cn/s/blog_833dee820102xwb3.html


ANSYS中会有许多的参数数据,这些参数的形成后要放到一个容器中去,等着以后调用。ANSYS中提供了多种存取的容器。其中有变量(variables)数组(arrays) 以及表格(tables)。变量和我们平时用的一样。数组其实和我们平时用的也差不多。ANSYS中的参数数据存储时的排列和Matlab中的矩阵形式是一样的,是以列优先的。我们在Matlab中单个数据索引的时候是按照列调用的,先调用第一列然后调用第二列依次类推。

一维是一列(column),二维是行和列(rows and columns),三维是行列以及面(rowscolumns and planes)。ANSYS中提供的三种类型的数组ARRAYCHAR以及TABLE。重点介绍一下TABLE。它是ANSYS特有的一种数据存储容器。它能允许ANSYS线性插值计算得到所存入数据之间的数据。比较一下一维数组和表格的不同,如下图所示:

ANSYS中表格数组的定义及使用举例

 

第一个图就是一个一维ARRAY数组,假如我们命名为A(实际定义时为*DIM,A,ARRAY,7   意思是定义一个名为A,一共7行的数组,列项不明确的话默认为1)。可以看成A是一个71列的矩阵。索引值也都是从1开始的正整数。以索引值为横坐标画出来的图是一个散点图。第二个图就是一个表格数组。我们命名为B(*DIM,B,TABLE,7),也是一个7行的数据,它与数组的不同之处在于索引值可以是小数,另外画出的图来是一个折线图。意思是说在两个索引值之间我们也可以索引。比如B(3.5)=3.2,B(5)=9.6,那么B(3.8)等于多少?它由B(3.5)B(5)之间的线性插值得到,即:3.2+3.8-3.5/(5-3.5)*(9.6-3.2)=4.48

对于二维数组,和二维矩阵是一样的。比如定义一个43列的矩阵AA*DIM,AA,ARRAY,4,3。如下图所示:

ANSYS中表格数组的定义及使用举例

 

索引方式和Matlab中一样AAi,j)。三维数组的表示方式也是一样的。索引方式即AAij,k)。

ANSYS中表格数组的定义及使用举例

 

上文说到TABLE中的索引可以是小数,这是因为TABLE中多出了一行和一列,名为0行,0列。这个00列就是为了存储索引值的,索引值是由我们指定的,不像ARRAY是自动生成的。指定的时候要注意索引值必须是递增的,如果不指定,默认情况是得到一个很小的值(7.888609052E-31)。我们在GUI中可以通过下图方式查看表格数据。

ANSYS中表格数组的定义及使用举例

 

 

对于三维的TABLE数据。层或者面的索引值是在每一面的(0,0)出给出,同样面的索引也不一定是整数。在ANSYS帮助文档中有一个图比较简单明了:

 

 ANSYS中表格数组的定义及使用举例


 我们看到TABLE数组中有两组索引值。其中黑色三角1,和黑色三角3指代的列索引值和行索引值(使用*SET设置),而黑色三角2和黑色三角3是用来索引数组的)。对于面的索引值就在每一个面中的(0,0)位置。当然也不一定是整数。为什么有两组索引值呢?其实第一组就是看起来正常的索引值是用来定义TABLE数据的时候使用的。而后一组索引值,就是可以使用小数的那个是用来从TABLE中获取数据的时候使用的。所以当定义一个TABLE数据表格的时候,必须要定义能够真实索引数值的那一组索引值,即后一组。(其实还有5维数组,只是我不知道这个用来干什么……)

接下来我们看看怎么填充ARRAY数组和TABLE数组。①我们可以*SET命令或者“=”一个个定义数据。②也可以一列一列的填满(注意这里是列,比如使用*VFILL命令)③可以交互式的修改数据(*VEDIT)④从ASCII文件中读取数据(*VREAD或者**TREAD命令)。

但是*SET命令或者“=”一次定义的数据量是有限的,我们从该命令的语法也可以看到,一次只能定义10个。比如我们定义一个121列的矩阵XYZ,我们只能这样定义:

*DIM,XYZ,ARRAY,12   !声明XYZ是一个121列的数组。

XYZ(1)=59.5,42.494,-9.01,-8.98,-8.98,9.01,-30.6,51 !这个命令的意思是我们从XYZ中的第1个位置开始定义,这次定义了8个。(数据填充的时候对于数组,其名称后边必须跟着一个用括弧括起来的下标,如果后边定义一个数据,那么下标的意思是数据所在位置。*SET命令帮助文档中有说明。但是命令后边是一连串的数据,那么这个下表指的就是数据填充的起始位置)

XYZ(9)=-51.9,14.88,10.8,-10.8  !第二次填充是从第9个数据开始又填充了4个。

这样这个121列的数据就算定义完了。实际上得到的是:

ANSYS中表格数组的定义及使用举例

 

这样看数组的话,感觉舒服多了。接下来的例子用来说明二维数组是如何定义的。首先声明一个43列的数组T2*DIM,T2,ARRAY,4,3。然后填充:

T2(1,1)=0.6,2,-1.8,4   !上文说了数组名字后边要写一个括起来的下标,如果“=”后边是1个值那么(1,1)就表示单位的位置。而后边是好多值,那么(1,1)就表示数据填充的起始位置。第一个数据位置确定了,但是后续数据要横这填呢还是竖着填?因为ANSYS中的数组是按列优先的,所以是按照列填充。于是这个命令定义了(1,1,(2,1),(3,1),(4,1)

T2(1,2)=7,5,9.1,62.5           !定义(1,2,(2,2)(3,2)(4,2)

T3(1,3)=2E-4,-3.5,22,0.01    !定义(1,3),(2,3),(3,3),(4,3

 

ANSYS中表格数组的定义及使用举例

 接下来我们关于TABLE数组是如何填充数据的。定义一个力的表格数据FORCE

FORCE(1)=0,560,560,238,.5,0      !括弧中的(1)实际上是简写的(1,1),这条命令定义的是力的大小

FORCE(1,0)=1E-6,0.8,7.2,8.5,9.3  !这条命令定义的是FORCE表格中的索引值。

ANSYS中表格数组的定义及使用举例

 

对于字符串数组差不多,不再说明。

第二种方法是使用*VFILL命令来对ARRAY数组或TABLE数组一列一列的填充。*VFILL命令可以实现第一种的数据填充方式,也可以按照给定的公式去填充。详细情况可以看命令的帮助文档。

第三种是使用*VEDIT命令。但是这种方法只适用于交互的GUI模式,我们通常使用命令流,因此不作讨论。

第四种是通过*VREAD命令将数据文件读入到数组中去。我们可以定义写入数组时候的其实位置,也可以通过数据描述符来控制写入的数据格式。数据描述符必须用小括号括起来放在*VREAD下边。举个例子,有一个名为dataval的数据文件:

1.5    7.8    12.3

15.6  -45.6   42.5

然后我们定义一个23列的EXA数组:

*DIM,EXA,,2,3            !定义数组及其维数

*VREAD,EXA(1,1),dataval,,,JIK,3,2     !从(1,1)开始读入写入数据。该命令的argument意思是先从列开始读(因为是JIK,即列,行,面),读3列,读完了开始读第2行。

(3F6.1)

得到的结果为:

EXA=    1.5    7.8    12.3

      15.6  -45.6   42.5

我在尝试以上命令的时候使用的是txt文档,使用TAB处理数据间隔,但是不行。使用逗号隔开才可以,使用csv格式也行。不知道为什么。

对应的TABLE数组使用的命令是*TREAD。(一个是VECTOR,一个是TABLE)。以上要读入的数据文件呢,最好是使用tab键将数据隔开的,另外要保存成ASCII格式。TABLE数据读入的时候只有一个顺序就是先按照第一列,一行一行读,结束之后开始第二列,依次类推。

以下用几个例子来说明上述操作。

我们使用EXCEL写出一组数据,第一列是时间,第二列是温度。然后另存为制表符分割的文本文件,命名为tdata。然后放到ANSYS的运行目录中去。

ANSYS中表格数组的定义及使用举例

 

打开ANSYS在命令窗口输入:

*DIM,TEM,TABLE,7,1,1,TIME,TEMP    !定义一个名为TEM41列,1个面的表格(除去index,为41列),行标签为TIME,列标签为TEMP

*TREAD,TEM,TDATA,TXT,,1                !因为我们的数据文件中第一行是文字,要略去。所以最后一个参数1,就是要跳过一行。

我们查看一下结果:

ANSYS中表格数组的定义及使用举例

 

Pretty good.对于二维的表格数据,和一维的类似。比如我们在Excel中制作下图这样一个表格。黄色的部分0表示第一个面,灰色的部分表示温度,其余的表示时间和x坐标的索引值。另存为TDATA.txt

 

 ANSYS中表格数组的定义及使用举例


 在命令行窗口输入:

*DIM,TMP,TABLE,4,3,1,TIME,X_COOR

*TREAD,TMP,TDATA,TXT,,2

查看结果:

ANSYS中表格数组的定义及使用举例

 

对于3-D表格的导入和上边很相似。只不过要加上关于面的索引。比如要制作一个随时间和x坐标,y坐标变化的温度表,其中每一个面中行代表时间,列代表x坐标,面代表y坐标。如下图所示:

ANSYS中表格数组的定义及使用举例

 

这是一个有两个面,43列的表格。其实对于三维表格在二维上的制作,看起来不是那么清晰。右边表格中黄色的部分其实就是y轴。黄色的部分对应的是y轴的坐标。对于每一个面,即每个y坐标都要有一组x坐标和时间坐标(索引值),而且这些索引值要相同(必须)。将上述表格,按照同样的方法导入到ANSYS中去,得到:

*DIM,TMP,TABLE,4,3,2,TIME,X_COOR,Y_COOR

*TREAD,TMP,TDATA,TXT,,1

ANSYS中表格数组的定义及使用举例

 

分别点击y轴坐标,很容易就能看到其对应的那个面的表格数据。

表格数据可以干什么?利用表格数据的插值性质,我们可以定义函数。因为TABLE中的数据是连续的,所以定义函数成为可能。比较常用的就是定义按时间变化的荷载、相应谱曲线、应力应变曲线、材料属性——温度曲线等等。

对于表格施加的荷载(边界条件)。对于结构分析来所表格定义的主变量(primary virable)为下表中的第二列,施加命令为第三列。

ANSYS中表格数组的定义及使用举例

 

主变量的意思是在调用的时候默认的自变量。我们设置主变量为时间时,那么定义的函数就是以时间为自变量了。好,施加表格荷载的步骤分三步:

1)创造一个表格;

    *DIM,MYLOAD,TABLE,3,1,1,TIME    !定义名为MYLOAD311面,行标签为TIME的表格

2)填充数据;

MYLOAD(1,0,1)=0

MYLOAD(2,0,1)=1

MYLOAD(3,0,1)=5

MYLOAD(1,1,1)=0

MYLOAD(2,1,1)=400

MYLOAD(3,1,1)=1000

3)将表格数据作为荷载施加到模型上。

SFL,ALL,PRES,%MYLAOD%   !调用表格一定要在前后加%以表征其为变量而不是字符串,当然标量也不用。

另外需要注意的是我们上边直接定义的曲线一般是斜坡的,并不是光滑的。如果想要定义光滑的可以直接定义函数。但是函数的定义一般是在GUI当中定义的,我们使用批处理时不可能中间再去定义函数。注意到ANSYS施加的函数荷载在内部应用时一般都是转化为表格进行的(查看日志文件可见)。举个例子王新敏的《ANSYS工程结构数值分析》中449页例子8.4“带槽口平板的棘轮效应分析”。他使用一个一个函数是:

-6.52E/1.5-32E3/1.5*SIN(TIME)时间定义的是10pi。但是他定义的表格按照我们前文的规定是这样的:

ANSYS中表格数组的定义及使用举例

 

我去?我们发现这和函数有毛关系吗?这是怎么对应的?网上鲜有这方面资料,有人认为这种类似密码表的东西,是ANSYS为了防抄袭。但是无论如何这个东西没有解密的文档,其功能的确是隐藏的。但是我么可以通过ANSYS自带的函数编辑器操作。在GUI界面,定义函数,从log文件中拷贝出来表格数据就可以了。举个栗子:

1)使用函数编辑器定义并保存函数;

首先打开函数编辑器,并编辑函数F=sin(Y)+log({TEMP}),点击file,save。命名为“myfunc.func

ANSYS中表格数组的定义及使用举例

 

2)将函数载入表格中;

点击Paramer——>Read From File。然后在画红圈部分填上自己想要建立表格的名字。这里我写的是myload。点击OK,退出。到这一步后我们打开log文件,可以看到如下图的命令:

ANSYS中表格数组的定义及使用举例

 

然后我们就可以将这个命令改一下放到我们的命令流中去了。我们也可以看到这个表格定义的很奇怪,这不是我们所能理解的,可能只有ANSYS开发人员能懂。

3)将表格荷载施加到模型上。

这一步和上边的是一样的。如果想要显示荷载看看对不对,可以使用/PNUM,TABN,1       /PNUM,SVAL,1        /PSF命令来显示所加的荷载。

需要注意的是在瞬态分析中,还要对时间步特别注意,以防止加载时跃过加载最大值。

比如王新敏老师的《ANSYS工程结构数值分析》中449页例子8.4“带槽口平板的棘轮效应分析”将荷载子步定义了最小值也是这个道理。我们在函数编辑器中看一下他所定义的函数是什么样子的。我们看到按照100个插值点是可以满足要求的。

ANSYS中表格数组的定义及使用举例

 

如果步数太小就会变形,比如下图插值20个点。当然也就无法达到我们想要的结果了。

ANSYS中表格数组的定义及使用举例