今天给大家分享一个很有意思的划分网格工具:可以根据图像进行非结构化划分网格。
先看看一些效果图吧:
主函数文件
用户可通过调节结构体里面的参数进行图像的拾取及单元尺寸的控制,需要注意有以下几点:
imread
函数进行读取,支持bmp、png、jpg格式;h_min
与h_max
分别控制单元的最小尺寸与最大尺寸;h_growth
表示单元尺寸的增长率,具体含义我解释不清楚,反正,h_growth越大,网格越稀疏,h_growth越小,网格越密集;scale
与simplify_tol
也是控制网格局部加密的函数,会根据内外轮廓进行适当局部加密。scale越大网格越密集,simplify_tol越小越密集,用户可自己慢慢调节,知道调整至自己想要的效果,具体含义还需自己多玩玩。%% data_img
% scale 越大越密集
% simplify_tol 越小越密集
img_data = struct(...
'img', imread('model.bmp'),...
'scale', 0.6,...
'simplify_tol',0.1,...
'h_growth', 1.2,...
'h_min', 0.1,...
'h_max', 20.0...
);
%% run
mesh = get_mesh(img_data);
%% plot
fig = figure()
set(fig,'Color','white')
pdemesh(mesh)
axis('tight')
axis('off')
end
getmesh函数
function mesh = get_mesh(img_data)
% extract
img = img_data.img;
scale = img_data.scale;
simplify_tol = img_data.simplify_tol;
h_growth = img_data.h_growth;
h_min = img_data.h_min;
h_max = img_data.h_max;
% transform the image into binary
img = rgb2gray(img);
img = imbinarize(img);
img = img==false;
% rotate coordinate
img = fliplr(img.');
% get the contours of the image
c_cell = contour_create(img, scale);
c_cell = contour_simplify(c_cell, simplify_tol);
% create the 2d triangulation
mesh = triangulation_create(c_cell, h_growth, h_min, h_max);
既然木木长期玩转Abaqus,那肯定是要导入到Abaqus中滴!
需要在原有数据结构中做一些改变,并输出至txt文件中,方便inp引用,具体代码如下:
clear;
mesh = run_example();
Node = mesh.Nodes;
Node = Node';
Element = mesh.Elements;
Element = Element';
elementIDs = (1:size(Element, 1))';
elementDataWithIDs = [elementIDs, Element];
nodeIDs = (1:size(Node, 1))';
nodeDataWithIDs = [nodeIDs, Node];
fileName = 'Element.txt';
dlmwrite(fileName, elementDataWithIDs, 'delimiter', ',');
fileName = 'Node.txt';
dlmwrite(fileName, nodeDataWithIDs, 'delimiter', ',');
inp文件做如下修改,节点、单元数据修改为:*include,input = .\Node.txt
和*include,input = .\Element.txt
,记得将文本文件放在Abaqus工作目录下。
*Node
*include,input = .\Node.txt
*Element, type=CPS3
*include,input = .\Element.txt
然后就可以导入进Abaqus,进行有限元的一些操作了,效果如下:
令我感到惊奇的是,我怕生成的网格看上去好看,质量有的不太行,于是我又进行了网格质量检查,发现0警告,0错误!!!,只能说:牛批!!!
运行了两个案例,效果如下,供大家娱乐~
https://github.com/otvam/mesh_from_bitmap_matlab