榮光旭,彭 艷,田 凱
(1. 安徽工業(yè)經(jīng)濟職業(yè)技術(shù)學(xué)院 地質(zhì)與建筑工程學(xué)院,安徽 合肥 230051;2. 中國地質(zhì)調(diào)查局成都地質(zhì)調(diào)查中心,四川 成都 610081)
邊坡穩(wěn)定性分析計算的目的是為了判斷邊坡穩(wěn)定狀態(tài)進而對發(fā)展趨勢做出預(yù)測,以防止災(zāi)害的發(fā)生. 強度折減法是邊坡穩(wěn)定性分析的方法之一,它通過定義當(dāng)前土體強度與避免結(jié)構(gòu)破壞所需的最小抗剪強度之比來計算安全系數(shù),或者可定義為即將發(fā)生破壞時,在Mohr-Coulomb破壞準則下的土體強度最小值.
有限元強度折減法(Strength Reduction Finite Element Method,SRFEM)理論首先由Zienkiewicz O.C[1]提出. SRFEM可應(yīng)用于非均值材料,如土體破壞的研究[2],但主要還是應(yīng)用于邊坡穩(wěn)定性分析[3]. Yuan等[4]根據(jù)邊坡土體內(nèi)聚力折減參數(shù)和內(nèi)摩擦角折減參數(shù)的比值不同,提出了基于雙參數(shù)的折減方式,唐芬等[5]等討論了黏性土和砂土c,φ不同的衰減速度,陳國慶等[6]研究了邊坡強度折減的范圍,Griffiths D.V等[7]提出了邊坡失穩(wěn)判據(jù),曹先鋒等[8]提出了基于溫控參數(shù)的強度折減有限元法; 孫超偉等[9]利用強度折減法基于Hoek-Brown準則提出了一套邊坡穩(wěn)定性分析的圖表法求解思路; 朱文煒等[10]綜合分析了強度折減法與重度增加法對穩(wěn)定性系數(shù)的影響; 李寧等[11-12]利用二分法來求解邊坡的安全系數(shù),同時利用Fortran編制程序并結(jié)合“基于場變量的有限元強度折減法”實現(xiàn)了ABAQUS的二次開發(fā). Wei等[13]完成了單排樁加固的強度折減分析,Shi等[14]以等效塑性應(yīng)變帶連接作為破壞準則,利用SRFEM研究了鋼管樁加固前后土坡的安全系數(shù),Mohammad Reza Arvin等[15]利用SRFEM考慮了三維模型的情形下,對采用了土工格柵加固的邊坡的安全系數(shù)進行了研究,同時對影響邊坡穩(wěn)定的主要因素進行了分析,Mehdipour I等[16]用極限平衡水平切片法分析了土工格柵加筋邊坡的穩(wěn)定性. 以上研究均從不同角度利用強度折減法對穩(wěn)定性系數(shù)的求解過程進行了論述,但是關(guān)于如何在建模以及邊坡穩(wěn)定性分析過程中進行控制以利于計算過程的收斂,以及在邊坡參數(shù)化建模分析等研究方面未做分析.
ABAQUS是一款功能強大的有限元模擬軟件. 曹偉等、 張文東等、 秦宇等、 冷伍明等、 竇遠明等[17-21]基于ABAQUS平臺利用UMAT子程序及Python腳本分別完成了凍土蠕變模型、 材料裂紋模擬、 切削仿真模擬的二次開發(fā),驗證了Python腳本程序完成二次開發(fā)的可行性. 但是,利用Python編寫腳本程序在ABAQUS中實現(xiàn)邊坡穩(wěn)定性分析的研究較少. 本文基于ABAQUS平臺,利用具有高效率數(shù)據(jù)結(jié)構(gòu)的Python語言進行二次開發(fā),基于Mohr-Coulomb破壞準則,利用Python中字符串索引方式修改關(guān)鍵字,完整討論了程序編寫過程及要點,實現(xiàn)了基于場變量邊坡穩(wěn)定性系數(shù)的自動提交分析計算. 通過工程實例驗證了程序的可行性.
根據(jù)邊坡失穩(wěn)的定義,利用有限元強度折減法計算邊坡穩(wěn)定性系數(shù)有多種不同的解釋. 本文采用常用的三種判據(jù):
1) 塑性區(qū)從坡腳至坡頂貫通;
2) 數(shù)值求解不收斂;
3) 用戶定義的某個節(jié)點出現(xiàn)大變形,即突變點,通常用于分析具體問題.
以上三種判據(jù)盡管存在不足[22-25],但是經(jīng)過不斷改進[26-27],在理論方面和實踐方面均取得良好的效果. 塑性區(qū)貫通和位移突變點所得穩(wěn)定性系數(shù)相差不大,據(jù)文獻[27]可知,以位移突變標準作為失穩(wěn)判據(jù)有其合理性,因此,本文以邊坡特征點位移突變點作為失穩(wěn)的評價標準.
在外荷載不變的情況下,強度折減法認為邊坡失穩(wěn)主要是巖土體的剪切破壞. 在極限狀況下,邊坡內(nèi)巖土體自身抗剪強度與巖土體抵御外荷載所發(fā)揮的最低抗剪強度的比值定義為邊坡整體穩(wěn)定性系數(shù). 基本原理是將c,φ同時折減,折減后的抗剪強度參數(shù)可表示為
cm=c/Fr,
(1)
(2)
式中:c和φ是土體所能提供的抗剪強度;cm和φm是維持平衡所需要的或者土體實際發(fā)揮的抗剪強度;Fr是折減系數(shù).計算過程中不斷增加Fr,當(dāng)邊坡達到臨界狀態(tài)時,折減系數(shù)Fr就是邊坡穩(wěn)定性系數(shù)Fs.
ABAQUS是巖土工程領(lǐng)域常用的有限元軟件之一. Python作為面向?qū)ο蟮母呒壵Z言,亦是ABAQUS內(nèi)核腳本語言. ABAQUS為用戶提供了Python接口,用戶可以利用Python繞過ABAQUS/CAE GUI,從而直接進行內(nèi)核操作.
ABAQUS中未預(yù)置強度折減法,在進行邊坡穩(wěn)定性分析時,每次都需要將巖土體材料參數(shù)值及折減后的值代入進行試算,在滿足前述失穩(wěn)判據(jù)時得到最終邊坡的穩(wěn)定性系數(shù)值,效率較低. 對于幾何形狀相同但是特征參數(shù)變化的邊坡穩(wěn)定性分析,可以在ABAQUS中預(yù)先定義場變量,將土體材料黏聚力及內(nèi)摩擦角隨場變量折減,只需要一次提交即可完成計算過程,避免了重復(fù)仿真工作,實現(xiàn)了參數(shù)化分析,大大提高了工作效率.
當(dāng)通過定義材料參數(shù)值隨場變量變化的程序進行分析時,需要編輯修改關(guān)鍵字,在關(guān)鍵字中添加關(guān)于場變量的描述語句. 本文擬通過字符串索引方式,利用字符串修改添加分析步中場變量變化范圍語句,真正實現(xiàn)自動提交分析. 本文討論邊坡穩(wěn)定性分析中前處理及后處理模塊中所有步驟的二次開發(fā)代碼,采用圖1 所示的結(jié)構(gòu)框架.
圖1 穩(wěn)定性計算流程圖
邊坡穩(wěn)定性分析二次開發(fā)基本思路是:前處理時建立集合Set,用于邊界條件的設(shè)定; 在定義材料屬性時設(shè)置場變量為1,并在0.5~2范圍內(nèi)變化; 修改關(guān)鍵字,將定義場變量語句添加到inp文件中; 計算完成后得到所需的數(shù)據(jù)及圖件.
本文以二維邊坡建模分析為例,所用環(huán)境如下:ABAQUS平臺版本為6.13版本,Python為Anaconda自帶的Python3.7,編譯器采用PyCharm社區(qū)版. 因部分代碼書寫形式在ABAQUS6.13和6.14版本有所區(qū)別,且Python2.6和Python3.7版本語法形式亦有所不同,故此處寫明代碼適用版本. 以文獻[28]中燕山集滑坡為例,該滑坡位于重慶市萬州區(qū)燕山集鎮(zhèn),平面形狀呈“長舌狀”,高程405 m~406 m,前緣至燕山場鎮(zhèn)沿江公路邊,剪出口高程為328 m~329 m 左右. 縱向長305 m,橫向?qū)捈s155 m,如圖2 所示. 該滑坡相關(guān)參數(shù)見表1.
(a) 地理位置
(b) 現(xiàn)場示意圖
表1 燕山集滑坡物理力學(xué)指標及幾何參數(shù)
導(dǎo)入abaqus,abaqusConstants,visualization模塊以便腳本訪問對象并可以使用對象成員和函數(shù). 需要導(dǎo)入的模塊較多,此處僅列舉幾個:
from abaqus import *
import regionToolset
此處可以使用changeKey更改模型名稱,但需注意命名空間,代碼如下:
myMdb.models.changeKey(fromName=“Model-1”,toName=“slope”)
slopeModel=mdb.models[“slope”]
模型的建立需導(dǎo)入sketch和part模塊,因為是二維模型,所以只需要依據(jù)實際幾何模型建立點與點之間的連線后成為規(guī)則的圖形,部分代碼如下:
slopeSketch=slopeModel.ConstrainedSketch(name=“2D_slope_sketch”, sheetSize=10.0)
slopeSketch.Line(point1=(0,0),point2=(305.0,0))
slopeSketch.Line(point1=(305.0,0),point2=(305.0,16.0))
…
slopeSketch.Line(point1=(0,78),point2=(0,0))
為了作圖方便,也可以通過ConstructionLine和FixedConstraint建立輔助線及約束.
對材料命名并利用Material對象中的Density和Elastic對土體材料賦值,同時定義材料的c,φ隨場變量的變化. 源碼如下:
slopeMaterial.Denstity(table=((1.958,),))
slopeMaterialElastic(table=((100E6,0.30),))#彈性模量100 MPa,泊松比0.30
slopeMaterial.MohrCoulombPlasticity(dependencies=1, table=((18.208 4,0,0.5),(12.369 0,0,0.75),(9.34,0,1),(7.495 8,0,1.25),(6.257 4,0,1.5),(5.369 2,0,1.75),(4.701 2,0,2)))
slopeMaterial.MohrCoulombPlasticity.MohrCoulombHardening(dependencies=1,table=((19.62,0,0.5),(13.08,0,0.75),(9.81,0,1),(7.848,0,1.25),(6.54,0,1.5),(5.606,0,1.75),(4.905,0,2)))
后兩句代碼是定義變化范圍0.5~2的場變量,并根據(jù)式(1)、 式(2)計算得出不同場變量下的c,φ值. 本部分代碼在書寫時需注意所有數(shù)據(jù)為元組(tuple)形式,當(dāng)僅有一個數(shù)據(jù)時,后面一定要有逗號.
通過HomogeneousSolidSection對截面命名,并指定材料名稱為前述名稱,對整個區(qū)域賦予截面屬性,部分代碼如下:
slope_region=(slope.faces,)
slopePart.SectionAssignment(region=slope_region,sectionName=“slopesection”,offset=0.0,offsetType=MIDDLE_SURFACE,offsetField=“”,thicknessAssignment=From_Section)
利用根裝配(rootAssembly)對象中的Instance方法將多個部件裝配為一個實體,并命名,代碼如下:
slopeInstance=slopeModel.rootAssembly.Instance(name=“slope instance”,part = slopePart,dependent = ON)
在定義分析步步驟中,定義兩個分析步,分別命名為“l(fā)oad”,“reduce”; 增加輸出結(jié)果場變量“FV”:
slopeModel.StaticStep(name=“l(fā)oad”,previous=“Initial”, initialInc=0.1, matrixSolver=DIRECT, matrixStorage = UNSYMMETRIC)#定義分析步“l(fā)oad”
slopeModel.StaticStep(name=“reduce”,previous=“l(fā)oad”,initialInc=0.1,matrixSolver=DIRECT,matrixStorage = UNSYMMETRIC)#定義分析步“l(fā)oad”
slopeModel.fieldOutputRequests.changeKey(fromName=“F-Output-1”,toName=“selected field outputs”)
slopeModel.fieldOutputRequests[“selected field outputs”].setValuesInStep(stepName=“reduce”,variables=(“S”,“PE”, “PEEQ”,“PEMAG”,“LE”,“U”,“RF”,“CF”,“CSTRESS”,“CDISP”,“FV”))#增加“FV”
ABAQUS中已經(jīng)自定義initial分析步,本步驟中設(shè)置初始增量步為0.1,將Matrix storage選擇為非對稱分析(UNSYMMETRIC).
在定義邊界條件時,需要用到區(qū)域(regions), 它可以是集合、 表面對象或臨時區(qū)域?qū)ο骩29]. 本節(jié)使用findAt方法查找邊(edge),findAt方法的參數(shù)可以是邊上的任意一點,返回值為包含該點ID的對象邊,然后即可對邊施加位移約束. 在邊坡穩(wěn)定性分析中,一般左、 右邊界均限制水平位移,邊坡底部限制水平和縱向兩個方向的位移. 以下僅列舉左邊界限制水平位移的代碼[30-31]:
left_edge=slopeModel.rootAssembly.instances[“slope instance”].edges.findAt(((0,40.0,0),))#查找左邊界上的點
left_region=regionToolset.Region(edges=left_edge)#確定左邊界
slopeModel.DisplacementBC(name=“l(fā)eftBC-1”,createStepName=“reduce”,region=left_region,u1=0.0,u2=UNSET,ur3=UNSET, amplitude=UNSET,fixed=OFF,distributionType=UNIFORM,fieldName=“”,localCsys=None)#u1=0.0即為限制水平位移,底部邊界為u1=0.0,u2=0.0
邊坡的重力載荷通過施加體力的方式來實現(xiàn). 對所有區(qū)域施加體力,需首先利用findAt方法確定面(face),同樣地,參數(shù)可以是面上任意一點,然后通過regionToolset賦給相應(yīng)區(qū)域,施加體力. 代碼如下:
Body_Force_faces=slopeModel.rootAssembly.instances[“slope instance”].faces.findAt(((120,43,0),))
Body_Force_region=regionToolset.Region(faces=Body_Force_faces)
slopeModel.BodyForce(name=“bodyforce”,createStepName=“reduce”,region=Body_Force_region,comp2=-20.0)
首先利用3.6節(jié)所述的findAt方法確定面以后,賦予指定的區(qū)域,然后進行網(wǎng)格的劃分. 本文中網(wǎng)格類型采用自由網(wǎng)格劃分形式,單元為四節(jié)點平面應(yīng)變減縮積分單元. 部分代碼如下:
slope_mesh_elemType=mesh.ElemType(elemCode=CPE4R,elemLibrary=STANDARD)
slopeMeshFace=slopeInstance.faces.findAt(((120,35,0),))
slopeMeshFaceRegion=regionToolset.Region(faces=slopeMeshFace)
slopePart.setElementType(regions=slopeMeshFaceRegion,elemTypes=(slope_mesh_elemType,))
slopeModel.parts[“slope”].generateMesh()
燕山集滑坡二維有限元模型經(jīng)過劃分網(wǎng)格后,如圖3 所示.
圖3 劃分網(wǎng)格后的模型
ABAQUS中通過定義場變量實現(xiàn)強度折減法時需要定義“initial conditions”,因此,需要修改關(guān)鍵字(keywords)[32]. 本文通過文件處理的方式,利用Python中的字符串索引來確定需要修改的關(guān)鍵字的行數(shù),然后插入替代的內(nèi)容. 部分代碼如下:
originstr = “**STEP:Reduce ”
newstr = “**STEP:Reduce Field,VARIABLE=1 slope-1.slope,2; ”#替代的關(guān)鍵字字符串
strindex = lines.index(originstr)#索引確定需要修改關(guān)鍵字的行數(shù)
lines[strindex]= newstr
lines.insert(strindex+1,newstr)#插入替代的內(nèi)容
導(dǎo)入visualization模塊,打開結(jié)果數(shù)據(jù)文件,查看穩(wěn)定性系數(shù)及滑動面位置. 本算例在第二個分析步t=0.437 73時無法收斂,計算終止. 此時等效塑性應(yīng)變云圖如圖4 所示,繪制場變量-位移曲線,即燕山集滑坡特征點的水平位移隨折減系數(shù)變化的曲線,如圖5 所示. 依據(jù)前述失穩(wěn)判據(jù)理論,位移突變點所對應(yīng)的FV1為0.99,即為燕山集滑坡的穩(wěn)定性系數(shù),這與剩余推力法所得的計算結(jié)果 1.012 基本一致. 從輸出數(shù)據(jù)庫讀取數(shù)據(jù)部分代碼如下:
from odbAcesss import *
from visualization import XYData
odb=visualization.openOdb(path=yanshanji.odb)#打開燕山集odb文件
xyData=session.XYData(plotName,data)
SafetyCurve=session.Curve(xyData)#繪制曲線
xyp=session.XYPlot(plotName)
chart = xyp.charts.values()[0]
chart.setValues(curvesToPlot=(SatyCurve, ), )
vp=session.viewports[“Viewport:1”]
vp.odbDisplay.setPrimaryVariable(variableLabel=“PEMAG”,outputPosition=INTEGRATION_POINT)#顯示PEMAG云圖
vp.odbDisplay.setPrimaryVariable(variableLabel=“U”)#顯示計算終止時增量位移等值線云圖,如圖6 所示.
圖4 t=0.437 73時的塑性區(qū)分布圖
圖5 特征點水平位移隨FV變化的曲線
圖6 t=0.437 73時的增量位移等值線云圖
上述為獲取常規(guī)結(jié)果數(shù)據(jù)輸出的文件,一般邊坡穩(wěn)定性分析中只需要分析得到以上結(jié)果. 在某些特定分析中還可以利用getSubset獲取邊坡不同位置,如坡頂或坡中土體的位移場數(shù)據(jù)以判斷邊坡破壞類型,或者通過Viewport函數(shù)創(chuàng)建一個新的視圖窗口,代碼舉例如下:
myOdb.step[“Step-1”].frames[1].fieldOutputs[“RF”].getSubset(region=myodb.rootAssembly.nodeSets[“setsname”]).values
myOdb=visualization.openOdb(path=jobName.job)
myViewport.setValues(displayedObject=myOdb)
myDisplacement=frame.fieldOutputs[“U”]
myStress=frame.fieldOutputs[“S”]
將上述代碼保存為后綴名.py文件后從編譯器退出. 運行該腳本程序的方法有多種,可以在ABAQUS/CAE中直接在菜單中選擇從保存路徑下Run Script.
本文以燕山集滑坡為例,完整討論了利用Python語言進行有限元軟件ABAQUS的二次開發(fā),通過定義材料參數(shù)隨場變量的變化以及利用字符串索引修改關(guān)鍵字的方式實現(xiàn)了邊坡穩(wěn)定性自動提交分析,使用方便,得到結(jié)果與極限平衡法基本一致. 主要結(jié)論有以下幾點:
1) 基于場變量的邊坡穩(wěn)定性分析,避免了需多次修改基于cae產(chǎn)生的inp文件中的c和φ值,以及每次均需要提交工作才能獲得最終的穩(wěn)定性系數(shù)的問題,分析過程得以簡化,達到參數(shù)化分析的目的.
2) 通過編寫Python腳本程序,調(diào)用ABAQUS內(nèi)核分析實現(xiàn)穩(wěn)定性系數(shù)計算過程的自動化. 腳本程序文件便于研究人員更為深入地理解響應(yīng)機理,建模以及分析過程中對模型的調(diào)試和診斷更有利于計算過程的收斂.
3) 本文通過Python語言中字符串索引方式修改關(guān)鍵字,順利完成了模型輸入文件的修改,實現(xiàn)了自動提交分析.