ANSYS APDL循环结果输出

问题遇到的现象和发生背景

在使用ANSYS进行建模计算时,因每次都需要删除不同的部分进行建模,采用了循环,每次计算完毕,输出结果后将原有的模型进行清除后再重新计算,目标是将每次循环的结果输出到一个文件中,但每次都只有最后一次输出的结果,以下为输出部分的命令流

遇到的现象和发生背景,请写出第一个错误信息

每次循环结束后只有最后一次的结果

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
/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

运行结果及详细报错内容

循环三次后,输出的结果只有第三次的

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

一开始在每次计算完成后,都采用/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函数将当前的系统时间格式化为字符串,然后将其和文件名拼接在一起作为文件名使用。这样就可以生成不同的文件名,从而避免了结果被覆盖的问题。
如果我的回答解决了您的问题,请采纳!

根据代码流程,每次循环结束后都会输出结果到文件中,但是文件名是相同的,因此每次输出的结果都会覆盖之前的结果,最终只有最后一次循环的结果被保留。
为了解决这个问题,可以在循环开始前定义一个文件名变量,每次循环结束后将结果输出到该文件中,并将文件名变量更新为不同的文件名,以避免覆盖之前的结果。
具体实现方法如下:
1. 在循环开始前定义一个文件名变量,例如:

*dim, FILENAME, char, 20
FILENAME(1) = 'result1.txt'
FILENAME(2) = 'result2.txt'
FILENAME(3) = 'result3.txt'

这里定义了一个长度为20的字符数组,用于存储文件名。假设需要循环3次,将文件名分别定义为'result1.txt'、'result2.txt'、'result3.txt'。
2. 在循环结束后将结果输出到文件中,并更新文件名变量,例如:

*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

这里使用了一个变量I来表示当前循环的次数,根据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