首先感谢西安科技大学魏博对于本文的指导
我们有时候会遇到这样一个问题,我们一个工况要算几天或者十几天,但是中间某天突然断电了,自己算的东西全都没了,还得从头开始算。这样如果中间我们保存了sav文件,比如每隔一定时间保存一个sav,那哪怕断电了还能续算。
我们制作动图的时候需要在计算过程中进行截图,这个需要用plot bitmap命令,但是这个需要在plot中将视图全部打开,这样就会使得计算速度超级无敌慢(慢的不是一星半点,大家可以对比一下)。如果我们中间保存了sav的话,就不需要打开Plot,直接后处理的时候批量调用就可以了。
下面为魏博提供的间断保存文件和设置收敛条件的代码:
[num1 = 0]
[num2 = 1]
[nstep =1000]
def loadhalt_wall
loadhalt_wall = 0
num1 = num1 1
if num1 = nstep then
file_name='result' string(num2) '.sav'
num1 = 0
num2 = num2 1
command
save @file_name
endcommand
endif
local abs_stress = math.abs(axial_stress_wall)
global peak_stress = math.max(abs_stress,peak_stress)
if abs_stress < peak_stress*peak_fraction
loadhalt_wall = 1
end_if
end
[peak_fraction = 0.01]
solve fishhalt @loadhalt_wall
这个函数的功能包括两个部分:
1)每隔nstep个时间步保存一个sav文件;
2)当峰后应力小于峰值应力的0.01时停止计算。
为了方便讲解,我们将函数分成两部分来看。
一、间断保存文件
[num1 = 0]
[num2 = 1]
[nstep =1000]
def loadhalt_wall
loadhalt_wall = 0
num1 = num1 1
if num1 = nstep then
file_name='result' string(num2) '.sav'
num1 = 0
num2 = num2 1
command
save @file_name
endcommand
endif
第一个功能是采用间断跳跃的结构,逻辑是使用两个变量num1和nstep,num1随着计算步不停的累加,当达到nstep值时执行保存文件的函数部分,并且又变成0,重新进行累加。将nstep看做是num1的目标值会好理解一点,num2是统计文件序号的整数,每次保存文件时都会 1,并且当做变量构造文件名字file_name。
这个结构其实我也经常会用到,这里是按时间步数进行保存文件的,当然也可以按照应变量进行保存:
[baocunpinlv=-0.1]
[time_record=weyy 1]
[count=0]
def savefile
if weyy-time_record <= baocunpinlv then
filename=string.build("jieguo%1",count)
command
save @filename
endcommand
time_record=weyy
count =1
endif
end
set fish callback -1.0 @savefile
这里的weyy就是应变,单位是%,这个功能是每隔0.1%应变保存一个sav文件。
当然在基坑等边值问题时候,没有应变这个概念,也可以用时间去表示:
[time_record=mech.age]
[baocunpinlv=1]
def savefile
if mech.age-time_record > baocunpinlv then
filename=string.build("jieguo%1",count)
command
save @filename
endcommand
time_record=mech.age
count =1
endif
end
set fish callback -1.0 @savefile
结构思路其实都一样的,读者可以按照自己的需求,按照自己所需要的变量去保存sav文件。
二、设置收敛条件
solve fishhalt命令是可以自己进行收敛条件设定的,后面接的函数返回值是0的话就继续运行,如果是1的话就停止运行。
这里每次都监测轴向应力值(axial_stress_wall),并且每次都通过math.max得到目前为止的峰值应力(peak_stress)。当进入峰后的时候,测出的轴向应力值<峰值应力*peak_fraction的时候,函数值返回1,计算结束。 这里主要的知识点有两个,一个是solve fishhalt命令的运用,一个是峰值应力的计算方法,还是非常有借鉴意义的。
当然读者也可以根据自己的需要进行开发,比如我常用于单元试验的收敛结构为:
这个道理差不多,就是计算到1.4%应变时截止计算
这两个功能在模拟中都是非常实用的,读者可以根据自己需要,进行开发应用。
最后分享一个可以生成批量调用结果文件并截图代码的小程序,也是我自己写的。
链接:https://pan.baidu.com/s/1hcxTkrkjpK3q2skc7C3TPA
提取码:dvav
复制这段内容后打开百度网盘手机App,操作更方便哦
程序界面很简单:
输入sav名字,序号,点击生成,就会在下面对话框生成,直接复制粘贴到自己程序里面就可以进行调用了,当然也可以自己定义一自处理方法,这里后面有机会再说。