0 前言
巖土工程中常用的數(shù)值計算方法主要有有限元法、有限差分法和離散元法等,今天我們要用到的FLAC3D軟件采用的就是有限差分法。有限差分法歷史悠久,其最初的使用甚至可以追溯的第一臺電子計算機(jī)出現(xiàn)之前。有限差分法并不是為了電腦編程而出現(xiàn)的,而是計算機(jī)使用者后來發(fā)現(xiàn)有限差分法易于編程實現(xiàn),使得有限差分法在數(shù)值計算領(lǐng)域得到不斷推廣和進(jìn)一步發(fā)展。
越是彌足珍貴的軟件,外表看上去,往往越是平常無奇,仿真模擬給全身心帶來的幸福,從來也是如此。??????????????? ??????????????????????????????? ? ? ?? --指尖上的仿真
FLAC3D軟件主要用于解決巖土工程問題,由美國的ITASCA公司開發(fā)。ITASCA是1981年由美國明尼蘇達(dá)大學(xué)5位教師聯(lián)合創(chuàng)辦的巖石力學(xué)技術(shù)機(jī)構(gòu),這些創(chuàng)始人當(dāng)初在北美首創(chuàng)了巖石力學(xué)學(xué)科,并組織創(chuàng)立了國際巖石力學(xué)學(xué)會,因此,在業(yè)界ITASCA被認(rèn)為是世界巖石力學(xué)學(xué)科發(fā)源地之一。
接下來介紹一下我們要解決的問題,就是地下硐室或通道結(jié)構(gòu)的錨網(wǎng)噴支護(hù)問題。地下硐室或者通道開挖后引起地層內(nèi)應(yīng)力的重新分布,面臨穩(wěn)定性風(fēng)險,因此需要及時支護(hù),而錨網(wǎng)噴就是常用的方法之一。錨網(wǎng)噴支護(hù)方法自上世紀(jì)60年代以來,已被廣泛采用。錨桿和噴射混凝土與圍巖共同形成一個承載結(jié)構(gòu),可有效地限制圍巖變形的自由發(fā)展,調(diào)整圍巖的應(yīng)力分布,防止巖體松散墜落。它既可以用作施工過程中的臨時支護(hù),也可以在圍巖穩(wěn)定性較好情況下,代替永久支護(hù)或襯砌。該方法在煤礦巷道、地下硐室和公路隧道中都有廣泛應(yīng)用。錨網(wǎng)噴支護(hù)的實景照片和某設(shè)計圖如圖1、2所示。

由于支護(hù)結(jié)構(gòu)數(shù)量多,支護(hù)構(gòu)件間存在復(fù)雜的相互作用,對支護(hù)有效性的分析多借助數(shù)值仿真方法進(jìn)行。目前絕大多數(shù)數(shù)值計算軟件并沒有直接的相應(yīng)內(nèi)置單元來模擬錨桿,而FLAC3D內(nèi)置了cable單元用于模擬錨桿或錨索支護(hù)結(jié)構(gòu),同時其強(qiáng)大的Fish語言允許用戶通過編程實現(xiàn)大量錨桿的自動創(chuàng)建、連接的建立、屬性參數(shù)的設(shè)置等工作,代碼一旦編寫完成只需少量修改即可反復(fù)使用,可以分析不同支護(hù)參數(shù)下的支護(hù)效果以便進(jìn)行參數(shù)優(yōu)化。
本文作者之前在國內(nèi)兩家著名仿真論壇公布了錨網(wǎng)噴支護(hù)的部分代碼,獲得了大量的點擊和關(guān)注,當(dāng)時公布的代碼已經(jīng)進(jìn)行了簡化,并未公開其中錨桿與噴層混凝土間連接的相關(guān)操作。在本文中,將較詳細(xì)的介紹該結(jié)構(gòu)單元節(jié)點上的連接的自動刪除和新建方法,并公開相應(yīng)的核心計算代碼,該部分內(nèi)容對于在模擬中獲得真實的支護(hù)效果非常重要。
本文在接下來的第1節(jié)將介紹FLAC3D中結(jié)構(gòu)單元的部分基礎(chǔ)知識,尤其是單元間連接建立的一般方法,然后介紹在需要建立大量連接時,如何利用內(nèi)置函數(shù)實現(xiàn)連接的建立。在第二節(jié)將介紹一個實例,在實例中具體演示連接的自動建立。第三節(jié)將給出該實例對應(yīng)的完整代碼。有了前面各節(jié)的鋪墊,讀者將更容易理解和掌握第三節(jié)的代碼。
1 FLAC3D中連接的建立
1.1基礎(chǔ)介紹
FLAC3D中的結(jié)構(gòu)單元主要包括:錨桿(錨索)單元(cable)、梁單元(beam)、殼體單元(shell)、襯砌單元(liner)和土工格柵(geogrid)。這些結(jié)構(gòu)單元一般在普通實體單元(zone)表面(圖3)或內(nèi)部建立(圖4),結(jié)構(gòu)單元在創(chuàng)建時單元節(jié)點(node)會自動與鄰近的實體單元建立連接(link)以實現(xiàn)與周圍實體單元的相互作用。結(jié)構(gòu)單元的單元與單元之間也通過節(jié)點(node)上的link實現(xiàn)共同作用。因此,link有兩種類型,即:節(jié)點-實體單元(node-zone)(圖4)、節(jié)點-節(jié)點(node-node)。默認(rèn)情況下不同類型結(jié)構(gòu)單元各自由度的link的類型,如表1所示:


