新浪博客

[转载]对 ANSYS 中 *VREAD 命令用法的总结

2018-10-21 00:07阅读:

*vread和*vwrite命令不能直接粘贴在命令窗口,你必须把这段命令流写到一个文件中或者做成一个宏。
如将下面的命令流做成宏文件:aaa.mac,命令流如下:
FINISH /CLEAR /PREP7 *DIM,AA,array,3,4,1 *vread,AA(1,1),data,txt,,JIK,4,3 (4f6.1)
data数据文件中的数据如下:
1.1,1.2,1.3,1.4
2.1,2.2,2.3,2.4
3.1,3.2,3.3,3.4
4.1,4.2,4.3,4.4
然后将路径设置好,将data.txt放在该目录中,用/input,aaa.mac或*use,aaa.mac即可。
经过实验,对 *vread 用法总结如下:
*VREAD, ParR, Fname, Ext, --, Label, n1, n2, n3,NSKIP
其中:
ParR 是要将外部数据写入的参数或数组变量名,如是数组,必须已经定义(用 *
DIM),且指出写入的开始位置,即包含下标(I,J,K (默认首行首列首区),然后写入从 (I,J,K) 开始到结尾的所有数组元素;如是参数,只输入一个值。
Fname 是存放数据的外部文件名,Ext是扩展名,
Label 可为 IJK, IKJ, JIK, JKI, KIJ, KJI, blank (默认为 IJK),表示对数组 ParR 写入的顺序。如 IJK 表示先写列再写行(先 K,再 J,再 I;对于二维数组,先写列,下标 J 改变最快),JIK 表示先写行再写列(先 K,再 I,再 J;对于二维数组,先写行,下标 I 改变最快)
n1, n2, n3 表示按上面的顺序,各下标分别要写入的数据个数,如 JIK56 表示对 ParR 按行写入,共写 5 (对应 J) 6 (对应 I),即 三个数按顺序分别对应 Label 中的三个标识符(例如:KIJ – n1 对应 Kn2 对应 In3 对应 Jn2n3 默认为 1)
NSKIP:从文件中读取数据时,首先跳过文件开头的 NSKIP (如:说明部分等,非数据内容),默认为0.
注意: *VREAD 命令只能用于 3 () 及以下的数组。
紧跟 *VREAD 命令的下一行是带括号的指定格式,描述从数据文件中读取数据时,每行读取的数据个数及其格式,如(2F3.03F11.0)表示每行读 5 个数,前两个含 3 个字符,后 3 个含 11个字符宽度。该格式与 Fortran 语言相同,但不能使用 I 格式 整数格式。

如 《APDL参数化有限元分析技术及其应用实例》 中 P40 的例子:
数据文件 data.txt内容如下 (2 行,每行 3 个数据,为了便于分析,对数据已做修改,注意以逗号分隔,如以空格分隔,有时会出问题)
1.1, 2.2, 3.3
4.4, 5.5, 6.6
执行命令流
*DIM,AA,,2,3 ! 数组 AA 2 3 列。
*VREAD,AA(1,1),DATA,TXT,,JIK,3,2 ! 3 对应 J2 对应 I
(3F6.1)
*STATUS,AA
对不同输入方式的读取结果分析如下:
nF6.1
AA 数组的读取结果
对数据文件的读取方式,每行读 n 个数据,格式都是 F6.1
JIK,3,2
(f6.1)
1
1.1
4.4
0
每行读 1 个数据,按行写入,共 3 2行。需读取 6 行。
Warning
end-of-file in data read[1]
2
0
0
0
JIK,3,2
(2f6.1)
1
1.1
2.2
4.4
每行读 2 个数据,按行写入,共 3 2行。需读取 3 行。
Warning
end-of-file in data read[1]
2
5.5
0
0
JIK,3,2
(3f6.1)
1
1.1
2.2
3.3
每行读 3 个数据,按行写入,共 3 2行。需读取 2 行。
2
4.4
5.5
6.6
JIK,3,2
(4f6.1)
1
1.1
2.2
3.3
每行读 4 个数据,按行写入,共读取 2 (第二行读 2 个数据)[2]
2
0
4.4
5.5
注: [1] 数据文件中每行有 3 个数据,由于每行读入的数据不到 3 个,后面的多余数据将不被读入,最终导致数据不够的警告。未读取的数组元素,默认值为 0.
[2] 数据文件中每行有 3 个数据,每行要求读入 4 个数据,超过 3 个的以 0 补足。
IJK,n1,n2
对目标数组写入方式:IJK 表示下标变化的顺序,默认按列写入。
IJK: 数组 AA 要写入的行数,列数;按列逐个值写入,写满要写的行列为止。
JIK: 数组 AA 要写入的列数,行数,按行将单个值写入 (FORTRAN 默认先写列,JIK 表示先写行)

AA 数组中的读取结果

IJK,2,3
(3f6.1)
1
1.1
3.3
5.5
每行全读,按列写,
2 3 列。
2
2.2
4.4
6.6
IJK,1,2
(3f6.1)
1
1.1
2.2
0
每行全读,按列写,
1 2 列。
2
0
0
0
JIK,2,1
(3f6.1)
1
1.1
2.2
0
每行全读,按行写,
2 1 行。
2
0
0
0
JIK,3,1
(3f6.1)
1
1.1
2.2
3.3
每行全读,按行写,
3 1 行。
2
0
0
0
JIK,3,1
(2f6.1)
1
1.1
2.2
4.4
每行读 2 个值,按行写,共 3 1
2
0
0
0
JIK,3,1
(f6.1)
1
1.1
4.4
0
每行读 1 个,只读到 2 个,少 1 个。
Warning
end-of-file in
data read
2
0
0
0
IJK,2,2
(2f6.1)
1
1.1
2.2
0
每行读 2 个值,按列写,共 2 2 列。
2
4.4
5.5
0
IJK,2,5
(3f6.1)
1
0
0
0
Waring:
AA does not
have enough
columns - 5 超过AA 定义的列数。
2
0
0
0
上述方法仅对 Array 有效,如果是对表 (Table),由于 *VREAD 不能直接对表的 0 行、0 列读入数据,因此上述方法受到限制。向 Table 中读入数据时,可以参考如下命令流或改用 *Tread 命令:
! 如何向 array 或 table 中读入数据
fini
/clear
/prep7
*del,all
n=10 ! 数据行数
!
! 方法 1
*dim,aa,array,n,2,1
*cfopen,test,dat ! 打开数据文件 test.dat
*vread,aa,test,dat, ,jik,2,10,1 ! 对于 array,使用 *vread 读入数据,需要格式说明
(f12.0,f12.4)
*cfclos ! 关闭数据文件 ! 可以正确读入数据
*dim,cc,table,n,1,1 ! table 下标从 0 开始,
! 这样定义实际为 (n+1) 行 * 2 列
*do,i,1,n ! 将 aa 的数据传送到 cc
cc(i-1,0)=aa(i,1)
cc(i-1,1)=aa(i,2)
*enddo ! 结果正确
! 方法 2
*dim,bb,table,n,1,1 ! table 下标从 0 开始,
! 这样定义实际为 (n+1) 行 * 2 列
*cfopen,test,dat
*tread,bb,test,dat, ,0 ! 实际读入 n 行数据,存放在到第 1 到 n 行
! 对于表,用 *tread 读入数据,不要格式说明
*cfclos ! 可以正确读入数据到下标大于 0 的各表项中
! 方法 1, 需要多用一个 Array,但是定义表的 0 行、0 列可以使用;
! 方法 2, 表的第 0 行和第 0 列不能使用,如要使用,需单独赋值。
数据文件 test.dat 中的数据:
0, 0.01
1,10.11
2,20.22
3,30.33
4,40.44
5,50.55
6,60.66
7,70.77
8,80.88
9,90.99

我的更多文章

下载客户端阅读体验更佳

APP专享