第2种方法将Ansys计算结果(比如加速度值)写为fre文件的命令流
- /POST26
- NSOL,2,231,U,Z,UY_2 ! 定义第二个变量为UY_2,值为10号节点Y方向的位移,节点可任选,但要保证其值非0
- XVAR,1 ! 定义时间变量为坐标横轴
- PLVAR,2
- *GET,num_var,VARI,0, NSETS ! 将变量长度值赋给变量num_var
- k=num_var
- *DIM,SYSNOISE_TITLE,CHAR,5,4
- SYSNOISE_TITLE(1,1)='SYSNOISE '
- SYSNOISE_TITLE(1,2)=' ACCELER '
- SYSNOISE_TITLE(1,3)='ATIONS '
- SYSNOISE_TITLE(1,4)=' FILE'
- SYSNOISE_TITLE(2,1)='Rev 5.5 '
- SYSNOISE_TITLE(2,2)=' IBM P2E '
- SYSNOISE_TITLE(2,3)='SSL 11'
- SYSNOISE_TITLE(2,4)='-AUG-02 '
- SYSNOISE_TITLE(3,1)='ACCELERA'
- SYSNOISE_TITLE(3,2)='TION_St'
- SYSNOISE_TITLE(3,3)='ructure '
- SYSNOISE_TITLE(4,1)='11-AUG-2002 '
- SYSNOISE_TITLE(4,2)=' 10:07 '
- SYSNOISE_TITLE(4,3)=':13 '
- SYSNOISE_TITLE(5,1)='TIME'
- *CFOPEN,ACCE1,fre ! 定义数据结果文件,ACCE.fre
- *VWRITE,SYSNOISE_TITLE(1,1) ,SYSNOISE_TITLE(1,2) ,SYSNOISE_TITLE(1,3) ,SYSNOISE_TITLE(1,4)
- %C%C%C%C
- *get,nmax,node,,num,max, !得到节点编号的最大数
- kk=nmax*3+1
- *DIM,T_U,ARRAY,k,kk! 定义保存时间历程结果的矩阵T_U,有num_var行,kk列
- VGET,T_U(1,1,1),1 ! 矩阵的第一列保存第一个时间历程变量(默认为TIME)
- *dim,num_t,,1,5 !定义一个数组
- *DIM,SYSNOISE_SUBT1,CHAR,1,4
- SYSNOISE_SUBT1(1,1)='NODAL AC'
- SYSNOISE_SUBT1(1,2)='CELERATI '
- SYSNOISE_SUBT1(1,3)='ON VALU'
- SYSNOISE_SUBT1(1,4)='ES'
- s=1
- *do,j,1,nmax,1
- NSOL,2,j,U,X,UX ! 定义第二个变量为UX,值为j号节点X方向的位移
- DERIV,3,2,1,,,,,1 ! 将位移对时间求导,得到速度,存为变量3
- DERIV,4,3,1,,,,,1 ! 将速度对时间求导,得到加速度,存为变量4
- s=s+1
- VGET,T_U(1,s,1),4 ! 矩阵的第s列保存第四个时间历程变量,j号节点X方向的加速度时间历程结果
- NSOL,5,j,U,Y,UY ! 定义第5个变量为UY,值为j号节点Y方向的位移
- DERIV,6,5,1,,,,,1 ! 将位移对时间求导,得到速度,存为变量6
- DERIV,7,6,1,,,,,1 ! 将速度对时间求导,得到加速度,存为变量7
- s=s+1
- VGET,T_U(1,s,1),7 ! 矩阵的第s列保存第7个时间历程变量,j号节点Y方向的加速度时间历程结果
- NSOL,8,j,U,Z,UZ ! 定义第8个变量为UZ,值为j号节点Z方向的位移
- DERIV,9,8,1,,,,,1 ! 将位移对时间求导,得到速度,存为变量9
- DERIV,10,9,1,,,,,1 ! 将速度对时间求导,得到加速度,存为变量10
- s=s+1
- VGET,T_U(1,s,1),10 ! 矩阵的第s列保存第10个时间历程变量,j号节点Z方向的加速度时间历程结果
- *enddo
- *do,i,1,k,1
- num_t(1,1)=T_U(i,1,1) !按次序取TIME值
- *VWRITE,num_t(1,1)
- %20.8E
- *VWRITE,SYSNOISE_SUBT1(1,1) ,SYSNOISE_SUBT1(1,2) ,SYSNOISE_SUBT1(1,3) ,SYSNOISE_SUBT1(1,4)
- %C%C%C%C
- s=1
- *do,j,1,nmax
- s=s+1
- num_t(1,2)=T_U(i,s,1) !将与i对应的j节点的X加速度值赋给num_t的第2列
- s=s+1
- num_t(1,3)=T_U(i,s,1) !将与i对应的j节点的Y加速度值赋给num_t的第3列
- s=s+1
- num_t(1,4)=T_U(i,s,1) !将与i对应的j节点的Z加速度值赋给num_t的第4列
- num_t(1,5)=j
- *VWRITE,num_t(1,5),num_t(1,5),num_t(1,2),0,num_t(1,3) ! 将时间历程结果数据写到数据结果文件中,0为虚部及旋转加速度值
- %10I%10I%20.8E%20.8E%20.8E
- *VWRITE,0,num_t(1,4),0
- (20X,E20.8,E20.8,E20.8)
- *VWRITE,0,0,0
- (20X,E20.8,E20.8,E20.8)
- *VWRITE,0,0,0
- (20X,E20.8,E20.8,E20.8)
- *enddo
- *IF,i,EQ,k,THEN
- *EXIT
- *ENDIF
- *VWRITE,SYSNOISE_TITLE(1,1) ,SYSNOISE_TITLE(1,2) ,SYSNOISE_TITLE(1,3) ,SYSNOISE_TITLE(1,4)
- %C%C%C%C
- *enddo
- *CFCLOS
- FINISH
复制代码
该方法与上次传的相比:计算量大大减少、因此速度要快!
因为第一种方法每写一步数据,变量需要计算一次。第2种方法是变量一次计算完毕,然后将结果保存在数组里,需要写时再提取。但其缺点是当时间步很多、而且模型节点数庞大时需要非常大的数据存储空间。
将Ansys瞬态计算的加速度值写为fre文件后,在Sysnoise里通过FEA可以加上加速度边界条件,然后进行时域计算。
但Sysnoise时域计算好象不能求解场点声压值?不知为何? |