其中,free和rigid分別表示該自由度上可以自由位移和剛性的,SY代表剪切屈服彈簧,NY代表法向屈服彈簧,PY代表樁屈服,PYDP代表依賴彈簧的樁屈服。
當(dāng)有新的結(jié)構(gòu)單元被創(chuàng)建時,會有新的節(jié)點出現(xiàn)在實體單元表面或內(nèi)部,新的節(jié)點與實體單元間會按照表1中的默認(rèn)屬性自動建立node-zone連接,進(jìn)而實現(xiàn)結(jié)構(gòu)單元與實體單元間的相互作用。也就是說,結(jié)構(gòu)單元與實體單元間的相互作用是通過node-zone連接實現(xiàn)的。
1.2 cable與liner的連接
在后面的建模中會利用cable單元模擬錨桿,用liner單元模擬含鋼筋網(wǎng)片的混凝土噴層,因此,在此以cable和liner的連接,演示結(jié)構(gòu)單元間node-node連接的建立方法。
如圖6所示的cable和liner單元,圖中紫色圓圈代表結(jié)構(gòu)單元的node,圓圈內(nèi)數(shù)字表示節(jié)點編號,這些編號是結(jié)構(gòu)單元被創(chuàng)建時自動分配的。圖中節(jié)點57和節(jié)點69被拉開了距離,主要是方便觀察節(jié)點編號,實際建模時兩個node是重合的。需要注意的是:結(jié)構(gòu)單元在被創(chuàng)建時,其節(jié)點會自動與鄰近的zone按表1的屬性建立連接,兩個結(jié)構(gòu)單元的節(jié)點即使重合也不會自動建立連接。
因此,節(jié)點69和節(jié)點57都與liner后的實體單元(zone)自動建立了連接。在人為建立節(jié)點69和節(jié)點57間的連接前需要人為的刪除節(jié)點與zone自動建立的連接。但連接的刪除需要知道link的ID。命令清單提供了連接刪除和建立的方法。


從上述代碼可以看出兩個node間的連接就需要多行代碼才能完成,涉及兩個link的刪除,1個新link的建立以及屬性的設(shè)置多個過程,尤其是當(dāng)創(chuàng)建的連接很多時無法每個節(jié)點都通過print來人為的觀察確定link的ID,這個過程過于繁瑣。所以當(dāng)需要刪除和創(chuàng)建的link數(shù)量多時,必須利用FLAC3D內(nèi)置的Fish語言,通過內(nèi)置函數(shù)來完成相關(guān)操作。
一個成功的分析師,并不只依賴好的軟件,更仰仗厚重的經(jīng)驗。
--指尖上的仿真
一個好的模擬分析,不是所有的操作都依靠鼠標(biāo),而更依賴于鍵盤。很多工作,寫好代碼就讓它自己去算吧……
1.3通過Fish刪除指定坐標(biāo)處liner節(jié)點的link
采用如下代碼完成與cable外端節(jié)點重合的節(jié)點的定位、link的確定以及l(fā)ink的刪除。

