Function to gather mesh information from gmesh files

Description

function [O1,O2,O3,O4,O5,O6,O7,O8,O9,O10]=getMesh(input)
%Function to gather mesh information from gmesh files
%---------------------------
% DEFINE SHORT-NAME OUTPUTS:
%---------------------------
% O1=msh; Mesh file from gmesh
% O2=Mdpts; Midpoint Database
% O3=cons; Various important constants
% O4=solidpts; Nodes (vertices and midpoints) on solid domain
% O5=fluidpts; Nodes (vertices and midpoints) on fluid domain
% O6=solperimeter; Nodes (vertices and midpoints) on solid/fluid bdry
% O7=outerbdrynodes; Vertices on the outer boundary
% O8=ELsolid; Global element numbers of vertices on solid domain
% O9=ELfluid; Global element numbers of vertices on fluid domain
% O10=edgetri; List of global element #'s in solid touching bdry
%--------------------------------------------------------------------------
global searchtriangles
global solidbdrynodes
disp('Gathering mesh information...')
%Choose particular mesh to use:
if input==1
usemesh='solidfluid.msh';
elseif input==2

usemesh='solidfluid2.msh';
elseif input==3
usemesh='solidfluid3.msh';
elseif input==4
usemesh='solidfluid4.msh';
elseif input==5
usemesh='solidfluid5.msh';
elseif input==6
usemesh='solidfluid6.msh';
elseif input==7
usemesh='solidfluid7.msh';
elseif input==-1 % <----debugging with mesh by hand
usemesh='fixedhandmesh1.msh';
elseif input==-2 % <----debugging with mesh by hand
usemesh='fixedhandmesh2.msh';
else
usemesh='solidfluid.msh';
end
disp([' - Using Mesh: ',usemesh])
msh = load_gmsh2(usemesh,[1 2]); % [1,2] requests variables for lines and
triangles only
M=msh.nbNod; % Number of nodes in mesh
NODECO=(1/3)*msh.POS(1:M,1:2); % NODE COordinates

msh.POS(1:M,1:2)=NODECO;
L=msh.nbTriangles; % Number of elements (triangular)
ELNODE=msh.TRIANGLES(1:L,1:4); % Global node numbers for all elements; element domain
chtype=ELNODE(1,end); % get tag for domain type; assume first type listed is fluid
k=0;
j=0;
for i=1:L % get a list of elements in each domain
if ELNODE(i,4)~=chtype
k=k+1;
ELsolid(k,1:3)=ELNODE(i,1:3); %coordinates of elements in solid domain
else
j=j+1;
ELfluid(j,1:3)=ELNODE(i,1:3); %coordinates of elements in fluid domain
end
end
nELsolid=k; % number of elements in the solid domain
nELfluid=j; % number of elements in the fluid domain
% The following information can be used to subdivide the boundary into segments
%global L1
%L1=msh.nbLines; % Number of element edges on the natural boundary

%global BDRYEDGES
BDRYEDGES=msh.LINES; % EDGES (node, node, ...)
[nBdryNodes,dum]=size(BDRYEDGES); % total number of nodes on a boundary
k=1;
k2=1;
chtype=BDRYEDGES(1,end);
for i=1:nBdryNodes
if BDRYEDGES(i,end)==chtype
outerbdrynodes(k,1)=BDRYEDGES(i,1);
k=k+1;
else
solidbdrynodes(k2,1)=BDRYEDGES(i,1);
k2=k2+1;
end
end
%----------------------
%Determine fluid/solid nodes
%----------------------
nfluidpts=0;
nsolidpts=0;
temp=ELfluid(:,1:3);
temp2=ELsolid(:,1:3);
for k=1:M
check=isempty(find(k==temp));

if check==0
nfluidpts=nfluidpts+1;
fluidpts(nfluidpts)=k;
end
check=isempty(find(k==temp2));
if check==0
nsolidpts=nsolidpts+1;
solidpts(nsolidpts)=k;
end
end
otherDim=nfluidpts;
nsolidnodes=nsolidpts;
%-------------------
% Midpoint Database
%-------------------
function [out]=mdptcalc(v1,v2)
% Gives midpoint (x,y) coordinates between global nodes v1 and v2
% also places a flag for the domain
% out(3)=0 means pt in interior of solid
% out(3)=1 means pt on solid bdry
% out(3)=2 means pt outside solid domain not on solid bdry
v1coord=NODECO(v1,1:2);
v2coord=NODECO(v2,1:2);
out(1)=.5*(v1coord(1)+v2coord(1));
out(2)=.5*(v1coord(2)+v2coord(2));
out(3)=0;

