IFEM网格剖分(一):普通网格剖分

首先在github上下载陈龙包IFEM.
然后把包添加到当前的依赖函数库里:File -> Set Path(IFEM) -> Add with Subfolders

1、三角形一致网格剖分

>> box = [-1, 1, -1, 1];
>> h = 0.1;
>> [node, elem] = squaremesh(box, h);
>> showmesh(node, elem)

请添加图片描述

2、正方形一致网格剖分

>> [node,elem,T] = squarequadmesh(box,h);
>> showmesh(node,elem);

请添加图片描述

3、含退化单元的非结构性网格

在原有的一致三角形网格上使用公式:
x = x ^ + 0.1 ∗ sin ⁡ ( 2 π x ^ ) ∗ sin ⁡ ( 2 π y ^ ) y = y ^ + 0.1 ∗ sin ⁡ ( 2 π x ^ ) ∗ sin ⁡ ( 2 π y ^ ) x=\hat{x}+0.1*\sin(2\pi\hat{x})*\sin(2\pi\hat{y})\\y=\hat{y}+0.1*\sin(2\pi\hat{x})*\sin(2\pi\hat{y}) x=x^+0.1sin(2πx^)sin(2πy^)y=y^+0.1sin(2πx^)sin(2πy^)
在其他的网格上我们也可以使用同样的方法生成非结构网格

>> box = [-1, 1, -1, 1];
>> h = 0.1;
>> [node, elem] = squaremesh(box, h);
x = node(:,1);y=node(:,2);
node(:,1) = x+0.1.*sin(2*pi.*x).*sin(2*pi.*y);
node(:,2) = y+0.1.*sin(2*pi.*x).*sin(2*pi.*y);
>> showmesh(node, elem);

请添加图片描述

4、Voronoi多边形网格(Polymesher):

参考论文:PolyMesher: a general-purpose mesh generator for polygonal elements written in Matlab

[node, elem, ~, ~, ~] = PolyMesher(@MbbDomain,100, 100);

这里,参数中的第一个100是我们要生成的单元个数,第二个100是迭代次数(一般不会取太低,防止单元间尺寸差距过大)。
请添加图片描述
我们再使用showmesh(node, elem);绘制出熟悉的网格。
请添加图片描述

注意

由于一些版本中的陈龙包IFEM中的showmesh函数只能绘制三角形或四边形网格,而绘制多边形网格需要用函数showmeshpoly函数,但我认为showmeshpoly函数画出来的蓝色太丑了。于是绘制多边形网格时,使用mVEM包(Copyright © Terence Yu)里的showmesh函数,其可以展示2D的三角形和多边形网格,甚至3D的网格,功能更加强大,因此绘制多边形时我们采用该函数。

function showmesh(node,elem,options)
%Showmesh displays a mesh in 2-D and 3-D.
%
% Copyright (C) Terence Yu

if nargin==2, options.FaceAlpha = 0.4; end

dim = size(node,2);
if ~iscell(elem)
    h = patch('Faces', elem, 'Vertices', node);    
end
if iscell(elem)
    if iscell(elem{1}), elem = vertcat(elem{:}); end
    max_n_vertices = max(cellfun(@length, elem));
    padding_func = @(vertex_ind) [vertex_ind,...
        NaN(1,max_n_vertices-length(vertex_ind))];  % function to pad the vacancies
    tpad = cellfun(padding_func, elem, 'UniformOutput', false);
    tpad = vertcat(tpad{:});
    h = patch('Faces', tpad, 'Vertices', node);
end

if dim==3
    view(3); set(h,'FaceAlpha',options.FaceAlpha); % transparency
end

if isfield(options,'facecolor') 
    facecolor = options.facecolor;
else
    facecolor = [0.5 0.9 0.45];
end
set(h,'facecolor',facecolor,'edgecolor','k');
axis equal; axis tight;

5、非一致的三角形剖分(Distmesh)

Distmesh可以生成很多种形状的图形,包括在图形中掏一个洞等;

fd=inline('drectangle(p,-1,1,-1,1)','p');
box=[-1,-1;1,1];
fix=[-1,-1;-1,1;1,-1;1,1];
[p,t,~,~]=odtmesh2d(fd,@huniform,0.2,box,fix,1);

其中,变量p,t即为node,elem
请添加图片描述

fd=inline('ddiff(drectangle(p,-1,1,-1,1),dcircle(p,0,0,0.4))','p');
box=[-1,-1;1,1];
fix=[-1,-1;-1,1;1,-1;1,1];
[p,t,~,~]=odtmesh2d(fd,@huniform,0.1,box,fix,1);

在图形中掏一个洞

请添加图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
ifem包是一个用于有限元分析的程序包,它包含了一系列用于求解结构力学、热传导和流体力学问题的程序,并且提供了一套简单易用的接口和指令集。要想看懂ifem包中的程序,首先需要了解有限元分析的基本原理和方法。有限元分析是一种数值计算方法,它通过将复杂的结构或物理问题离散化为有限数量的单元,再通过数值计算的方法求解各个单元的力学性能,最后得出整体结构或系统的性能。 在学习ifem包中的程序时,可以按照以下步骤进行: 1. 了解ifem包的基本结构和功能,查看官方文档和使用手册,掌握其提供的各种程序和函数的作用和用法。 2. 理解有限元分析的基本原理和方法,包括单元划分、边界条件、载荷施加等概念。 3. 阅读ifem包中的示例程序和案例,通过实际的代码来学习其使用方法和编程技巧。可以尝试运行这些示例程序,查看其输出结果,加深对ifem包的理解。 4. 参考相关的学术书籍、论文或在线资源,进一步了解有限元分析的理论知识和实际应用。 5. 实践编写自己的程序,尝试解决具体的结构力学、热传导或流体力学问题,逐步提高对ifem程序包的掌握程度。 总之,要想真正理解ifem包中的程序,需要有扎实的数值计算和有限元分析基础,逐步掌握其使用方法,并通过实际的编程练习来提高自己的能力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值