間斷保存sav文件以及設置收斂條件
首先感謝西安科技大學魏博對于本文的指導(至今還沒問全名是啥,哈哈,感謝你一直關注著我公眾號的動態)。
我們有時候會遇到這樣一個問題,我們一個工況要算幾天或者十幾天,但是中間某天突然斷電了,自己算的東西全都沒了,還得從頭開始算。這樣如果中間我們保存了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文件。
二、設置收斂條件
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
solve fishhalt命令是可以自己進行收斂條件設定的,后面接的函數返回值是0的話就繼續運行,如果是1的話就停止運行。
這里每次都監測軸向應力值(axial_stress_wall),并且每次都通過math.max得到目前為止的峰值應力(peak_stress)。當進入峰后的時候,測出的軸向應力值<峰值應力*peak_fraction的時候,函數值返回1,計算結束。 這里主要的知識點有兩個,一個是solve fishhalt命令的運用,一個是峰值應力的計算方法,還是非常有借鑒意義的。
當然讀者也可以根據自己的需要進行開發,比如我常用于單元試驗的收斂結構為:
這個道理差不多,就是計算到1.4%應變時截止計算
[stop_me=0]
def stop_me
if weyy<-1.4 then
stop_me=1
endif
end
solve fishhalt @stop_me
這兩個功能在模擬中都是非常實用的,讀者可以根據自己需要,進行開發應用。
最后分享一個可以生成批量調用結果文件并截圖代碼的小程序,也是我自己寫的。
鏈接:https://pan.baidu.com/s/1hcxTkrkjpK3q2skc7C3TPA
提取碼:dvav
復制這段內容后打開百度網盤手機App,操作更方便哦
程序界面很簡單:
輸入sav名字,序號,點擊生成,就會在下面對話框生成,直接復制粘貼到自己程序里面就可以進行調用了,當然也可以自己定義一自處理方法,這里后面有機會再說。
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















