Files
senior-design/ronald/Ronald.m
2010-04-17 12:00:00 -05:00

521 lines
18 KiB
Matlab
Executable File

%Ronald
%all alfas in DEGREES!
%by ascorrea, with help from Jacob Huffman
%"filler" variable just makes it easier to switch between Ronald and Grimace
function Ronald(paramfile, pranformfile, filler)
%DIRECTORY LOCATIONS--------------------------------------------------------------]
rootLOCATION='/Users/anthonyscorrea/Documents/MATLAB/AE441 - Home Edition/Matlab Code';
airfoilLOCATION='/Users/anthonyscorrea/Documents/MATLAB/AE441 - Home Edition/Airfoils';
pranformLOCATION='/Users/anthonyscorrea/Documents/MATLAB/AE441 - Home Edition/Planforms';
pranformConstraintLOCATION='/Users/anthonyscorrea/Documents/MATLAB/AE441 - Home Edition/Planform Constraints';
paramLOCATION='/Users/anthonyscorrea/Documents/MATLAB/AE441 - Home Edition/Parameter Files';
outputsLOCATION='/Users/anthonyscorrea/Documents/MATLAB/AE441 - Home Edition/superGrimace Outputs';
%-----------------------------------------------------------------------]
n=50;
cd(paramLOCATION);
[variablenames, variablevalues]=textread(paramfile, '%s %f');
cd(pranformLOCATION)
[spans, chords, offsets, airfoil]=textread(pranformfile, '%f %f %f %s');
cd(airfoilLOCATION)
[sref swet]=WhettedArea(spans, chords, offsets, airfoil, n);
for k = 1:length(variablenames)
eval([variablenames{k} '= variablevalues(k);']);
end
Dragredux_BLI=(1-Dragredux_BLI/100);
wingspan=2*spans(end);
AR=wingspan^2/sref;
wakeplot=findwake(airfoil, chords, spans, offsets, n, alt_cruise, M_cruise, laminarflow_cruise, fuse_width);
%TAKEOFF------------------------------------------------------------------]
% cd0_to=findcd0(c_f, M_to, sref, swet);
cd0_to=findcd0(spans, chords, offsets, airfoil, n, laminarflow_to, alt_to, M_to, sref, c_f, D_engine, cd_landinggear, sfront_landinggear, fuse_width);
% finddragpolar(cd0_to, cLalpha_to, cL0, efficiency_to, AR, cd_correction, 'Takeoff')
% cLreq_to=findcLrequired(alt_to, sref, M_to, weight_to);
cLreq_to=.48;
alphareq_to=findalpharequired(cLalpha, cL0, cLreq_to);
cD_to=findcD(AR, efficiency_to, cd0_to, cLreq_to, cd_correction);
eloverdee_to=cLreq_to/cD_to;
cM_to=cMalpha*alphareq_to+cM0;
q_to=finddynpress(alt_to, M_to);
cD_to=cD_to*Dragredux_BLI;
cd0_to=cd0_to*Dragredux_BLI;
D_to=cD_to*q_to*sref;
%CRUISE------------------------------------------------------------------]
cd0_cruise=findcd0(spans, chords, offsets, airfoil, n, laminarflow_cruise, alt_cruise, M_cruise, sref, c_f, D_engine, 0, 0, fuse_width);
% finddragpolar(cd0_cruise, cLalpha, cL0, efficiency_cruise, AR, cd_correction, 'Cruise')
cLreq_cruise=findcLrequired(alt_cruise, sref, M_cruise, weight_cruise);
alphareq_cruise=findalpharequired(cLalpha, cL0, cLreq_cruise);
cD_cruise=findcD(AR, efficiency_cruise, cd0_cruise, cLreq_cruise, cd_correction);
cM_cruise=cMalpha*alphareq_cruise+cM0;
q_cruise=finddynpress(alt_cruise, M_cruise);
cD_cruise=cD_cruise*Dragredux_BLI;
cd0_cruise=cd0_cruise*Dragredux_BLI;
D_cruise=cD_cruise*q_cruise*sref;
eloverdee_cruise=cLreq_cruise/cD_cruise;
%LOITER------------------------------------------------------------------]
cd0_loiter=findcd0(spans, chords, offsets, airfoil, n, laminarflow_loiter, alt_loiter, M_loiter, sref, c_f, D_engine, 0, 0, fuse_width);
% finddragpolar(cd0_loiter, cLalpha_loiter, cL0, efficiency_loiter, AR, cd_correction, 'Loiter')
cLreq_loiter=findcLrequired(alt_loiter, sref, M_loiter, weight_loiter);
alphareq_loiter=findalpharequired(cLalpha, cL0, cLreq_loiter);
cD_loiter=findcD(AR, efficiency_loiter, cd0_loiter, cLreq_loiter, cd_correction);
cM_loiter=cMalpha*alphareq_loiter+cM0;
q_loiter=finddynpress(alt_loiter, M_loiter);
cD_loiter=cD_loiter*Dragredux_BLI;
cd0_loiter=cd0_loiter*Dragredux_BLI;
D_loiter=cD_loiter*q_loiter*sref;
eloverdee_loiter=cLreq_loiter/cD_loiter;
%LANDING------------------------------------------------------------------]
cd0_landing=findcd0(spans, chords, offsets, airfoil, n, laminarflow_landing, alt_landing, M_landing, sref, c_f, D_engine, cd_landinggear, sfront_landinggear, fuse_width);
% finddragpolar(cd0_landing, cLalpha_landing, cL0, efficiency_landing, AR, cd_correction, 'Landing')
% cLreq_landing=findcLrequired(alt_landing, sref, M_landing, weight_landing);
cLreq_landing=.401;
alphareq_landing=findalpharequired(cLalpha, cL0, cLreq_landing);
cD_landing=findcD(AR, efficiency_landing, cd0_landing, cLreq_landing, cd_correction);
cM_landing=cMalpha*alphareq_landing+cM0;
q_landing=finddynpress(alt_landing, M_landing);
cD_landing=cD_landing*Dragredux_BLI;
cd0_landing=cd0_landing*Dragredux_BLI;
D_landing=cD_landing*q_landing*sref;
eloverdee_landing=cLreq_landing/cD_landing;
cd(pranformLOCATION)
filenameplan=regexprep(pranformfile, '.plan', 'ronaldplus.tiff');
filenameoutput=regexprep(pranformfile, '.plan', 'ronaldplus.txt');
plottitle=regexprep(pranformfile, '.plan', '');
fid = fopen(filenameoutput, 'w');
fprintf(plottitle);
fprintf('---------------------------------------------------\n');
fprintf(fid, plottitle);
fprintf(fid,'---------------------------------------------------\n');
fprintf('Wingspan: %f, AR: %f, Planform Area: %f, Wetted Area: %f \n', wingspan, AR, sref, swet);
fprintf(fid, 'Wingspan: %f, AR: %f, Planform Area: %f, Wetted Area: %f \n', wingspan, AR, sref, swet);
fprintf('\n----------Takeoff--------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_to, cd0_to, cLreq_to, cD_to, D_to, cM_to, eloverdee_to);
fprintf(fid, '\n----------Takeoff--------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_to, cd0_to, cLreq_to, cD_to, D_to, cM_to, eloverdee_to);
fprintf('\n----------Cruise---------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_cruise, cd0_cruise, cLreq_cruise, cD_cruise, D_cruise, cM_cruise, eloverdee_cruise);
fprintf(fid, '\n----------Cruise---------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_cruise, cd0_cruise, cLreq_cruise, cD_cruise, D_cruise, cM_cruise, eloverdee_cruise);
fprintf('\n----------Loiter---------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_loiter, cd0_loiter, cLreq_loiter, cD_loiter, D_loiter, cM_loiter, eloverdee_loiter);
fprintf(fid, '\n----------Loiter---------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_loiter, cd0_loiter, cLreq_loiter, cD_loiter, D_loiter, cM_loiter, eloverdee_loiter);
fprintf('\n----------Landing--------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_landing, cd0_landing, cLreq_landing, cD_landing, D_landing, cM_landing, eloverdee_landing);
fprintf(fid, '\n----------Landing--------------------------------\n alfa: %f, Cd0: %f, CL: %f, CD: %f, D: %f, CM: %f, L/D: %f \n', alphareq_landing, cd0_landing, cLreq_landing, cD_landing, D_landing, cM_landing, eloverdee_landing);
fclose(fid);
cd(rootLOCATION)
end
% function cd0=findcd0(c_f, M, sref, swet)
% if M>.7
% c_f=c_f*(1-.09*M^2);
% end
% cd0=c_f*(swet/sref);
% end
function cd0=findcd0(spans, chords, offsets, airfoil, n, laminarflow, alt, v_mach, sref, c_f, D_engine, cd_lg, Sfront_lg, width)
wingSpan = 1;
% n = 50;
width=width/2;
[q v_fps dynvisc]=findconstants(alt, v_mach);
drag=0;
drag_fuse=0;
drag_wing=0;
Chords = findChords(n, chords, spans);
for i = 1:(size(chords)-1)
for j = 1:n
dist = wingSpan*(spans(i+1)-spans(i))./n;
chordloc=linspace(0, Chords(i,j));
delta_x = Chords(i,j)/100;
if spans(i)>width
for k = 1:100
x(k)= k * Chords(i,j)/100;
Re_x(k)= v_fps * x(k)/dynvisc;
if (k <= 100*laminarflow )
cf_x(k) = 0.664 /(sqrt(Re_x(k)));
else % Turbulent
cf_x(k) = 0.455 /(log(0.06 * Re_x(k))^2);
end
xcf_x(k)=x(k)*cf_x(k);
end
t = trapz(cf_x);
Cf = 2 * delta_x * t /Chords(i,j);
drag_section = q*Cf*findPerim(airfoil{i}, Chords(i,j), wingSpan).*dist;
drag_wing=drag_wing+drag_section;
else
for k = 1:100
x(k)= k * Chords(i,j)/100;
Re_x(k)= v_fps * x(k)/dynvisc;
if (k <= 100*laminarflow -10)
cf_x(k) = 0.664 /(sqrt(Re_x(k)));
else % Turbulent
cf_x(k) = 0.455 /(log(0.06 * Re_x(k))^2);
end
xcf_x(k)=x(k)*cf_x(k);
end
t = trapz(cf_x);
Cf = 2 * delta_x * t /Chords(i,j);
drag_section = q*Cf*findPerim(airfoil{i}, Chords(i,j), wingSpan).*dist;
drag_fuse=drag_fuse+drag_section;
end
t = trapz(cf_x);
Cf = 2 * delta_x * t /Chords(i,j);
drag_section = q*Cf*findPerim(airfoil{i}, Chords(i,j), wingSpan).*dist;
drag=drag+drag_section;
end
end
if v_mach>.7
c_f=c_f*(1-.09*v_mach)^2;
end
% cd0engine=c_f*(s_engine/sref);
D_lg=Sfront_lg*q*cd_lg;
D_wing=drag_wing*2;
D_fuse=drag_fuse*2;
drag_tot=D_wing+D_engine+D_lg+D_fuse;
cd0=drag_tot/(q*sref);
cD_lg=D_lg/(q*sref);
cD_engine=D_engine/(q*sref);
cD_wing=D_wing/(q*sref);
cD_fuse=D_fuse/(q*sref);
end
function finddragpolar(cd0, cl_alfa, cL0, e, ar, cd_correction, filename)
alphadeg=[-12:10];
% alpha=(pi/180)*(alphadeg);
alpha=alphadeg;
cL_alfa=cl_alfa*(ar/(ar+(2*(ar+4)/(ar+2))));
for i=1:length(alpha)
C_L(i)=cL_alfa*(alpha(i))+cL0;
cd_i(i)=C_L(i)^2/(pi*ar*e);
C_d(i)=cd0+cd_i(i)+cd_correction;
end
graphname='Drag Polar';
hold on
grid on
axisX0=linspace(0,max(cd));
axisY0=zeros(1,length(axisX0));
plot(axisX0, axisY0,'k--');
plot(C_d, C_L, 'k', 'LineWidth', 2);
plot(C_d, C_L, 'k.');
title(graphname);
xlabel('C_d', 'FontSize', 16);
ylabel('C_L', 'FontSize', 16);
axis([0, .02, -.3, .4]);
set(gca, 'FontSize',16)
% for i=1:length(alphadeg)
% alphalabel=num2str(alphadeg(i));
% label=[' \alpha =' alphalabel];
% text(C_d(i), C_L(i), label)
% end
print ('-dtiff', filename)
grid off
close(1)
end
function q=finddynpress(alt, v_mach)
if alt < 36152
temp=59-.00356*alt;
press=2116*((temp+459.7)/518.6)^5.256;
elseif alt < 82345
temp=-70;
press=473.1*exp(1.73-.000048*alt);
else
print('Program Not Valid for given altitude')
end
%slpcuft: clugs ber cubic foot
density_slpcuft=press/(1718*(temp+459.7));
v_fps=v_mach*sqrt(1.4*1718*(temp+459.7));
q=.5*density_slpcuft*v_fps^2;
end
function [q v_fps dynvisc]=findconstants(alt, v_mach)
if alt < 36152
temp=59-.00356*alt;
press=2116*((temp+459.7)/518.6)^5.256;
elseif alt < 82345
temp=-70;
press=473.1*exp(1.73-.000048*alt);
else
print('Program Not Valid for given altitude')
end
%slpcuft: clugs ber cubic foot
density_slpcuft=press/(1718*(temp+459.7));
v_fps=v_mach*sqrt(1.4*1718*(temp+459.7));
q=finddynpress(alt, v_mach);
S = 110.4;
beta = 1.458e-6;
temp_k=[(temp-32) / (1.8)] + 273 ;
viscosity_pascalseconds = (beta*temp_k^(1.5))/(temp_k+S);
%kgpmcu:kilograms per meter cubed
%msqpse:meters squared per second
%sqftpsec:square feet per second
density_kgpmcu=density_slpcuft*515.4;
dynamic_viscosity_msqpsec=viscosity_pascalseconds/density_kgpmcu;
dynamic_viscosity_sqftpsec=dynamic_viscosity_msqpsec*10.76;
dynvisc=dynamic_viscosity_sqftpsec;
density=density_slpcuft;
end
function cLreq=findcLrequired(alt, s, v_mach, lift)
q=finddynpress(alt, v_mach);
cLreq=lift/(q*s);
end
function alpha=findalpharequired(cLalpha, cL0, cLrequired)
alpha=(cLrequired-cL0)/cLalpha;
end
function cD=findcD(ar, e, cd0, C_L, cd_correction)
% e=4.61*(1-.045*ar^.68)*cosd(sweep_LE)^.15-3.1;
cd_i=C_L^2/(pi*ar*e);
cd_i=C_L^2/(pi*ar*e);
cD=cd0+cd_i+cd_correction;
end
function [pranformArea WetArea]=WhettedArea(spans, chords, offsets, airfoil, n)
% fileName = 'AirData.mat';
wingSpan = 1;
% n = 50;
engineArea=0;
Area = 0;
pranformArea = 0;
Chords = findChords(n, chords, spans);
for i = 1:(size(chords)-1)
for j = 1:n
Chords(i,j);
dist = wingSpan*(spans(i+1)-spans(i))./n;
Area = Area+findPerim( airfoil{i}, Chords(i,j), wingSpan).*dist;
end
end
for i = 1:(size(chords)-1)
for j = 1:n
dist = wingSpan*(spans(i+1)-spans(i))./n;
pranformArea = pranformArea+Chords(i,j).*dist;
% fprintf('Chord: %f pranformArea: %f \n', Chords(i,j), pranformArea)
end
end
Area = Area *2+engineArea;
WetArea = Area;
pranformArea = pranformArea*2;
end
function Chords = findChords( n, Chord, X )
for( i = 1:(length(Chord)-1) )
Xtemp = linspace(X(i),X(i+1),n);
Chords(i,:) = (Chord(i+1)-Chord(i))./(X(i+1)-X(i)).*(Xtemp-X(i))+Chord(i);
end
end
function peri = findPerim(airFile, chord, span)
peri = 0;
Airfoil = load(airFile);
Airfoil = Airfoil*chord*span;
for i = 1:(size(Airfoil,1)-1)
peri = peri + sqrt((Airfoil(i+1,1)-Airfoil(i,1))^2+(Airfoil(i+1,2)-Airfoil(i,2))^2);
end
end
function [plotLE plotTE]=plotpranform(spans, chords, offsets, n)
Chords = findChords(n, chords, spans);
%plot planform
for i = 1:(size(chords)-1)
dist=0;
for j = 1:n
Chords(i,j);
dist = (spans(i+1)-spans(i))./n;
if i==1
xplotLE(i,j+1)=spans(1)+dist*(j);
else
xplotLE(i,1)=xplotLE(i-1,end);
xplotLE(i,j+1)=xplotLE(i-1,end)+dist*(j);
end
fitX(1)=spans(i);
fitX(2)=spans(i+1);
fitY(1)=offsets(i);
fitY(2)=offsets(i+1);
a = polyfit(fitX, fitY,1);
yplotLE(i,j) = a(1)*xplotLE(i,j)+a(2);
end
end
plotLE=zeros(1,2);
plotTE=zeros(1,2);
for i=1:(size(chords)-1)
for j=1:n
plotLE=[plotLE; xplotLE(i,j) -yplotLE(i,j)];
plotTE=[plotTE; xplotLE(i,j) -(yplotLE(i,j)+Chords(i,j))];
end
end
plotTE(1,:)=[];
plotLE(1,:)=[];
end
function [wakeplot]=findwake(airfoil, chords, spans, offsets, n, alt, v_mach, laminarflow, width)
[q v_fps dynvisc]=findconstants(alt, v_mach);
Chords = findChords(n, chords, spans);
wakeplot=zeros(100,1);
wakeplotX=zeros(100,1);
wakeplotY=zeros(100,1);
width=width/2;
% for i = 1:(size(chords)-1)
for i=1:1:(size(chords)-1)
for j = 1:n
% wakecoord(j,:)=linspace(0, Chords(i,j), n);
dist = (spans(i+1)-spans(i))./n;
y(j)=spans(i)+j*dist;
if i==1
xplotLE(i,j+1)=spans(1)+dist*(j);
else
xplotLE(i,1)=xplotLE(i-1,end);
xplotLE(i,j+1)=xplotLE(i-1,end)+dist*(j);
end
fitX(1)=spans(i);
fitX(2)=spans(i+1);
fitY(1)=offsets(i);
fitY(2)=offsets(i+1);
a = polyfit(fitX, fitY,1);
yplotLE(i,j) = a(1)*xplotLE(i,j)+a(2);
if spans(i)>width
lam=laminarflow;
else
lam=laminarflow-.15;
end
x=linspace(0, Chords(i,j));
for k = 1:length(x)
if (k <= 100*lam)
delta_x=( 5.2 * x(k) )*(v_fps*x(k)/dynvisc)^-0.5;
wake(k,j)= delta_x;
else %if turbulent
x_tr=x(100*lam);
Re_xtr = v_fps * x_tr / dynvisc;
delta_xtr=(5.2*x_tr)*(v_fps*x(k)/dynvisc)^-(0.5);
delta_l = ((delta_xtr*((v_fps)^0.2))/(0.37*((dynvisc)^0.2)))^(1/0.8);
lt = x(k) - x_tr + delta_l;
Re_lt = v_fps * lt / dynvisc;
delta = 0.37 * lt /(Re_lt)^0.2;
wake(k,j) = delta;
end
wakeX(k,j)=x(k)+yplotLE(i,j);
wakeY(k,j)=y(j);
end
for k = 1:100
wakeX(k,j)=x(k)+yplotLE(i,j);
wakeY(k,j)=y(j);
end
wakeplot=[wakeplot, wake];
wakeplotX=[wakeplotX, wakeX];
wakeplotY=[wakeplotY, wakeY];
end
end
wakeplot(:,1)=[ ];
wakeplotX(:,1)=[ ];
wakeplotY(:,1)=[ ];
wakeplot(1,:)=[0];
flipud(wakeplot);
end
function thickness=findthickness(airfoil, Chord, xLoc)
Airfoil = load(airfoil);
Airfoil = Airfoil*Chord;
% blah....goodnight
AirfoilX=Airfoil(:,1);
[min_diff, k]=min(abs(AirfoilX));
for j=1:k
AirfoilYupper(j)=Airfoil(j,2);
AirfoilXupper(j)=Airfoil(j,1);
end
for j=1:length(Airfoil)-k
AirfoilYlower(j)=Airfoil(length(Airfoil)-(j-1), 2);
AirfoilXlower(j)=Airfoil(length(Airfoil)-(j-1), 1);
end
AirfoilYupper=fliplr(AirfoilYupper);
AirfoilXupper=fliplr(AirfoilXupper);
AirfoilYlower=fliplr(AirfoilYlower);
AirfoilXlower=fliplr(AirfoilXlower);
AirfoilYlower=[0 AirfoilYlower];
AirfoilXlower=[0 AirfoilXlower];
[min_diff, k]=min(abs(AirfoilX));
[min_diff, kU]=min(abs(AirfoilXupper-xLoc));
[min_diff, kL]=min(abs(AirfoilXlower-xLoc));
if xLoc<AirfoilXupper(kU)
xFitU(1)=AirfoilXupper(kU-1);
xFitU(2)=AirfoilXupper(kU);
yFitU(1)=AirfoilYupper(kU-1);
yFitU(2)=AirfoilYupper(kU);
else
xFitU(1)=AirfoilXupper(kU);
xFitU(2)=AirfoilXupper(kU+1);
yFitU(1)=AirfoilYupper(kU);
yFitU(2)=AirfoilYupper(kU+1);
end
if xLoc<AirfoilXlower(kL)
xFitL(1)=AirfoilXlower(kL-1);
xFitL(2)=AirfoilXlower(kL);
yFitL(1)=AirfoilYlower(kL-1);
yFitL(2)=AirfoilYlower(kL);
else
xFitL(1)=AirfoilXlower(kL);
xFitL(2)=AirfoilXlower(kL+1);
yFitL(1)=AirfoilYlower(kL);
yFitL(2)=AirfoilYlower(kL+1);
end
aU = polyfit(xFitU, yFitU,1);
aL = polyfit(xFitL, yFitL,1);
% yplotLE(i,j) = a(1)*xplotLE(i,j)+a(2);
% thickness = AirfoilYupper(xLoc_indu)-AirfoilYlower(xLoc_indl);
thickness = (aU(1)*xLoc+aU(2))-(aL(1)*xLoc+aL(2));
end