在使用ANSYS进行建模计算时,因每次都需要删除不同的部分进行建模,采用了循环,每次计算完毕,输出结果后将原有的模型进行清除后再重新计算,目标是将每次循环的结果输出到一个文件中,但每次都只有最后一次输出的结果,以下为输出部分的命令流
每次循环结束后只有最后一次的结果
/post1
!从ANSYS中导出模态频率及振型数据,输出
*GET,FREQ1,MODE,1,FREQ !获取第1阶频率,存入变量FREQ
*GET,FREQ2,MODE,2,FREQ !获取第2阶频率,存入变量FREQ
*GET,FREQ3,MODE,3,FREQ !获取第3阶频率,存入变量FREQ
*dim,JG,array,9,9
*cfopen,JG,txt
F1=FREQ1
F2=FREQ2
F3=FREQ3
*VWRITE,k,f1,f2,f3
(1f2.0,x,f6.3,x,f6.3,x,f6.3)
*cfclose
循环三次后,输出的结果只有第三次的
一开始在每次计算完成后,都采用/clear命令将模型进行清除,此感觉此命令将输出结果也一起清除,后面采用的是删除模型的命令
/prep7
Dldele,all,all
Ddele,all,all
Vclear, all ! 表示清除线单元网格
aclear,all
lclear,all
kclear,all
vdele,all,,,1
adele,all,,,1
ldele,all,,,1
kdele,all,,,1
输出结果是一样的
希望能够将所有的结果一次性输出到一个文件中,不被覆盖
基于Monster 组和GPT的调写:
大概率是是因为你每次循环时使用的文件名(JG)相同引起的。
你可以在循环中使用循环计数器来生成不同的文件名。
如下:
*DO,i,1,3 ! 假设循环3次
/post1
! 从ANSYS中导出模态频率及振型数据,输出
*GET,FREQ1,MODE,1,FREQ !获取第1阶频率,存入变量FREQ
*GET,FREQ2,MODE,2,FREQ !获取第2阶频率,存入变量FREQ
*GET,FREQ3,MODE,3,FREQ !获取第3阶频率,存入变量FREQ
*dim,JG,array,9,9
*cfopen,result%i%,txt ! 使用循环计数器生成不同的文件名
F1=FREQ1
F2=FREQ2
F3=FREQ3
*VWRITE,k,f1,f2,f3
(1f2.0,x,f6.3,x,f6.3,x,f6.3)
*cfclose
/prep7
Dldele,all,all
Ddele,all,all
Vclear, all ! 表示清除线单元网格
aclear,all
lclear,all
kclear,all
vdele,all,,,1
adele,all,,,1
ldele,all,,,1
kdele,all,,,1
*ENDDO
用了循环计数器%i%来生成不同的文件名(例如result1.txt、result2.txt、result3.txt),因此每次循环输出的结果将保存到不同的文件中,不会被覆盖。
在ANSYS APDL中,可以使用循环控制指令(如 *DO)来执行一系列指令多次,并在循环过程中输出结果。
对于大多数情况,可以使用*VWRITE命令来将结果写入到一个文本文件中,例如:
*DO,i,1,100,1 !从1到100循环 ! 执行一系列命令,然后输出结果到文本文件 /SOLU filename, result.txt, append *VWRITE,i,par1,par2,par3 par1 = ......
par2 = ......
par3 = ......
*ENDDO
在每次循环时,将i, par1, par2, par3的变量值写入到result.txt文本文件中。如果该文件不存在,则创建一个新的文本文件;如果该文件已经存在,参数append指示将结果添加到文件的末尾。
如果要将结果输出到ANSYS APDL的主程序窗口中,可以使用 *PRINT 命令,例如:
*DO,i,1,100,1 /SOLU *PRINT,,'par1 = ',par1,'par2 = ',par2,'par3 = ',par3 par1 = ......
par2 = ......
par3 = ......
*ENDDO
在每次循环时,将输出"par1 = par1_value, par2 = par2_value, par3 = par3_value"到ANSYS APDL的主程序窗口。如果要将结果存储在一个数组中,则可以使用*DIM命令定义数组,例如:
DIM,result_array,100 ! 定义包含100个元素的数组DO,i,1,100,1 /SOLU par1 = ......
par2 = ......
par3 = ......
result_array(i) = par1 + par2 + par3 ! 将结果存储到数组中*ENDDO```
在每次循环时,将par1, par2和par3的值相加,并将结果存储到result_array数组的第i个元素中。在循环结束后,可以使用*SMAT命令来输出整个数组的结果。
参考GPT:您可以将输出结果的命令放在循环外部,使用文件流来实现输出到一个文件中。以下是可能适用于您的命令流的修改建议:
! 设置输出文件名
*cfopen, results.txt, txt
! 循环开始
*do, i, 1, 3
! 在循环内部进行建模和计算
/prep7
Dldele,all,all
Ddele,all,all
Vclear, all
aclear,all
lclear,all
kclear,all
vdele,all,,,1
adele,all,,,1
ldele,all,,,1
kdele,all,,,1
! 进行计算,并将结果存储在变量中
*SOLVE
*GET,FREQ1,MODE,1,FREQ
*GET,FREQ2,MODE,2,FREQ
*GET,FREQ3,MODE,3,FREQ
! 将结果写入文件
F1=FREQ1
F2=FREQ2
F3=FREQ3
*VWRITE,k,f1,f2,f3
(1f2.0,x,f6.3,x,f6.3,x,f6.3)
*enddo
! 关闭文件流
*cfclose
在这个修改后的命令流中,循环的部分仅包括建模、计算和结果存储。每次循环结束后,输出结果的命令并不会清空文件,而是将结果写入文件中。最后,关闭文件流以确保输出结果已保存。
请注意,您需要在循环开始之前使用cfopen命令来设置输出文件名,并在循环结束后使用cfclose命令关闭文件流。
基于bing、GPT部分内容和本人思考总结:
问题原因:
在每次循环结束后,虽然输出了结果到文件中,但是下一次循环又会重新覆盖这个文件,导致最后只有最后一次循环的结果。
解决方法:
可以在循环结束后,将结果写入一个新的文件,每次循环结束后将结果追加到这个文件中,避免被覆盖。
修改后的命令流:
/post1
!从ANSYS中导出模态频率及振型数据,输出
*GET,FREQ1,MODE,1,FREQ !获取第1阶频率,存入变量FREQ
*GET,FREQ2,MODE,2,FREQ !获取第2阶频率,存入变量FREQ
*GET,FREQ3,MODE,3,FREQ !获取第3阶频率,存入变量FREQ
*DIM,JG,ARRAY,9,9
! 每次循环结束后将结果追加到文件中
*CFOPEN,JG,txt,append
F1=FREQ1
F2=FREQ2
F3=FREQ3
*VWRITE,k,f1,f2,f3
(1f2.0,x,f6.3,x,f6.3,x,f6.3)
*CFCLOSE
其中的关键是将文件打开方式设置为“append”,表示每次追加到文件末尾。这样就可以将所有的结果输出到同一个文件中,不会被覆盖。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
出现这个问题的原因是每次循环的结果被写入同一个文件,从而导致前面的结果被覆盖了。解决这个问题的方法是在每轮循环中生成不同的文件名,并将结果写入不同的文件。可以使用系统时钟将时间作为文件名的一部分,以避免重复。
具体实现代码如下:
/post1
!从ANSYS中导出模态频率及振型数据,输出
*GET,FREQ1,MODE,1,FREQ !获取第1阶频率,存入变量FREQ
*GET,FREQ2,MODE,2,FREQ !获取第2阶频率,存入变量FREQ
*GET,FREQ3,MODE,3,FREQ !获取第3阶频率,存入变量FREQ
*dim,JG,array,9,9
!生成文件名,包含当前的系统时间
*cfopen,'JG_' + STRFORMAT('%Y_%m_%d_%H_%M_%S',SYSDATE()),txt
F1=FREQ1
F2=FREQ2
F3=FREQ3
*VWRITE,k,f1,f2,f3
(1f2.0,x,f6.3,x,f6.3,x,f6.3)
*cfclose
上述代码使用了STRFORMAT函数将当前的系统时间格式化为字符串,然后将其和文件名拼接在一起作为文件名使用。这样就可以生成不同的文件名,从而避免了结果被覆盖的问题。
如果我的回答解决了您的问题,请采纳!
*dim, FILENAME, char, 20
FILENAME(1) = 'result1.txt'
FILENAME(2) = 'result2.txt'
FILENAME(3) = 'result3.txt'
*cfopen, FILENAME(I), txt
*VWRITE, k, f1, f2, f3
(1, f2.0, x, f6.3, x, f6.3, x, f6.3)
*cfclose
I = I + 1
*dim, FILENAME, char, 20
FILENAME(1) = 'result1.txt'
FILENAME(2) = 'result2.txt'
FILENAME(3) = 'result3.txt'
I = 1
DO J = 1, 3
! 在这里进行建模计算
*get, FREQ1, MODE, 1, FREQ
*get, FREQ2, MODE, 2, FREQ
*get, FREQ3, MODE, 3, FREQ
*cfopen, FILENAME(I), txt
*VWRITE, k, f1, f2, f3
(1, f2.0, x, f6.3, x, f6.3, x, f6.3)
*cfclose
I = I + 1
ENDDO