【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸

0 引言

    首先祝大家勞動節快樂,勞動人民最光榮!

    這應該是cluster目前最后一個應用場景了。   

 離散元的模擬思路是從微觀力學行為去反映宏觀特性,在這個過程中,能夠實現的現實的因素越多,得到的力學行為也就越準確。所以我們很多人去做柔性三軸,并不是為了去研究力學特性,而是為了得到更加準確的宏觀特性與現實相比對。

    巖石也是一樣,一個完整的巖石應當包括礦物晶粒和膠結物,并且除了致密的花崗巖這種巖漿巖,沉積巖變質巖在內部或多或少都會存在微小裂紋,甚至有一些碳酸巖體內部還存在微小孔洞。

    本文主要是利用cluster的概念,使用一個個cluster來模擬礦物晶粒,從模擬的思路來看是能夠更好的反映巖石行為的。但是需要注意的是,礦物晶粒的尺度對巖石而言是相當微小的,考慮礦物晶粒的破壞對巖石而言是否有必要還應當得到進一步的考量。當然本文是一個純技術層次的探討,不在模擬假定方面進行深入探討。

1 生成晶粒顆粒

    這里指定了晶粒的尺寸大小,當然各位可以根據晶粒名稱去指定更加復雜的晶粒級配。需要注意的是,后面使用的rBlock構建方式是from-ball,這里采用的是ball的邊界進行計算的,所以在第一步顆粒和墻體不能有過大的重疊,墻體和顆粒的剛度設置的大很多。

model new
def par width=0.2 height=width*2 poro_jingti=0.3 jingti_radmin=0.015 jingti_radmax=0.02end@par
model domain extent [-width] [width] [-width] [width] [-height] [height]



wall generate box [-width*0.5] [width*0.5] [-width*0.5] [width*0.5] [-height*0.5] [height*0.5] expand 1.5

ball distribute porosity @poro_jingti radius @jingti_radmin @jingti_radmax box [-width*0.5] [width*0.5] ... [-width*0.5] [width*0.5] [-height*0.5] [height*0.5]cmat default type ball-facet model linear method deform emod 100e9 kratio 1.5 cmat default type ball-ball model linear method deform emod 100e6 kratio 1.5

ball attribute density 2e3 damp 0.7model cycle 2000 calm 50model solve model save "SampleFirst"

【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸的圖1

2 構建rblock

    使用rblock構建的命令自動進行GBM范圍劃分

model restore "SampleFirst"

rblock construct from-balls polydisperse true ball delete
model save "rblock_Sample"

【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸的圖2

3 生成新的晶粒內顆粒

    在這里首先對已有的rblock的形狀進行導出,然后刪除rblock,后續使用這些范圍對ball的歸屬進行劃分

model restore "rblock_Sample"
def ball_par ball_radmin=jingti_radmin*0.2 ball_radmax=jingti_radmin*0.3 ball_poro=0.3end@ball_par
def GetGeo geoname_count=1 loop foreach rb rblock.list groupName=string.build("geo_%1",geoname_count) idRblock=rblock.id(rb) command rblock export to-geometry @groupName range id @idRblock endcommand geoname_count+=1 endloopend@GetGeorblock delete


cmat default type ball-facet model linear method deform emod 200e6 kratio 1.5 ball distribute porosity @ball_poro radius @ball_radmin @ball_radmax box [-width*0.5] [width*0.5] ... [-width*0.5] [width*0.5] [-height*0.5] [height*0.5]ball attribute density 2e3 damp 0.7model cycle 2000 calm 50model solve model save "sample"

【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸的圖3

4 確定顆粒歸屬

   首先對每個形狀進行隨機定義組名,這里的組名中包含一個sin_count,這個指代形狀的當前數目,所以實際上每個組的組名都是不同的。但是每個組名都有一個前綴,比如Rock1_1和Rock1_2這兩個是不同的組,但是根據前綴可以判定為同一種礦物成分。這樣可以避免后續加膠結的時候,同種礦物間被添加礦物內的膠結屬性。

    第二點是這里每個組的形狀都導入進一個墻體,很多學者會用sj模型來模擬滑裂面的特性。實際上我對sj模型一致都是一種不信任的狀態。將滑動面顆粒平整化,其實一樣可以減小切向的剛度。

model restore "sample"

def GetTemplateName(sin_count) rd=math.random.uniform if rd<0.25 then GetTemplateName="Rock1_"+string(sin_count) else if rd<0.5 then GetTemplateName="Rock2_"+string(sin_count) else if rd<0.75 then GetTemplateName="Rock3_"+string(sin_count) else GetTemplateName="Rock4_"+string(sin_count) endifend
def GroupBallIn(geo_count_single) groupName=GetTemplateName(geo_count_single) geoName="geo_"+string(geo_count_single) command ball group @groupName range geometry-space @geoName count 1 endcommandend

def WallIn loop gen_cur(1,geoname_count-1) GroupBallIn(gen_cur) geoName="geo_"+string(gen_cur) id_count=10000+gen_cur command wall import from-geometry @geoName id @id_count endcommand endloopend@WallInmodel cycle 2000 calm 50model solve model save "sample_group"

【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸的圖4

5 加膠結

