Gmsh劃分四邊形、六面體網格
結構網格與非結構網格的定義比較模糊,從其特點來講,結構網格是其節點位置可預測,網格幾何結構一定。非結構網格是節點位置不可預測,網格幾何不是重復的。從應用角度來說,結構網格指四邊形和六面體。簡單幾何易于生成結構網格,復雜幾何很難生成結構網格。
從生成算法來講,結構網格的算法有:插值法、拉伸、掃略等。非結構網格的算法有:Delaunay、AFT、四叉樹、八叉樹等。本文僅描述使用Gmsh生成四邊形和六面體的方法。
此方法通過指定“相對著的線”上節點數一致,指定“面上的Corner點”(超過四條邊界的面),指定“體上的Corner”(超過八個邊界面的體)。如下,設置正方形四條邊上的節點數為20,
//面由四條邊組成,每條邊20個網格,圖 1 double lc = 1e-2; gmsh::model::geo::addPoint(0, 0, 0, lc, 1); gmsh::model::geo::addPoint(10, 0, 0, lc, 2); gmsh::model::geo::addPoint(10, 10, 0, lc, 3); gmsh::model::geo::addPoint(0, 10, 0, lc, 4); gmsh::model::geo::addLine(1, 2, 1); gmsh::model::geo::addLine(3, 2, 2); gmsh::model::geo::addLine(3, 4, 3); gmsh::model::geo::addLine(4, 1, 4); gmsh::model::geo::addCurveLoop({ 4, 1, -2, 3 }, 1); gmsh::model::geo::addPlaneSurface({ 1 }, 1); gmsh::model::geo::mesh::setTransfiniteCurve(1, 20); gmsh::model::geo::mesh::setTransfiniteCurve(2, 20); gmsh::model::geo::mesh::setTransfiniteCurve(3, 20); gmsh::model::geo::mesh::setTransfiniteCurve(4, 20); gmsh::model::geo::mesh::setTransfiniteSurface(1);gmsh::model::geo::mesh::setRecombine(2, 1);
下邊代碼展示,由5條邊界組成的面,
//圖 2 double lc = 1; gmsh::model::geo::addPoint(0, 0, 0, lc, 1); gmsh::model::geo::addPoint(10, 0, 0, lc, 2); gmsh::model::geo::addPoint(10, 10, 0, lc, 3); gmsh::model::geo::addPoint(0, 10, 0, lc, 4); gmsh::model::geo::addPoint(-5, 5, 0, lc, 5); gmsh::model::geo::addLine(1, 2, 1); gmsh::model::geo::addLine(2, 3, 2); gmsh::model::geo::addLine(3, 4, 3); gmsh::model::geo::addLine(4, 5, 4);//將Line 4,5合為一條邊 gmsh::model::geo::addLine(5, 1, 5); gmsh::model::geo::addCurveLoop({1,2,3,4,5 }, 1); gmsh::model::geo::addPlaneSurface({ 1 }, 1); gmsh::model::geo::mesh::setTransfiniteCurve(1, 20); gmsh::model::geo::mesh::setTransfiniteCurve(2, 20); gmsh::model::geo::mesh::setTransfiniteCurve(3, 20); gmsh::model::geo::mesh::setTransfiniteCurve(4, 11); gmsh::model::geo::mesh::setTransfiniteCurve(5, 10); //兩條直線公用一個點,故加起來得比20大1 gmsh::model::geo::mesh::setTransfiniteSurface(1, "Left", {1,2,3,4});//指示四個角點 gmsh::model::geo::mesh::setRecombine(2, 1);
以下代碼,由setTransfiniteAutomatic自動設置由8個點8個面組成的體。
double lc = 1;gmsh::model::occ::addBox(0, 0, 0, 10, 10, 10, 1);gmsh::model::occ::synchronize();gmsh::model::mesh::setTransfiniteAutomatic();
代碼設置volume的Transfinite不太容易,編號太多。以下代碼讀入非8個面的體(IGS文件),使用Gmsh的圖形化窗口設置其Transfinite。設置比較繁瑣,總而言之,保證面上相對的邊上節點數量一致,4個角點設置正確。
//網格 圖 3,圖 4 //注意此處容差設置,否則讀入的幾何線段重合。圖 5,圖 6 //注意設置 “縫合面”,否則讀入的只是面,面不閉合。 //這兩項均可在圖形界面中設置,‘Tools->Options->Geometry->General’ gmsh::option::setNumber("Geometry.Tolerance", 0.1); gmsh::option::setNumber("Geometry.OCCSewFaces",1); std::vector<std::pair<int, int> > v; try { gmsh::model::occ::importShapes("solid8.igs", v);//此處可以設置只將solid導入,或者將solid下的點、線、面、shell都導入。 } catch (...) { gmsh::logger::write("Could not load STEP file: bye!"); gmsh::finalize(); return 0; } gmsh::model::occ::addSurfaceLoop({1,2,3,4,5,6,7,8},100,true); gmsh::model::occ::addVolume({ 100 }, 300); gmsh::model::occ::synchronize(); gmsh::model::mesh::generate(3);
2. Quasi-structured Quad 算法
對于2維幾何可以使用Quasi-structured Quad生成四邊形。如下代碼,讀入IGS,并劃分為四邊形。
//圖 7,圖 8//讀入IGS,如上gmsh::model::occ::synchronize();gmsh::option::setNumber("Mesh.Algorithm", 11);gmsh::model::mesh::generate(2);
3.拉伸、掃略方法
以面上網格,拉伸、掃略形成四面體。如下代碼:
gmsh::initialize(argc, argv); gmsh::model::add("t18"); gmsh::model::occ::addRectangle(0, 0, 0, 10, 10, 100); double h = 10; std::vector<std::pair<int, int> > ov; std::vector<int> nums; std::vector<double> heights; nums.push_back(10); //拉伸幾何的同時,也拉伸網格 gmsh::model::occ::extrude({ {2, 100} }, 0, 0, h, ov, nums, heights,true); gmsh::model::occ::synchronize(); //gmsh::option::setNumber("Mesh.MeshSizeMin", 1.0); //gmsh::option::setNumber("Mesh.MeshSizeMax", 3.0); gmsh::option::setNumber("Mesh.Algorithm", 8); //此處若使用“Quasi-structured Quad”會出錯 gmsh::model::mesh::setRecombine(2, 100);gmsh::model::mesh::generate(3);
合并算法不能保證生成質量優秀的四邊形,也不能保證全部合并為四邊形。如果能在面上使用“Quasi-structured Quad”算法,再拉伸。但是,此時總會出現外邊一層單元無法生成,Debug提示“Could not find extruded vertex (-3.333641223427529, 20, -2.490304324894331)”。應該是沒有找到合適的點。
如果有朋友知道,煩請不吝賜教。
路漫漫其修遠兮,共勉 。
參考:
Gmsh 文檔
Gmsh Source Code
文章來源:有限元仿真技術交流平臺
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















