PFC導入地震波加載

    這串個案例的核心其實有兩個,一個是如何從外部讀取數據,一個是如何將加速度轉化為速度給墻體。

一、外部導入地震波

    我們可以在網頁上搜索經典的地震波曲線,比如下面這個就是百度搜到的([轉載]常用地震波數據匯總(72448地震波-hach.txt)_THheat_新浪博客 (sina.com.cn)):

PFC導入地震波加載的圖1

    其實我們仔細看一下時間的數據是一個等差數列,這是因為采樣的時候我們都是每隔相等的時間采集一個加速度值。所以第一列數據我們是不需要的,我們需要第二列數據的加速度值,可以copy下來存儲為一個txt文件。如下

PFC導入地震波加載的圖2

把這個txt文件放入我們的項目目錄中,后面進行調用。

然后我們看一下導入文件的代碼:

def fileIn    array jiasudu(2000)    fp=file.open.pointer("jiasudu1.txt",0,1)    file.read(jiasudu,1000,fp)    file.close()end@fileIn

    這個其實是比較簡單的,首先我們需要用一個數組(array)來作為容器存儲數據,這個容器的大小肯定是不能比你讀取的數據要小的。

    第二行是打開文件的命令,第二個參數0的意思是這個文件是用來讀取的,第三個參數1的意思是編碼格式,對應的ASCII碼,文本格式的文件讀取都可以用這個,二進制文件用2,fish文件格式用0。

    第三行是讀取文件了,這個100是讀取100個數據。

    讀取完后注意要關閉文件。

二、施加地震波

    加速度對時間積分可以得到速度,這個積分的數值實現研一的數值分析課都學過。我們就簡單的認為某個時間區間內加速度是恒定的,那么:

V2=V1+A*detaT

這里V2為當前時間對應的速度,V1為上一個時間對應的速度,A為加速度,detaT為這兩個時間點間的時間差。

    首先我們可以使用跳躍結構來得到當前時間對應的加速度,即addVel,然后再每個cycle中疊加速度,對于一個cycle來說,時間的差值就是timestep。需要注意的是array里面存放的數據是string,需要用float來轉化為浮點數。



[wp=wall.find(1)][count=1][time_record=mech.age-100][addVel=0]def updataVel whilestepping time=mech.age if time>time_record+0.01 then addVel=jiasudu(count) time_record=time count+=1 endif ; V2=V1+detaT*a    wall.vel.y(wp)= wall.vel.y(wp)+float(addVel)*global.timestepend

我們可以監測一下速度:

def jiance    whilestepping    wallVel= wall.vel.y(wp)end

history deletehistory id 1 @timehistory id 2 @wallVel

solve time 10

可以看一下結果,墻體的變化還是我們所預想的。

PFC導入地震波加載的圖3

因為加速度比較小,而且我們的阻尼系數比較大,所以邊坡的反應并不是很大。邊坡的反應并不是這篇文章的重點,提出的這種加載地震波的方式是可以參考一下的,感興趣的話積分方法可以采用數值分析中介紹的方法去優化。

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

TOP

2
9