這一步略微有一點麻煩,主要的麻煩的點在于要實現三點:

1)同種礦物給到同種屬性

2)組間顆粒應當給到一個比較弱的屬性

3)同種礦物不同組間也是一個比較弱的屬性

   針對這種比較復雜的接觸定義,range fish無疑是能夠更方便一點,所以各位如果模型種牽扯到復雜接觸定義,建議都需要認真學一下range fish的概念?!?a target="_blank" textvalue="Range fish的使用" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2" rel="nofollow">Range fish的使用】

model restore "sample_group"
wall delete walls range id 3 10000000

def GetSubGroupName(ct) end1=contact.end1(ct) end2=contact.end2(ct) if type.pointer.name(end1)#"Ball" then GetSubGroupName="" exit endif if type.pointer.name(end2)#"Ball" then GetSubGroupName="" exit endif if ball.group(end1)# ball.group(end2) then GetSubGroupName="" exit endif groupName=ball.group(end1) str=string.sub(groupName,9,5) GetSubGroupName = strend
def isRock1In(pos,ct) sr= GetSubGroupName(ct) if sr=="Rock1" then isRock1In=true exit endif isRock1In=falseenddef isRock2In(pos,ct) sr= GetSubGroupName(ct) if sr=="Rock2" then isRock2In=true exit endif isRock2In=falseenddef isRock3In(pos,ct) sr= GetSubGroupName(ct) if sr=="Rock3" then isRock3In=true exit endif isRock3In=falseenddef isRock4In(pos,ct) sr= GetSubGroupName(ct) if sr=="Rock4" then isRock4In=true exit endif isRock4In=falseend
cmat default model linearpbond method deform emod 1e9 kratio 1.5 pb_deform emod 1e9 kratio 1.5 ... property pb_coh 10e6 pb_ten 10e6 pb_fa 50 fric 0.1 lin_mode 1cmat add 1 model linear method deform emod 10e9 kratio 1.5 ... property lin_mode 1 range contact type "ball-facet" cmat add 2 model linearpbond method deform emod 5e9 kratio 1.5 pb_deform emod 5e9 kratio 1.5 ... property pb_coh 15e6 pb_ten 15e6 pb_fa 50 fric 0.1 lin_mode 1 range fish @isRock1In cmat add 3 model linearpbond method deform emod 6e9 kratio 1.5 pb_deform emod 6e9 kratio 1.5 ... property pb_coh 18e6 pb_ten 18e6 pb_fa 50 fric 0.1 lin_mode 1 range fish @isRock2In cmat add 4 model linearpbond method deform emod 7e9 kratio 1.5 pb_deform emod 7e9 kratio 1.5 ... property pb_coh 20e6 pb_ten 20e6 pb_fa 50 fric 0.1 lin_mode 1 range fish @isRock3In cmat add 5 model linearpbond method deform emod 8e9 kratio 1.5 pb_deform emod 8e9 kratio 1.5 ... property pb_coh 22e6 pb_ten 22e6 pb_fa 50 fric 0.1 lin_mode 1 range fish @isRock4In
cmat apply
model clean
contact method bond gap [ball_radmin*1.8]
contact property lin_force 0 0 0
ball attribute force-contact 0 0 0 moment-contact 0 0 0model calm
model cycle 1
model solve
model save "jiaojie"

【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸的圖5

6 加載

    加載這步和之前都一樣。

model restore "jiaojie"model mechanical time-total 0wall delete walls range id 3 6 ball attribute displacement multiply 0def wall_init    wpUp=wall.find(2)    wpDown=wall.find(1)end@wall_init

[IZ0=wall.pos.z(wpUp)-wall.pos.z(wpDown)]
[strainrate=0.1]wall attribute vel-z [-IZ0*strainrate*0.5] range id 2wall attribute vel-z [IZ0*strainrate*0.5] range id 1
def jiance whilestepping wzss=(wall.force.contact.z(wpUp)-wall.force.contact.z(wpDown))*0.5/(width*width) wlz=wall.pos.z(wpUp)-wall.pos.z(wpDown)end
[final_time=1e-2/strainrate][baocunpinlv=final_time/40.0][time_record=-100][count=0]def savefile time=mech.time.total wezz=(wlz-IZ0)/IZ0 if time-time_record >= baocunpinlv then filename=string.build("jieguo_%1",count) command model save @filename endcommand time_record=time count +=1 endifend
fish callback add @savefile -1.0
program call "fracture.p3fis"
history deletehistory id 1 @wzsshistory id 2 @wezz@track_initmodel solve time @final_time
model save "result"

【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸的圖6

    直接看最后的破壞情況,其實能夠明顯的看出來沿著晶粒接觸面的破壞模式。

【PFC6.0.30】三維Cluster模擬GBM礦物晶粒巖石單軸的圖7

這里也不去做過多的分析,晶粒結構方面應當有很多可以探索的地方。

本文除了裂紋文件已包含所有的代碼文件。讀者可自行組裝。也可轉發本文到朋友圈集贊50,截圖發到公眾號后臺,可以得到本文對應得文件項目包。為了避免半年后依然有同學艾特我,集贊活動截止到5月10日。

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

TOP

8
2
12