月下博客

使用gmsh生成带边界条件的网格

gmsh中的元素可以分成两类:几何实体和物理实体。几何实体是网格元素的最基本组成,物理实体(物理组)则是在几何元素的基础上进行逻辑层上的分类。从架构上看,几何实体属于物理划分,物理实体则是逻辑划分。

gmsh支持根据物理性质将几何实体进行归类和划分。目前所知物理实体一个非常重要的性质是设定网格的边界条件:将相同边界条件的几何元素归到同一个组下,gmsh在生成网格的时候就将物理信息写入到生成的网格信息中。

物理实体的定义需要在定义的元素前加上”Physical”标识符,其余的同几何实体的定义相同。下面是一个二维机翼的gmsh定义:

cl_1 = 0.01;
Point(1) = {1, 0, 0, cl_1};
Point(2) = {0.2906701309999999, 0, 0.059599889, cl_1};
Point(3) = {0.290670131, 0, 0.059599889, cl_1};
Point(4) = {-3.33066907387547e-016, 0, -2.775557561562891e-017, cl_1};
Point(5) = {0.290670131, 0, -0.059599889, cl_1};
Point(6) = {-1.110223024625156e-016, 0, 0, cl_1};
Point(7) = {1, 0, 0, cl_1};
Point(8) = {0.2906701309999999, 0, -0.059599889, cl_1};
p1 = newp;
Point(p1 + 1) = {0.9578477628235885, 0, 0.005808055788066277};
Point(p1 + 2) = {0.9136001717514742, 0, 0.01159953317971515};
Point(p1 + 3) = {0.8678598741632115, 0, 0.01728526031819392};
Point(p1 + 4) = {0.8212779475631614, 0, 0.02277865740518693};
Point(p1 + 5) = {0.7745191250941298, 0, 0.02800031778249978};
Point(p1 + 6) = {0.7282262993505407, 0, 0.03288198060276357};
Point(p1 + 7) = {0.6829880771923493, 0, 0.0373694940386463};
Point(p1 + 8) = {0.6393125213400493, 0, 0.04142453011683183};
Point(p1 + 9) = {0.5976090881089672, 0, 0.04502500226786509};
Point(p1 + 10) = {0.5581794445899648, 0, 0.0481643117667218};
Point(p1 + 11) = {0.521216620190355, 0, 0.05084967643767647};
Point(p1 + 12) = {0.4868110356265319, 0, 0.05309985880292391};
Point(p1 + 13) = {0.4549614552219337, 0, 0.05494261362247144};
Point(p1 + 14) = {0.4255888082703554, 0, 0.05641213152223604};
Point(p1 + 15) = {0.3985510271977428, 0, 0.05754668640628761};
Point(p1 + 16) = {0.3736574289168878, 0, 0.05838661862754537};
Point(p1 + 17) = {0.3506816041400513, 0, 0.0589727173733007};
Point(p1 + 18) = {0.3293721908004415, 0, 0.05934501212155738};
Point(p1 + 19) = {0.309461241465114, 0, 0.0595419466863262};
Spline(1) = {1, p1 + 1, p1 + 2, p1 + 3, p1 + 4, p1 + 5, p1 + 6, p1 + 7, p1 + 8, p1 + 9, p1 + 10, p1 + 11, p1 + 12, p1 + 13, p1 + 14, p1 + 15, p1 + 16, p1 + 17, p1 + 18, p1 + 19, 2};
p2 = newp;
Point(p2 + 1) = {0.2842729112131264, 0, 0.05959035601288155};
Point(p2 + 2) = {0.2761001220809002, 0, 0.0595451957195354};
Point(p2 + 3) = {0.2666300877434753, 0, 0.05944430161792291};
Point(p2 + 4) = {0.2560533097681484, 0, 0.05926870849763945};
Point(p2 + 5) = {0.2444412386433862, 0, 0.05899746041353254};
Point(p2 + 6) = {0.2318090344278302, 0, 0.058605806668528};
Point(p2 + 7) = {0.2181439021461914, 0, 0.05806365702589601};
Point(p2 + 8) = {0.2034209651627122, 0, 0.05733392771630338};
Point(p2 + 9) = {0.1876150065513268, 0, 0.0563705983368452};
Point(p2 + 10) = {0.1707120994729877, 0, 0.0551163616335265};
Point(p2 + 11) = {0.1527237978253341, 0, 0.05349978292686403};
Point(p2 + 12) = {0.1337063457254963, 0, 0.05143193572045287};
Point(p2 + 13) = {0.1137876774535901, 0, 0.04880258242681034};
Point(p2 + 14) = {0.09320552798189294, 0, 0.04547617760131762};
Point(p2 + 15) = {0.07236044644973513, 0, 0.04128836888014319};
Point(p2 + 16) = {0.05188730831459138, 0, 0.03604437967545813};
Point(p2 + 17) = {0.03274685573930983, 0, 0.02952182506630169};
Point(p2 + 18) = {0.01633265015110124, 0, 0.0214822334050408};
Point(p2 + 19) = {0.004575175047531102, 0, 0.01169763023104438};
Spline(2) = {3, p2 + 1, p2 + 2, p2 + 3, p2 + 4, p2 + 5, p2 + 6, p2 + 7, p2 + 8, p2 + 9, p2 + 10, p2 + 11, p2 + 12, p2 + 13, p2 + 14, p2 + 15, p2 + 16, p2 + 17, p2 + 18, p2 + 19, 4};
p3 = newp;
Point(p3 + 1) = {0.2842687444062102, 0, -0.05959033995136771};
Point(p3 + 2) = {0.2760902965551228, 0, -0.05954510785780694};
Point(p3 + 3) = {0.2666128650422044, 0, -0.05944404536989124};
Point(p3 + 4) = {0.2560272811856329, 0, -0.05926814784851871};
Point(p3 + 5) = {0.2444053852046738, 0, -0.05899642178635941};
Point(p3 + 6) = {0.2317627182952431, 0, -0.05860407976787362};
Point(p3 + 7) = {0.2180868707188054, 0, -0.05806099563459484};
Point(p3 + 8) = {0.203353381935633, 0, -0.05733005183556716};
Point(p3 + 9) = {0.1875375094086677, 0, -0.05636519948112355};
Point(p3 + 10) = {0.1706258837914739, 0, -0.05510911382545057};
Point(p3 + 11) = {0.1526307187728704, 0, -0.05349036308954442};
Point(p3 + 12) = {0.1336090279833125, 0, -0.05142005881221923};
Point(p3 + 13) = {0.1136896084213433, 0, -0.0487880588136444};
Point(p3 + 14) = {0.09311108862650791, 0, -0.04545900258153844};
Point(p3 + 15) = {0.07227479757675123, 0, -0.04126885612468364};
Point(p3 + 16) = {0.05181599481494702, 0, -0.03602334947685121};
Point(p3 + 17) = {0.03269491843986368, 0, -0.02950085009913444};
Point(p3 + 18) = {0.01630296371554681, 0, -0.02146392080930703};
Point(p3 + 19) = {0.004565723668620725, 0, -0.01168586711270097};
Spline(3) = {5, p3 + 1, p3 + 2, p3 + 3, p3 + 4, p3 + 5, p3 + 6, p3 + 7, p3 + 8, p3 + 9, p3 + 10, p3 + 11, p3 + 12, p3 + 13, p3 + 14, p3 + 15, p3 + 16, p3 + 17, p3 + 18, p3 + 19, 6};
Reverse Line {3};
p4 = newp;
Point(p4 + 1) = {0.9578371307341608, 0, -0.005809451776204171};
Point(p4 + 2) = {0.9135836204677359, 0, -0.01160162204700566};
Point(p4 + 3) = {0.8678423367489414, 0, -0.01728739358632329};
Point(p4 + 4) = {0.8212641228333738, 0, -0.02278029282335023};
Point(p4 + 5) = {0.7745130557952343, 0, -0.02800105787177528};
Point(p4 + 6) = {0.7282310363923532, 0, -0.03288159346440879};
Point(p4 + 7) = {0.6830054673847058, 0, -0.03736791477271506};
Point(p4 + 8) = {0.6393431339409602, 0, -0.04142184433789697};
Point(p4 + 9) = {0.5976522728176452, 0, -0.04502141572787306};
Point(p4 + 10) = {0.5582334954732195, 0, -0.04816011152865139};
Point(p4 + 11) = {0.5212790094647602, 0, -0.05084518927366299};
Point(p4 + 12) = {0.4868786787883632, 0, -0.05309541172223745};
Point(p4 + 13) = {0.4550309732288671, 0, -0.05493850005863926};
Point(p4 + 14) = {0.4256567607517621, 0, -0.05640858514472293};
Point(p4 + 15) = {0.398614100322739, 0, -0.05754386310405684};
Point(p4 + 16) = {0.373712570479338, 0, -0.05838458613465396};
Point(p4 + 17) = {0.3507261053773512, 0, -0.05897145133181579};
Point(p4 + 18) = {0.3294037189943399, 0, -0.05934439706944743};
Point(p4 + 19) = {0.3094778295903463, 0, -0.05954178043174179};
Spline(4) = {7, p4 + 1, p4 + 2, p4 + 3, p4 + 4, p4 + 5, p4 + 6, p4 + 7, p4 + 8, p4 + 9, p4 + 10, p4 + 11, p4 + 12, p4 + 13, p4 + 14, p4 + 15, p4 + 16, p4 + 17, p4 + 18, p4 + 19, 8};


Coherence;

cl_2 = 2.0;

Point(89) = {-20, 0, 20, cl_2};
Point(90) = {-20, 0, -20, cl_2};
Point(91) = {20, 0, -20, cl_2};
Point(92) = {20, 0, 20, cl_2};
Line(7) = {89, 92};
Line(8) = {92, 91};
Line(9) = {91, 90};
Line(10) = {90, 89};
Line Loop(11) = {10, 7, 8, 9};
Line Loop(12) = {1, 2, -3, -4};
Plane Surface(13) = {11, 12};

Physical Line(14) = {9, 7, 10, 8};
Physical Line(15) = {1, 2, 3, 4};
Physical Surface(1) = {13};

上述文件定义了一个二维机翼的几何实体和物理实体。将其使用gmsh则可生成二维的网格。

注意

如果需要导出msh格式,必须给出完整的physical定义!在上述例子中,如果没有给出最后的physical surface定义,保存成msh的格式则只有边界上的数据。话句话说,如果定义了物理实体,msh格式只会输出和physical信息的几何实体相关的网格!