代碼片段2中,nd_near(_x0, _y0, _z0)獲得指向位置(_x0, _y0, _z0)處的節(jié)點的指針(圖7中指針1),nd_link(_ndLPTR)則是根據(jù)節(jié)點指針獲得指向該節(jié)點的link的指針(圖7中指針2),此處的link是liner與鄰近的zone間自動建立的連接。lk_id(_lkPTR)則根據(jù)指針2獲得link的ID。命令:seldeletelinkrangeid_linkID根據(jù)link的ID刪除該link。nd_id(_ndLPTR)根據(jù)指向位置(_x0, _y0, _z0)處的節(jié)點的指針1獲得該節(jié)點的ID。
刪除錨桿最外側(cè)靠近liner的節(jié)點上的link,F(xiàn)ish代碼如下:

1.4刪除靠近liner的錨桿節(jié)點的link
刪除錨桿最外側(cè)靠近liner的節(jié)點上的link,F(xiàn)ish代碼如下:

在上述代碼中,由s_near(_x1,_y1,_z1)獲得指向指定坐標(biāo)位置處的結(jié)構(gòu)單元的指針,即獲得指向cable單元的指針,再由該指針獲得該結(jié)構(gòu)單元的cid,然后按照FLAC3D生成cable單元的編號特征,獲得靠近liner的一個節(jié)段的cable單元的cid號,再由該cid號通過s_find函數(shù)獲得指向靠近liner處的cable單元的指針,由該指針通過s_node函數(shù)獲得單元的第一個節(jié)點的指針,由該指針通過nd_id函數(shù)獲得節(jié)點的ID。整個過程相對比較復(fù)雜,可以參考圖8進(jìn)行理解。從圖8中圍巖內(nèi)最內(nèi)側(cè)的錨桿節(jié)點坐標(biāo)(_x1, _y1, _z1)開始,沿著箭頭的方向利用適當(dāng)?shù)膄ish函數(shù),最終可以獲得錨桿最外側(cè)節(jié)點的id。之后刪除這個節(jié)點創(chuàng)建時自動建立的link(對應(yīng)命令:seldeletelinkrangeid_linkID)。

面的代碼看得頭暈,有木有?這個可以有。慢慢理解吧,話說我在寫這個代碼時也是犧牲了很多腦細(xì)胞的。為什么這么繞呢?是因為liner的node與cable的node在錨桿的最外側(cè)節(jié)點(_x0, _y0, _z0)處重合了。通過nd_near(_x0,_y0,_z0)函數(shù)只能獲得重合位置處一個節(jié)點的指針,無法同時獲得另外一個節(jié)點的指針。nd_near()函數(shù)在重合的2個node處是返回哪個node的指針,主要根據(jù)node的創(chuàng)建順序,同一位置處的多個node,哪個先創(chuàng)建的,nd_near()返回指向它的指針。在本文的分析中,liner始終先于cable創(chuàng)建,所以可以利用nd_near()獲得處liner的節(jié)點的指針。而同一位置處cable節(jié)點的指針則需要如圖8中那樣,通過最內(nèi)側(cè)的錨桿結(jié)構(gòu)單元利用fish函數(shù)向外找到最外側(cè)的節(jié)點。
1.5建立cable節(jié)點與liner節(jié)點間的link
建立cable節(jié)點與liner節(jié)點間的link并設(shè)置link屬性,代碼如下:

到此,我們就完成了錨桿與襯砌結(jié)構(gòu)單元間在重疊的節(jié)點處刪除各自原有連接、新建node-node連接并設(shè)置相應(yīng)屬性這一最困難的工作。
2 應(yīng)用實例
接下來將以一個煤礦巷道錨網(wǎng)噴支護(hù)的實例來演示上述結(jié)構(gòu)單元link相應(yīng)操作的實現(xiàn)。某煤礦巷道,其斷面形式為直墻半圓拱型,混凝土噴層和錨桿的布置方式與圖9中接近。錨桿加固的作用是提供局部抵抗巖塊滑動及裂縫開展的剛度。錨桿借助于水泥漿或樹脂藥卷沿其長度方向提供了抗剪能力。錨桿及錨索采用cable單元進(jìn)行模擬。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 我是未完分割線
5 結(jié)語
真實的世界使我感興趣,因為它是可塑的。——法國作家紀(jì)德
仿真世界是另一個有趣的世界,因為你能發(fā)揮自己的想象力和創(chuàng)造力把一些東西從無到有的在那個虛擬世界中創(chuàng)造出來,再賦予它們以屬性,建立它們間的關(guān)聯(lián),觀察它們的發(fā)展…… 那不是很有趣嗎?
一去技術(shù)路,天涯若比鄰。希望每一位CAE愛好者,都能從仿真中獲得樂趣!