基於Python指令碼在Abaqus中實現Voronoi圖繪製
oronoi圖也叫
泰森多邊形
,它是由一組由連線兩鄰點直線的垂直平分線組成的連續多邊形組成。在地理學、氣象學、結晶學、航天、核物理學、機器人等領域具有廣泛的應用,比如化學領域晶體結晶過程的模擬,站點選址、轄區管制邊界等問題。
對於模擬問題,可以藉由abaqus來實現有關單元的建立,這裡我們不涉及具體領域的理論和應用過程,僅提供關於實現有關圖形建立的思路和過程。
在abaqus中利用
python
實現Voronoi圖(以二維圖為例)的基本思路是生成Voronoi圖的頂點,然後透過指令碼在abaqus繪製草圖完成。那麼獲取頂點座標是關鍵,我們利用python的資料包scipy以及
matplotlib
來編寫完成,scipy自帶Voronoi圖的api
函式
,所以使用起來比較方便,當然小編查了網上的資料發現MATLAB實現起來也很簡單,這裡對此不做介紹。
對於使用新版本比如abaqus2020的使用者,軟體已經內部自帶python2。7。15和python3。7。3,而且附帶帶有scipy以及matplotlib,這簡直是開發者的超級福音,需要做二次開發並且呼叫外部包的使用者直接配置就行,非常方便。
下面我們來看看怎麼實現Voronoi圖的繪製。首先獲得各
頂點座標
,如圖所示部分程式碼完成二維的Voronoi圖繪製,直接呼叫Voronoi函式使用(如圖-1所示),生成的虛線表示
邊界頂點
存在無窮遠點(這是本程式碼不足的地方,需要在完善,暫時僅供參考)。
1final_points=[]
2for i in initial_points:
3 x,y=i
4
random
_num=random。uniform(-1,1)
5 x = x + ((random_num * a)/2 )
6 y = y + ((random_num * a)/2 )
7
final_points
。append([x, y])
8vor=Voronoi(final_points)
9voronoi_plot_2d(vor,show_points=True,
show_vertices
=False,line_colors=‘red’,
10
line_width
=1,line_alpha=1,point_size=0。1)
11plt。show()
圖-1 生成Voronoi圖結果
利用程式碼產生abaqus執行的python指令碼,其中下述程式碼用於對圖-1的結果進行著色,相關程式碼均有開源,本文做了一些簡單修正和補充,最後可以看到著色之後圖-2的效果。
for region in vor。regions:
if not -1 in region:
polygon=[vor。vertices[i] for i in region]
plt。fill(*zip(*polygon))
plt。xlim
([0,50]), plt。ylim([0,30])
plt。show
()
圖-2 著色效果
有了生成的座標,利用abaqus自帶的api函式我們開始在abaqus的Voronoi圖繪製,部分程式碼如下所示,匯入需要的所有包,根據以前提供的python開發思路編寫指令碼提交執行即可。最終我們可以得到在abaqus中顯示的Voronoi圖(
虛線多邊形
有待完善),如圖-3所示我們生成了二維的Voronoi圖並且進行了不同顏色的標註,同時對各個區域做了簡單的自動網格劃分,結果如圖-4所示。對於晶體的斷裂模擬問題可以直接利用泰森多邊形結合離散元的方法進行模擬,不過這屬於更加專業的範疇,小編也不熟悉,不再過多闡述。最後錄製了一個執行的動圖,記錄整個abaqus執行指令碼並生成結果的過程,如圖-5所示,當然進一步做也可以完全做成一個小的外掛介面,改變二維尺寸
引數
、多邊形大小、
網格密度
等自動實現全過程的生成。
1from abaqus import *
2from abaqusConstants import *
3import __main__
4
5####
6匯入abaqus各模組,為了防止出錯把能想到的全部匯入
7####
8
9s = mdb。models[‘Model-1’]。ConstrainedSketch(name=‘__profile__’,
10 sheetSize={sheetSize})
11g, v, d, c = s。geometry, s。vertices, s。dimensions, s。constraints
12s。setPrimaryObject(option=STANDALONE)
13s。rectangle(point1=(0。0, 0。0), point2=(%%你自己定義的尺寸大小%%))
14p = mdb。models[‘Model-1’]。Part(name=‘Part-1’, dimensionality=TWO_D_PLANAR,
15 type=DEFORMABLE_BODY)
16p = mdb。models[‘Model-1’]。parts[‘Part-1’]
17p。BaseShell(sketch=s)
18s。unsetPrimaryObject()
19p = mdb。models[‘Model-1’]。parts[‘Part-1’]
20session。viewports[‘Viewport: 1’]。setValues(displayedObject=p)
21del
mdb。models
[‘Model-1’]。sketches[‘__profile__’]
22p = mdb。models[‘Model-1’]。parts[‘Part-1’]
23f, e, d1 = p。faces, p。edges, p。datums
24t = p。MakeSketchTransform(sketchPlane=f[0], sketchPlaneSide=SIDE1, origin=(
25 0。0, 0。0, 0。0))
26
27#####
28
29其它程式碼省略
30……
31……
32
33#####
圖-3 abaqus中顯示效果
圖-4 自動網格生成
圖-5 指令碼執行過程
以上,是針對二維Voronoi圖在abaqus中實現的過程進行的簡單闡述,對於
三維圖
則可以利用已有的二維面來生成,這點MATLAB似乎更簡便,後續將抽時間進一步研究,歡迎大家分享交流,接下來也將和大家交流更多關於CAE方向的python程式設計知識,敬請期待~
致謝及參考:
1.
@Akash Ravi,Cisco
2.
http://
wufengyun。com:888/v6。14
/books/ker/default。htm
3.
https://
docs。scipy。org/doc/scip
y/reference/generated/scipy。spatial。Voronoi。html?highlight=scipy%20spatial#scipy。spatial。Voronoi
更多內容及原始碼敬請關注weixin公號獲取:CAE模擬空間(ID:CAE_SPACE)