Gmsh劃分四邊形、六面體網格

結構網格與非結構網格的定義比較模糊,從其特點來講,結構網格是其節點位置可預測,網格幾何結構一定。非結構網格是節點位置不可預測,網格幾何不是重復的。從應用角度來說,結構網格指四邊形和六面體。簡單幾何易于生成結構網格,復雜幾何很難生成結構網格。

從生成算法來講,結構網格的算法有:插值法、拉伸、掃略等。非結構網格的算法有:Delaunay、AFT、四叉樹、八叉樹等。本文僅描述使用Gmsh生成四邊形和六面體的方法。

1.Transfinite 方法

此方法通過指定“相對著的線”上節點數一致,指定“面上的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);

Gmsh劃分四邊形、六面體網格的圖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);

Gmsh劃分四邊形、六面體網格的圖2

Gmsh劃分四邊形、六面體網格的圖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);
Gmsh劃分四邊形、六面體網格的圖4

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);

Gmsh劃分四邊形、六面體網格的圖5

合并算法不能保證生成質量優秀的四邊形,也不能保證全部合并為四邊形。如果能在面上使用“Quasi-structured Quad”算法,再拉伸。但是,此時總會出現外邊一層單元無法生成,Debug提示“Could not find extruded vertex (-3.333641223427529, 20, -2.490304324894331)。應該是沒有找到合適的點。

Gmsh劃分四邊形、六面體網格的圖6

如果有朋友知道,煩請不吝賜教。

路漫漫其修遠兮,共勉 。

參考:

  • Gmsh 文檔

  • Gmsh Source Code

文章來源:有限元仿真技術交流平臺


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

TOP

5
2
3