利用RBlock實現“類有限元”可視化
瀏覽:2837 收藏:4
0 引言
PFC的結果往往都是離散化的結果,我們對于結果大部分都是采用ball的一些顯示,比如速度場、位移場等,或者是接觸的一些東西,這些在PFC后處理 中也講到了很多。當然我是支持利用離散化的結果去進行描述的,這點也符合離散元的理論特性。
但是當某些情況下,顆粒的離散化比較大的時候,我們需要將一部分顆粒集合體作為單元來顯示,作為某一部分的結果。這時候就是我們測量圓的概念,這點在很多地方也會遇到,比如式樣內部的應力分布、空隙分布等。這個是單個或者少部分顆粒無法描述的性狀。
這時候或許用有限元那種單元的可視化效果會更加好一點。
1 案例
以一個土體自重沉降的案例為例:
成樣:
model newdef parwidth = 0.2hight = width*2rdmin = 0.009rdmax = 0.006poro = 0.4end@pardomain extent [-width*2.0] [width*2.0] ...[hight*2.0]model random 10001wall generate box [-width*0.5] [width*0.5] ...[hight*0.5] expand 1.5cmat default model linear method deform emod 100e6 kratio 1.5ball distribute porosity @poro ...radius [rdmin] [rdmax] ...box [-width*0.5] [width*0.5] ...[hight*0.5] ...[hight*0.5]ball attribute density 2200 damp 0.7model cycle 2000 calm 10model cycle 1model solveball delete range pos-x [-width] [-width*0.5]ball delete range pos-x [width*0.5] [width]ball delete range pos-y [-hight] [-hight*0.5]ball delete range pos-y [hight*0.5] [hight]ball delete range pos-z [-hight] [-hight*0.5]ball delete range pos-z [hight*0.5] [hight]model save "ball_sample"
沉降:
model restore "ball_sample"model gravity 9.8wall delete walls range id 2model cycle 1model solvemodel save "zizhong"
沉降后的結果如圖;
可以從力鏈上分析這個應力是上小下大的,是一個比較典型的力的分布。
3 繪制
這里使用的概念是,先把計算范圍網格化,然后以網格中心為測中心,最小的長度作為半徑生成測量圓。后面把測量圓的相關數據存到rblock的extra中,ball、clump和rblock這些基礎元素都有這種extra屬性用來存儲用戶自定義的數據。
model restore "zizhong"def create_measure(x_min,x_max,y_min,y_max,z_min,z_max,n_x,n_y,n_z)x_length=(x_max-x_min)/float(n_x)y_length=(y_max-y_min)/float(n_y)z_length=(z_max-z_min)/float(n_z)rad=math.min(x_length,y_length)rad=math.min(rad,z_length)loop local n(1,n_x)x_pos=x_min+x_length*(n-1)+x_length*0.5loop local m(1,n_y)y_pos=y_min+y_length*(m-1)+y_length*0.5loop local k(1,n_z)z_pos=z_min+z_length*(k-1)+z_length*0.5commandmeasure create position [x_pos] [y_pos] [z_pos] radius [rad*0.5]rblock create box [x_pos-x_length*0.5] [x_pos+x_length*0.5] ...[y_pos-y_length*0.5] [y_pos+y_length*0.5] ...[z_pos-z_length*0.5] [z_pos+z_length*0.5]endcommandendloopendloopendloopend@create_measure([-width*0.5],[width*0.5],[-hight*0.5],[hight*0.5],[-hight*0.5],[hight*0.5],2,4,4)def get_dataloop foreach mp measure.listid=measure.id(mp)rb=rblock.find(id)rblock.extra(rb,1)=measure.stress.zz(mp)endloopend@get_data
這里存儲了z向的應力,測量圓分布如圖:
把rblock的相關顯示設置為:
與其相對應的rblock的效果為:
隱藏掉measure:
換種顯示方式可以得到如下的結果:
配位數的分布如圖:
本案例以方形的簡單算例進行了計算,針對于復雜的模型,也可以先進行三角形或者多邊形的rblock劃分,然后再在rblock位置處生成測量圓的方式去做。理論應該是一致的,這里留給大家自己去拓展。
技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
1
4




















