間斷保存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文件以及設置收斂條件的圖1

    輸入sav名字,序號,點擊生成,就會在下面對話框生成,直接復制粘貼到自己程序里面就可以進行調用了,當然也可以自己定義一自處理方法,這里后面有機會再說。

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

7
6
10