-
Notifications
You must be signed in to change notification settings - Fork 6
/
readfoildata.m
124 lines (108 loc) · 3.59 KB
/
readfoildata.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
function [XUpper,ZUpper,XLower,ZLower] = readfoildata(airfoil)
%READFOILDATA Parses airfoil coordinate files.
%
% READFOILDATA(airfoil) reads the coordinate file corresponding to the
% airfoil named in the argument. The coordinate file can be in a
% Selig-formatted file or in a Matlab .mat file containing a matrix n
% with two columns. The argument should simply be the name of the
% airfoil, without a file extension.
%
% [XUpper,ZUpper,XLower,ZLower] = readfoildata(airfoil) unpacks the
% coordinates contained in the file.
%
% Note: the file setup.m should contain the path to the library
% containing the airfoil definiton files.
%
% Example
% =======
% [XUpper,ZUpper,XLower,ZLower] = readfoildata('naca663218')
% hold on, axis equal, grid on
% plot(XUpper, ZUpper), plot(XLower, ZLower)
% xlabel('X'), ylabel('Z')
% -------------------------------------------------------------------------
% Aircraft Geometry Toolbox v0.1.0, Andras Sobester 2014.
%
% Sobester, A, Forrester, A I J, "Aircraft Aerodynamic Design - Geometry
% and Optimization", Wiley, 2014.
% -------------------------------------------------------------------------
global SELIGPATH
global MATAIRFOILPATH
setup
afpath2 = SELIGPATH;
afpath1 = MATAIRFOILPATH;
XUpper = []; XLower = [];
ZUpper = []; ZLower = [];
if exist([afpath1,airfoil,'.mat'],'file')
display('Airfoil description found in .mat file')
load([afpath1,airfoil,'.mat'])
l = floor(size(n,1)/2);
if l==size(n,1)/2
XUpper = n(1:l,1);
ZUpper = n(1:l,2);
XLower = n(l+1:end,1); %#ok<*COLND>
ZLower = n(l+1:end,2);
else
XUpper = n(1:l+1,1);
ZUpper = n(1:l+1,2);
XLower = n(l+1:end,1);
ZLower = n(l+1:end,2);
if XUpper(2) > XUpper(3)
XUpper = XUpper(end:-1:1);
ZUpper = ZUpper(end:-1:1);
end
if XLower(2) > XLower(3)
XLower = XLower(end:-1:1);
ZLower = ZLower(end:-1:1);
end
end
elseif exist([afpath2,airfoil,'.dat'],'file')
fid = fopen([afpath2,airfoil,'.dat'],'r');
fgetl(fid);
coords = [1 1];
while coords(2) >= 0
newl = fgetl(fid);
coords = str2num(newl);
if coords(2) >= 0
XUpper = [XUpper,coords(1)]; %#ok<*AGROW>
ZUpper = [ZUpper,coords(2)];
else
XLower = [XLower,coords(1)];
ZLower = [ZLower,coords(2)];
end
end
while coords(1) ~= 1
newl = fgetl(fid);
coords = str2num(newl); %#ok<*ST2NM>
XLower = [XLower,coords(1)];
ZLower = [ZLower,coords(2)];
end
if XLower(1)~=0
XLower = [0,XLower];
ZLower = [0,ZLower];
end
if XUpper(end)~=0
XUpper = [XUpper,0];
ZUpper = [ZUpper,0];
end
XUpper = XUpper(end:-1:1);
ZUpper = ZUpper(end:-1:1);
else
display('Airfoil description not found');
XUpper = []; ZUpper = []; XLower = []; ZLower = [];
return
end
% The first few entries in some airfoil descriptions might contain very
% slightly negative abscissas. This will cause problems when fitting
% explicit (y=f(x)) curves to the data, such as when applying a CST
% transform. Simply comment out the rest of the function if this behaviour
% is not desired.
for i=0:min([10,length(XUpper),length(XLower)])
if XUpper(end-i)<0
XUpper(end-i) = [];
ZUpper(end-i) = [];
end
if XLower(i+1)<0
XLower(i+1) = [];
ZLower(i+1) = [];
end
end