PFC顆粒分析第一步:掌握離散元這些成樣方法就夠了!
導讀:PFC是一個關于顆粒的方法,在進行分析的時候我們首先需要做的就是生成一個比較好的式樣,這篇文章從簡單的create開始,介紹規則與隨機顆粒的生成,從create角度去理解generate與distribute的建模思路。之后再介紹基于generate方法的壓縮法、分層壓縮法、分層欠壓法(UCM)、粒徑膨脹法,還有基于distribute的網格法(GM),還會介紹PFC自帶的Brick方法。有集成的命令流,也有自開發的fish,有一些fish還是比較難理解的,對于各位的fish基礎可能會是一個比較大的挑戰。
我個人還是建議各位可以將這文章打印下來好好理解,對于理解離散元和加強fish學習都是一個比較好的機會。
一、最原始的成樣——Create
Create應該是PFC最底層的成樣關鍵詞了,后面所有的成樣關鍵詞都是在這個關鍵詞基礎上建立了。Create的使用也很簡單,只需要指定位置(position)和半徑(radius)就可以了。如圖1便是在我們的軟件中生成一個圓心在原點,半徑0.006的顆粒。
圖1.1:create生成的單個顆粒代碼及結果
最底層的功能有了,在這個功能上我們便可以去構建一些我們需要的功能,對于做結構物的同學來說,往往需要規則排列的顆粒去模擬結構物。最常見的樁梁結構往往是矩形規則排列的顆粒,我們便可以利用fish語言去構建矩形排列和圓形排列的顆粒,如圖2所示。這里面我們使用了ball.create函數,這個函數需要至少兩個參數,第一個是一個浮點型變量,表示顆粒的半徑,第二個是一個vector變量,表示顆粒的位置。
對于巖土專業,我們需要的應該是隨機排列的顆粒,這里也可以使用create實現,我們采用隨機數的概念,加上一些邊界條件便可以實現這個功能。隨機數的概念就不去講了,這里需要理解一下隨機分布的邊界條件:顆粒之間沒有重疊,大重疊會引起很大的速度,所以我們是不會允許顆粒之間有重疊量。這里代碼中有兩個函數,第一個函數用于判定一個位置vector和已經生成的顆粒有沒有重疊量,第二個函數用于在0.2*0.4范圍內生成指定數目指定粒徑的顆粒。
圖1.4:create生成的隨機排列顆粒代碼及結果
到這里很多同學就已經發現了,這不是generate方法嗎?沒錯,是的!genrate的底層就是在create基礎上進行的包裝。下面我們對generate方法進行講述。
二、無重疊的成樣方法—generate
generate方法是在指定區域內生成無重疊的指定粒徑的顆粒,一個最簡單的應用就是對前述create的包裝。
圖2.1:generate生成的隨機排列顆粒代碼及結果
對矩形規則排列的顆粒也有比較好的實現,需要注意的是指定cubic后,number就沒用了,顆粒會鋪滿區域。這個區域指的是圓心在區域內,而不是顆粒整個在區域內,這里建立一個wall box來可視化一下這個邊界,從圖中可以看出我講述的意思。
2.2:generate生成的矩形規則排列顆粒代碼及結果
在巖土材料中,我們一般要指定顆粒的孔隙率和級配,用generate怎么實現呢?因為generate只能生成指定數量,所以我們需要算出級配中每個粒徑顆粒對應的數目。邏輯為:試樣顆粒體積 Vs=(1-poro)*V ,其中poro為孔隙率,V為試樣體積。如果兩個顆粒的質量百分比一樣的話(如果密度一樣,體積百分比也一樣),兩個粒徑的顆粒體積為 Vs1=Vs2=Vs*0.5 。一個顆粒的體積為 pi*r*r ,這樣顆粒數為 Vs1/(pi*r*r)。于是乎命令流為:
圖2.3:generate生成的指定孔隙率顆粒的代碼
運行上述代碼時我們發現了報了一個警告:
這個警告告訴我們顆粒數目沒有達到指定的數目,我們看一下模型圖:
圖2.5:模型圖
通過模型我們可以發現,0.006粒徑的顆粒基本上可以了,但是0.009粒徑的顆粒卻只有4個,遠遠沒有滿足要求。這里原因可以去理解一下我create生成隨機分布的代碼,里面設定了一個數字是20000,這個數字代表著在找不重疊的位置的時候,只會尋找20000次,超過這個次數便放棄生成這個顆粒。generate里面也是一樣的,默認搜索次數是20000,對應的關鍵詞是tries。
所以暴露出了generate方法的一個缺點了,就是很難在生成指定孔隙率的顆粒,原因是在指定空間中,不足以生成指定數目指定粒徑的顆粒。那有沒有解決的辦法呢?當然是有的,對應上述三個邊界條件——“指定空間"、”指定粒徑“、”指定數目“,產生三種方法。我們一個個來講。
三、“指定空間”的解決辦法——壓縮法
壓縮法的概念是,保持粒徑不變,我先將區域放大,然后移動墻體,使其移動到指定的區域面積。以下為這個邏輯的demo,區域放大系數為5.0,也就是先將區域放大五倍,然后移動上部墻體,移動4.0倍的區域距離。下為壓縮法的代碼:
圖3.1:壓縮法代碼
首先我們在一個比較大的范圍內生成顆粒:
圖3.2:壓縮前模型
之后壓縮到指定的尺寸:
圖3.2:壓縮后模型
可以看出來,雖然生成了指定數目的顆粒了,但是試樣在上方比較密,在下方比較松,這樣必然會導致試樣的不均勻性,于是很多學者對其進行了拓展,基本的拓展方法為分層壓縮法。分層壓縮法將壓縮分成好幾層,這樣由于壓縮底部的空隙被分擔到每層中,式樣的均勻性就有了很大的提高。
圖3.3:分層壓縮法代碼
這里分5次成樣,下面給出執行中的試樣狀態:
很多學者對于壓縮時候的能量傳遞進行研究,認為由于壓縮能的影響,下部的顆粒在成樣的時候應該松一點,上部的顆粒應該密一點。這時候我們可以改變孔隙率實現這個想法,具體為:如分5層,則5層的孔隙率為 1.08*poro,1.04*poro,poro,0.96*poro,0.92*poro。這個可以根據試樣的情況去調。也有一些學者對孔隙率的值進行了定值研究,國內比較著名的就是分層欠壓法UCM(蔣)。
所謂的UCM法基本的概念為其認為壓縮的時候墻體對于顆粒有壓縮能,壓縮能的存在導致了分層壓縮的時候,上部顆粒會相對較松,而下部較密。這個概念當然是早就有了,UCM的創新之處在于其提出了孔隙率隨著層數的分布,有一個初始欠壓比的概念,通過調整初始欠壓比,便可以實現對所有層孔隙率的調整。下面給出分層欠壓法的代碼:
這里的u0決定了孔隙率的分布,u0等于1.0時,孔隙率的分布為(注意我們目標孔隙率為0.25):
圖3.6:分層欠壓法孔隙率分布
圖3.7:分層欠壓法結果
四、“指定粒徑“的解決辦法——粒徑膨脹法
這個思路就是先將粒徑減小,生成指定數目后,再將粒徑增大。這里給出demo,這里定義了膨脹系數為5.0,就是先將粒徑減小五倍,之后再放大。
圖4.2:粒徑膨脹法粒徑放大前
圖4.3:粒徑膨脹法粒徑放大后
這個方法的概念比較簡單,就不多贅述了。
五、“指定數目“的解決辦法——“強行塞”
這個思路什么意思呢,就是我這里不管你的重疊量了,我直接往區域內塞入指定數目的顆粒,力學平衡后形成我們的式樣。
圖5.1:“強行塞”代碼
在未平衡前,式樣狀態為:
圖5.2:“強行塞”平衡前
圖5.2:“強行塞”平衡后
到這里可能很多同學已經發現了,這個形成方法不就是ditribute嗎?是的沒錯,distribute正是基于這樣的思路建立起來的,下一節我們就介紹一下ditribute的用法。
六、指定級配孔隙率的成樣方法——distribute
distribute方法是專門用來生成級配式樣的,就目前來看可以說是最便捷的方法了。下面我們就使用distribute來生成我們上面的式樣。這個方法用的人比較多了,就不去敘述了。
圖6.1:distribute成樣代碼和模型
下面我們講一下distribute 的進階,distribute在顆粒數比較多的時候,效果不是很好,會因為顆粒分布不均勻導致的不均勻性。為了克服這個缺點,有學者引入了GM法,這個方法是用網格的形式去生成顆粒,代碼如下,這里不去過多的講解,可以參考一下相關的文獻。
圖6.3:GM法結果模型
可以發現這個方法生成的顆粒數比預想的要低,這是因為我這里顆粒數比較少,在生成的時候產生了較大的誤差。
到這里又熟悉了,想到了PFC中的Brick方法。
七、超級快速的大模型成樣方法——Brick
就像其意思一樣,Brick方法是先生成滿足條件的一個小塊,然后用這個小塊拼湊起整個模型。這個東西牛逼的是計算速度,上面的分層法計算一次基本上都需要十幾分鐘左右,但是brick方法只需要1秒!
Brick分為兩部分:
(1)首先生成基本的磚頭,注意這里的domain必須是周期邊界,并且大小就是磚頭的大小
(2)之后利用brick關鍵詞進行組裝
圖7.2:一個Brick
圖7.3:組裝完成后的Brick
可以發現Brick方法是對一部分可以的重復復制,所以計算量會小很多,我這里的數目比較少,可能效果不是特別好。Brick方法和GM法是類似的,但是GM法在每個網格中都有不一樣的隨機數,這樣不會產生Brick方法中魚鱗狀的效果,我認為相較于Brick方法,可能GM法更加適用于我們的巖土類材料。
八、寫在最后
以上便是我總結出來的PFC成樣方法了,從底層到頂層都過了一遍,但是我這里只使用了兩個粒徑,對于多粒徑的方法讀者可以在理解后自行擴充,distribute相關的方法還是比較容易的,generate相關的方法各位還是得費點心思。
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















