寫在前面:2012年翻閱某電磁仿真手冊時看到一句話,說HFSS之所以能保證工業級精度的秘訣在於網格剖分,當時真理解不了。後來出國兩年,以矩量法為基礎深入學習計算電磁後,才體會到這句話的真諦,為此這裡給大家推薦一個仿真建模的利器,Gmsh,簡約但不簡單的開源軟體。如果精力允許,希望大家儘可能親自建模離散,再導入商業軟體進行仿真,絕對磨刀不誤砍柴工!
Gmsh是一款有限元網格生成器,包含預處理、求解和後處理三大模塊,分別對應於幾何建模、網格優化和結果展示三項功能。
打個簡單比方,張三準備建一個房子,首先將輪廓線畫出來(幾何建模),然後計算用多少塊轉(離散網格),最後再貼瓷磚或刷牆(效果展示)。
下面結合個人經驗介紹如何快速入門,假設Gmsh已經下載到本地(http://www.gmsh.info/下載,無需安裝,點擊exe直接運行),找到gmsh.exe和help文件,再快速翻看demos和tutorial兩個文件夾。
入門第一步,運行tutorial文件夾example1 通過file→open打開t1.geo,出現一個方框。
在導航欄mesh選項下級目錄找到2D,點擊後方框被離散化,變成了一個網格。
至此,一個簡單的長方形貼片被離散化處理,操作基本完成,下面我們看看gmsh是怎樣通過腳本建模的。
採用記事本打開t1.geo文件(俗稱腳本script),發現羅裡吧嗦的一大堆,其實我們需要了解其中四類語句就行了,它們分別是定義參數、點、線、面的命令,如下:
定義參數 lc = 1e-2;
定義點 Point(1) = {0, 0, 0, lc};
定義線段 Line(1) = {1,2} ;
定義閉合線段Line Loop(5) = {4,1,-2,3} ;
定義面Plane Surface(6) = {5} ;
不難看出gmsh參數化建模的流程:通過參數定義點的屬性,連接相應的點構成線段,再連接一系列線段構成封閉的面。
值得指出的是,定義點需要四個變量,前三個是坐標,第四個是用來定義網格剖分疏密的參數,詳情請參考腳本注釋(//開始,或者/* */之間的內容)。
Gmsh看似簡單,其實功能十分強大(通過284頁的help文件介紹就知道它有多複雜)。這裡介紹幾個最為實用的選項設置:
(1)菜單tool-》Options選項 Visibility
選項卡裡Geometry和Mesh裡Visibility包含了點、線、面的顯示參數,操作操作看看視圖會有什麼變化。
(2)菜單tool-》Options選項 一鍵默認
當你設置參數沒有變化,也找不出原因時,恢復默認設置是有效的選擇。
(3)菜單tool-》Options選項 腳本重載與編輯
gmsh支持前臺和後臺雙重操作,也就是說,用戶可以在後臺編輯腳本,然後通過導航欄Geometry下面的Reload重新加載,相應視圖會自動更新;用戶也可以在前臺通過滑鼠建模(選點、連線、取面等),對應的命令語句會自動寫入對應腳本文件(點擊導航欄Geometry下面的Edit file就能自動打開腳本文件,可以非常直觀的學習腳本命令,我就是這樣入門的)。當然用戶也可以混合操作。注意一個細節,gmsh在General選項裡面定義了文本編輯軟體,如果是windows可以選用記事本,linux可以選用gedit,需要修改時再上網搜索,這裡就不囉嗦了。
至此,第一個例子已經介紹完畢,總結一下,我們學習了:
gmsh最基本的四個建模語句;
與視圖和腳本密切相關的常用選項;
gmsh前臺、後臺操作讀寫腳本。
可能有人要問,tutorial文件夾裡面還有十幾個例子怎麼辦,學還是不學?如果你還是處於入門階段,那麼剩餘的例子沒必要學習,可以打開看個新鮮,但是真正研究起來很容易讓你望而生畏,因為gmsh能做的事情實在超過你的想像,而我們的需求可能只是全部功能的1%,所以適可而止的保持好奇心。下面,我們開始自己腳踏實地的新建第一個例子。
入門第二步,新建一個例子10個點、17條線、8個面構成一個最簡單的房子,腳本代碼如下:
// mesh parameters
lc = 1e-1;
// 10 points
Point(1) = {-1, -1, 0, lc};
Point(2) = {1, -1, 0, lc};
Point(3) = {1, 1, 0, lc};
Point(4) = {-1, 1, 0, lc};
Point(5) = {-1, -1, 1, lc};
Point(6) = {1, -1, 1, lc};
Point(7) = {1, 1, 1, lc};
Point(8) = {-1, 1, 1, lc};
Point(9) = {-1, 0, 1.5, lc};
Point(10) = {1, 0, 1.5, lc};
// 17 lines
Line(1) = {1, 2};
Line(2) = {2, 3};
Line(3) = {3, 4};
Line(4) = {4, 1};
Line(5) = {5, 6};
Line(6) = {6, 7};
Line(7) = {7, 8};
Line(8) = {8, 5};
Line(9) = {10, 6};
Line(10) = {10, 7};
Line(11) = {8, 9};
Line(12) = {9, 5};
Line(13) = {10, 9};
Line(14) = {7, 3};
Line(15) = {8, 4};
Line(16) = {6, 2};
Line(17) = {5, 1};
// 8 faces without bottom
Line Loop(18) = {6, 14, -2, -16};
Plane Surface(19) = {18};
Line Loop(20) = {7, 15, -3, -14};
Plane Surface(21) = {20};
Line Loop(22) = {8, 17, -4, -15};
Plane Surface(23) = {22};
Line Loop(24) = {5, 16, -1, -17};
Plane Surface(25) = {24};
Line Loop(26) = {10, -6, -9};
Plane Surface(27) = {26};
Line Loop(28) = {10, 7, 11, -13};
Plane Surface(29) = {28};
Line Loop(30) = {13, 12, 5, -9};
Plane Surface(31) = {30};
Line Loop(32) = {8, -12, -11};
Plane Surface(33) = {32};
下圖是房子的幾何外形,對應的點已在圖中標出。
點擊Mesh-》2D按照默認設置進行離散,得到三角形網格,但是我們想要四邊形網格。
修改選項卡設置,合併所有三角形網格,得到四邊形網格。
網格是四邊形的,但是不夠整齊,怎麼辦?
再次修改選項卡,換一個mesh求解算法。
這次比上次整齊多了,可是網格太密了,適當調稀疏點。
修改mesh參數lc為0.3,效果基本滿意。
入門第三步,再接再厲,積累學習通過前面的兩個例子,相信大家對Gmsh已經有了基本的掌握,其實入門真的不難,不是嗎?基於上述基本技巧,常用建模需求基本可以滿足,但是如此強大的軟體只學到這裡,實在可惜。所以,兩點建議:
最後,祝大家Gmsh學得開心,用的順心。
申明
原創總結,歡迎分享,轉載請註明作者和出處:useful2you,有點小用吧(公眾號useful4you)
-