用MATLAB函数对几何模型进行网格剖分和细化

前面的工作完成以后,使用generateMesh函数对模型进行网格剖分。网格剖分的过程,是一个对几何模型进行离散化的过程,通过该过程,用网格节点处的有限个解代替原模型上的无限个解,将相对复杂的问题转化为相对简单的问题。[大谦MATLAB,dqmatlab点com]

一、generateMesh函数

generateMesh函数的语法格式为:

  • generateMesh(model) 对模型进行网格剖分。
  • generateMesh(model,Name,Value) 用Name和Value匹配对修改网格剖分过程。Name和Value匹配对的设置如表1-2所示。
  • mesh = generateMesh(___) 返回网格对象到MATLAB工作空间。

表1-2 Name和Value匹配对的设置

Name Value 说 明
GeometricOrder 'quadratic' (默认值) | 'linear' 单元的几何阶次
Hgrad 1.5(默认值)|1和2之间的数 网格生长速率
Hmax 正数 最大网格边长
Hmin 非负数 最小网格边长
Hface 用元胞数组表示,元胞数组中编号为奇数的元素用正整数或向量表示面的编号,编号为偶数的元素指定对应面的大小 指定选定面的大小
Hedge 与上面类似,面的编号改为边的编号 指定选定边的大小
Hvertex 与上面类似,边的编号改为顶点的编号 指定选定顶点的大小

使用generateMesh函数的第2种语法格式时,Name参数的值取时生成线性单元,值为时生成二次单元。图5-1中为二维线性单元和二次单元,图5-2中为三维线性单元和二次单元。可见,在三角形单元或四面体单元中,线性单元仅在单元顶点处获得节点,二次单元除了在单元顶点处获得节点,还在相邻顶点连线的中点处获得节点。默认时使用二次单元。

Document Image
\[\]

图5-1 二维线性单元和二次单元

Document Image
\[\]

图5-2 三维线性单元和二次单元

Hgrad参数用于控制采用生长法生成网格时的生成速率。该参数的取值界于1和2之间,默认值为1.5。

Hmax和Hmin参数可以指定网格的最大边长和最小边长,可用于控制网格的整体精度,参数的值更小时将生成更密的网格。

Hface, Hedge和Hvertex参数可以在指定的面、边和顶点处对网格进行加密。

二、绘制网格:pdemesh函数

用generateMesh函数创建网格后,使用pdemesh函数绘制网格的图形。pdemesh函数的语法格式为:

  • pdemesh(model) 绘制model指定的PDE模型的二维或三维网格。
  • pdemesh(mesh) 绘制模型的Mesh属性值mesh定义的网格。
  • pdemesh(nodes,elements) 绘制节点和单元定义的网格。nodes是一个矩阵,大小为2x节点数或3x节点数。elements是表示单元与组成单元的节点之间关联关系的矩阵,大小为每个单元的节点数乘以单元个数。
  • pdemesh(model,u) 绘制解数据的三维图。该语法仅用于二维几何模型。
  • pdemesh(___,Name,Value) 指定Name和Value匹配对绘制网格或解数据的图形。Name和Value匹配对的设置如表1-3所示。
  • pdemesh(p,e,t) 用网格数据p, e和t绘制网格。p, e和t分别表示网格的点数据、边数据和三角形单元数据。
  • pdemesh(p,e,t,u) 用网格绘制PDE节点或三角形数据u的图形。如果u是列向量,绘制节点数据;如果u是行向量,绘制三角形数据。使用pdeplot函数或pdeplot3D函数可以获得更多控制。
  • h = pdemesh(___) 返回图形的句柄。

表1-3 Name和Value匹配对的设置

Name Value 说 明
NodeLabels 'off' (默认) | 'on' 节点标签
ElementLabels 'off' (默认) | 'on' 单元标签
FaceAlpha 1 (默认) | 0-1 面的透明度
EdgeColor 颜色短名称 | 颜色长名称 | RGB分量组合 边的颜色
FaceColor [0 1 1] |颜色短名称 | 颜色长名称 | RGB分量组合 面的颜色

表1-3中EdgeColor参数和FaceColor参数分别设置边和面的颜色,颜色的设置有使用颜色短名称、颜色长名称和RGB分量组合等3种方法,如表1-4中所示。

表1-4 颜色的设置

颜色短名称 颜色长名称 RGB分量组合
y yellow [1 1 0]
m magenta [1 0 1]
c cyan [0 1 1]
r red [1 0 0]
g green [0 1 0]
b blue [0 0 1]
w white [1 1 1]
k black [0 0 0]

三、示例:生成网格并绘图

【例18】下面首先用polyshape函数创建PDE模型的几何模型。

code.matlab
>> t = pi/12:pi/12:2*pi;
>> pg = polyshape({[-0.9638 0.8717 0.8717 -0.9638], 0.4424*cos(t)-0.0082}, ...
                {[0.5312 0.5312 -0.4589 -0.4589], 0.1859*sin(t)+0.0296})
>> tr = triangulation(pg)
>> model = createpde;
>> tns = tr.Points';
>> tes = tr.ConnectivityList';
>> geometryFromMesh(model,tns,tes);

可用pdegplot函数绘制几何模型,效果如图4-9所示。

用generateMesh函数进行网格剖分。

code.matlab
>> mesh=generateMesh(model)
mesh =
  FEMesh - 属性:
             Nodes: [2×1124 double]
          Elements: [6×514 double]
    MaxElementSize: 0.0834
    MinElementSize: 0.0417
     MeshGradation: 1.5000
    GeometricOrder: 'quadratic'

返回的mesh是一个FEMesh对象,引用该对象的属性可以获取节点数据、单元数据、最大单元大小(即最大单元边长)、最小单元大小(即最小单元边长)、网格生长速率和单元阶次。

用pdemesh函数绘制网格。

code.matlab
>> pdemesh(model)

生成图5-3。

Document Image
\[\]

图5-3 网格剖分

下面绘制网格并给网格添加单元标签。用ylim函数调整y坐标轴显示范围。

code.matlab
>> pdemesh(model,'ElementLabels','on')
>> ylim([-0.5,0.5])

生成图5-4。

Document Image
\[\]

图5-4 在网格上添加单元标签

生成网格时用Hmax参数将单元最大边长从原来的0.0834设置为0.04,用pdemesh函数绘制网格。

code.matlab
>> m=generateMesh(model,'Hmax',0.04);
>> pdemesh(m)

生成图5-5。对比图5-3,现在网格明显进行了整体加密。

Document Image
\[\]

图5-5 对网格进行整体加密

对网格整体进行加密可以获得更精确的解,但也会加大计算量,需要计算更长时间才能得到问题的解。所以实际应用中常常只对特殊部位进行网格加密。

下面生成网格时用Hedge参数指定第2条边附近的网格大小设置为0.001,用pdemesh函数绘制网格。

code.matlab
>> m2 = generateMesh(model,'Hedge',{2,0.001})
>> pdemesh(m2)

生成图5-6。可见,图中网格只在第2条边附近进行了网格加密。

Document Image
\[\]

图5-6 对网格进行局部加密