check1=isempty(find(v1==fluidpts)); %is v1 in fluid domain, 0=yes,1=no
check2=isempty(find(v2==fluidpts)); %is v2 in fluid domain, 0=yes,1=no
if check1+check2==0 %if both vertices are in fluid domain
index1=find(v1==solidbdrynodes); % where is v1 on solid bdry if at
all?
index2=find(v2==solidbdrynodes);
check3=isempty(index1);
check4=isempty(index2);
if check3+check4==0 %if both vertices are on the solid bdry
if abs(index1-index2)==1 || abs(index1-index2)==length(
solidbdrynodes)-1
out(3)=1;
end
else
out(3)=2;
end
end
end
disp('Generating midpoint database...')
disp(' ')
%Mdpts= [x-coord, y-coord, bdry?, local node #1, global elem #1, local node
#2,
% global element #2, fluid/solid]
% loctype is from 1-6 depending on what node is across
% midpoint could be used twice, so have 2 loctype and node2

% If a point is in both domains, notated as 1, fluid=2, solid=0
tol=10^(-8);
Mdpts=zeros(3*M,8); %pre-allocate space since no more than triple the nodes
for mdpts
Mdpts(:,3)=ones(3*M,1); %assume midpoint is on boundary until proven not
nMdpts=1; % will count the number of unique midpoints in the mesh
for i=1:L % cycle through each triangle (can we skip solid domain midpts?)
v1=ELNODE(i,1); v2=ELNODE(i,2); v3=ELNODE(i,3);
mid=zeros(3,4);
mid(1,1:3)=mdptcalc(v2,v3); %organize midpoints in same way as local basis
phi's
mid(2,1:3)=mdptcalc(v3,v1);
mid(3,1:3)=mdptcalc(v1,v2);
mid(:,4)=[4;5;6];
%Check to see if any of the above are repeats
for j=1:3
vec=ones(nMdpts,1);
diff_x=abs(mid(j,1)*vec-Mdpts(1:nMdpts,1));
diff_y=abs(mid(j,2)*vec-Mdpts(1:nMdpts,2));
check=min(diff_x+diff_y);
if check>tol
Mdpts(nMdpts,1:2)=mid(j,1:2);
Mdpts(nMdpts,4)=mid(j,4);
Mdpts(nMdpts,5)=i;
Mdpts(nMdpts,8)=mid(j,3);
nMdpts=nMdpts+1;

else
[dum,place]=min(diff_x+diff_y);
Mdpts(place,6:7)=[j+3,i];
Mdpts(place,3)=0; %mark that your midpoint isn't on bdry
end
end
end
nMdpts=nMdpts-1;
Mdpts=Mdpts(1:nMdpts,1:8);
%----------------------------------------
%Determine the fluid/solid midpoints
%----------------------------------------
temp=Mdpts(:,8);
count=0;
clear solperimeter
for k=1:nMdpts
if temp(k)~=0
nfluidpts=nfluidpts+1;
fluidpts(nfluidpts)=k+M;
end
if temp(k)~=2
nsolidpts=nsolidpts+1;
solidpts(nsolidpts)=k+M;
if temp(k)==1
count=count+1;

solperimeter(count,1)=k+M;
end
end
end
solperimeter=[solidbdrynodes; solperimeter];
nsolperimeter=length(solperimeter);
%Build a list of global node numbers that intersect the solid boundary,
%edgetri
edgetri=zeros(0,2);
count=0;
chtype=ELNODE(1,end); % get tag for domain type; assume first type
listed is fluid
for q=1:L
if ELNODE(q,end)~=chtype % if we are looking at an element in solid
domain
count=count+1;
v1=ELNODE(q,1);
test1=isempty(find(v1==solidbdrynodes)); %see if any of the vertices
are on solid bdry
v2=ELNODE(q,2);
test2=isempty(find(v2==solidbdrynodes)); %test=0 means yes on the bdry
v3=ELNODE(q,3);
test3=isempty(find(v3==solidbdrynodes));
if test1+test2+test3==1 % if two are on bdry



edgetri=[edgetri;[q,count]]; %record the global element number and
solid global element number
end
end
end
nedgetri=length(edgetri); % number of solid elements on bdry
cons=[nELsolid,nELfluid,otherDim,nsolidpts,nfluidpts,nMdpts,nsolperimeter,
nedgetri];
searchtriangles=[Mdpts(:,5),Mdpts(:,7)]; %Global element numbers for each
midpoint
% DEFINE SHORT-NAME OUTPUTS:
O1=msh;
O2=Mdpts;
O3=cons;
O4=solidpts;
O5=fluidpts;
O6=solperimeter;
O7=outerbdrynodes;
O8=ELsolid;
O9=ELfluid;
O10=edgetri;
https://matlab1.com/jupyter-using-it-and-its-great-functions/
http://gmsh.info/doc/texinfo/gmsh.html

Reviews

There are no reviews yet.

Be the first to review “Function to gather mesh information from gmesh files”
Category: