rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
read_msh.m
1 function [p, t] = read_msh(filename)
2 %function [p, t] = read_msh(filename)
3 %
4 % IM 2014-08-14
5 
6 fid = fopen(filename, 'r');
7 
8 % read number of nodes
9 C = textscan(fid, '%d', 1, 'Headerlines', 4);
10 nNodes = C{1};
11 
12 % read nodes coordinates
13 C = textscan(fid, '%d%f%f%f', nNodes);
14 
15 p = [C{2}(:), C{3}(:)]';
16 
17 % read elements
18 C = textscan(fid, '%d', 1, 'CommentStyle', '$');
19 textscan(fid, '%s', 1, 'Delimiter', '\n');
20 nElements = C{1};
21 t = [];
22 
23 for i = 1:nElements
24 
25  C = textscan(fid, '%s', 1, 'Delimiter', '\n');
26  C = textscan(C{1}{1}, '%f');
27  if C{1}(2) == 2
28 
29  t = [t, C{1}(C{1}(3) + (4:6))];
30  end
31 end
32 
33 fclose(fid);
34 
35 % make orientation consistent
36 X1 = p(1, t(2, :)) - p(1, t(1, :));
37 Y1 = p(2, t(2, :)) - p(2, t(1, :));
38 X2 = p(1, t(3, :)) - p(1, t(1, :));
39 Y2 = p(2, t(3, :)) - p(2, t(1, :));
40 
41 reverse = X1.*Y2 - X2.* Y1 < 0;
42 
43 if any(reverse)
44  t([2 3], reverse) = t([3 2], reverse);
45 end
46 
47 end