No BSD License  

Highlights from
Wing Designer

image thumbnail
from Wing Designer by John Rogers
Wing Designer computes aircraft performance measures from wing and engine parameters.

[gamma, Fu_bar, Fv_bar, Fw_bar]=VortexStrength(panel,phi)
function [gamma, Fu_bar, Fv_bar, Fw_bar]=VortexStrength(panel,phi)
% Implement Vortex Lattice Method
%Input: panel geometry
%Output vortex strength (gamma)
%Influence coefficients (Fx_bar)

ns = size(panel,1);
nc = size(panel,2);
%Preallocate memory for large variables where first dimension points to controls points; second dimension points to horseshoe vortices; 
%  third dimension points to three dimensional coordinates
r0 = zeros(ns*nc,2*ns*nc,3);
r1 = zeros(ns*nc,2*ns*nc,3);
r2 = zeros(ns*nc,2*ns*nc,3);
omega_bound = zeros(ns*nc,2*ns*nc,3);
omega_a_inf = zeros(ns*nc,2*ns*nc,3);
omega_b_inf = zeros(ns*nc,2*ns*nc,3);
Fu = zeros(ns*nc,2*ns*nc);
Fv = zeros(ns*nc,2*ns*nc);
Fw = zeros(ns*nc,2*ns*nc);

%Determine influence coefficients

%Iterate through all control points
for i = 1:ns
    for j = 1:nc
        n=(j-1)*ns+i;
        %Iterate through all bound vortices
        for k = 1:ns
            for p=1:nc
                m=(p-1)*ns+k;
                
                %Code derived from Bertin, Aerodynamics for Engineers, ed.
                %4, pg 263-266
                r0(n,m,:)=panel(k,p).BV2-panel(k,p).BV1;
                r1(n,m,:)=panel(i,j).CP-panel(k,p).BV1;
                r2(n,m,:)=panel(i,j).CP-panel(k,p).BV2;
                
                Fac1=shiftdim(cross(r1(n,m,:),r2(n,m,:)))/(norm(shiftdim(cross(r1(n,m,:),r2(n,m,:)))))^2;
                Fac2=dot(r0(n,m,:),(r1(n,m,:)/norm(shiftdim(r1(n,m,:)))))-dot(r0(n,m,:),(r2(n,m,:)/norm(shiftdim(r2(n,m,:)))));
        
                Fac1a(1,1)=0;
                Fac1a(1,2)=(panel(i,j).CP(3)-panel(k,p).BV1(3))/((panel(i,j).CP(3)-panel(k,p).BV1(3))^2+(panel(k,p).BV1(2)-panel(i,j).CP(2))^2);
                Fac1a(1,3)=(panel(k,p).BV1(2)-panel(i,j).CP(2))/((panel(i,j).CP(3)-panel(k,p).BV1(3))^2+(panel(k,p).BV1(2)-panel(i,j).CP(2))^2);
                Fac2a=-1+((panel(i,j).CP(1)-panel(k,p).BV1(1))/norm(shiftdim(r1(n,m,:))));  %'-1' due to change in axes
        
                Fac1b(1,1)=0;
                Fac1b(1,2)=-(panel(i,j).CP(3)-panel(k,p).BV2(3))/((panel(i,j).CP(3)-panel(k,p).BV2(3))^2+(panel(k,p).BV2(2)-panel(i,j).CP(2))^2);
                Fac1b(1,3)=-(panel(k,p).BV2(2)-panel(i,j).CP(2))/((panel(i,j).CP(3)-panel(k,p).BV2(3))^2+(panel(k,p).BV2(2)-panel(i,j).CP(2))^2);
                Fac2b=(-1+((panel(i,j).CP(1)-panel(k,p).BV2(1))/norm(shiftdim(r2(n,m,:)))));
        
                omega_bound(n,m,:)=Fac1*Fac2;
                omega_a_inf(n,m,:)=Fac1a*Fac2a;
                omega_b_inf(n,m,:)=Fac1b*Fac2b;
        
                Fu(n,m)=omega_bound(n,m,1)+omega_a_inf(n,m,1)+omega_b_inf(n,m,1);
                Fv(n,m)=omega_bound(n,m,2)+omega_a_inf(n,m,2)+omega_b_inf(n,m,2);
                Fw(n,m)=omega_bound(n,m,3)+omega_a_inf(n,m,3)+omega_b_inf(n,m,3);
%Performing identical operations on opposite wing
                r0(n,m+ns*nc,:)=[panel(k,p).BV1(1) -panel(k,p).BV1(2) panel(k,p).BV1(3)]'-[panel(k,p).BV2(1) -panel(k,p).BV2(2) panel(k,p).BV2(3)]';
                r1(n,m+ns*nc,:)=panel(i,j).CP-[panel(k,p).BV2(1) -panel(k,p).BV2(2) panel(k,p).BV2(3)]';
                r2(n,m+ns*nc,:)=panel(i,j).CP-[panel(k,p).BV1(1) -panel(k,p).BV1(2) panel(k,p).BV1(3)]';
                
                Fac1=shiftdim(cross(r1(n,m+ns*nc,:),r2(n,m+ns*nc,:)))/(norm(shiftdim(cross(r1(n,m+ns*nc,:),r2(n,m+ns*nc,:)))))^2;
                Fac2=dot(r0(n,m+ns*nc,:),(r1(n,m+ns*nc,:)/norm(shiftdim(r1(n,m+ns*nc,:)))))-dot(r0(n,m+ns*nc,:),(r2(n,m+ns*nc,:)/norm(shiftdim(r2(n,m+ns*nc,:)))));
        
                Fac1a(1,1)=0;
                Fac1a(1,2)=(panel(i,j).CP(3)-panel(k,p).BV2(3))/((panel(i,j).CP(3)-panel(k,p).BV2(3))^2+(-panel(k,p).BV(2)-panel(i,j).CP(2))^2);
                Fac1a(1,3)=(-panel(k,p).BV2(2)-panel(i,j).CP(2))/((panel(i,j).CP(3)-panel(k,p).BV2(3))^2+(-panel(k,p).BV2(2)-panel(i,j).CP(2))^2);
                Fac2a=-1+((panel(i,j).CP(1)-panel(k,p).BV2(1))/norm(shiftdim(r1(n,m+ns*nc,:))));
        
                Fac1b(1,1)=0;
                Fac1b(1,2)=-(panel(i,j).CP(3)-panel(k,p).BV1(3))/((panel(i,j).CP(3)-panel(k,p).BV1(3))^2+(-panel(k,p).BV1(2)-panel(i,j).CP(2))^2);
                Fac1b(1,3)=-(-panel(k,p).BV1(2)-panel(i,j).CP(2))/((panel(i,j).CP(3)-panel(k,p).BV1(3))^2+(-panel(k,p).BV1(2)-panel(i,j).CP(2))^2);
                Fac2b=(-1+((panel(i,j).CP(1)-panel(k,p).BV1(1))/norm(shiftdim(r2(n,m+ns*nc,:)))));
        
                omega_bound(n,m+ns*nc,:)=Fac1*Fac2;
                omega_a_inf(n,m+ns*nc,:)=Fac1a*Fac2a;
                omega_b_inf(n,m+ns*nc,:)=Fac1b*Fac2b;
        
                Fu(n,m+ns*nc)=omega_bound(n,m+ns*nc,1)+omega_a_inf(n,m+ns*nc,1)+omega_b_inf(n,m+ns*nc,1);
                Fv(n,m+ns*nc)=omega_bound(n,m+ns*nc,2)+omega_a_inf(n,m+ns*nc,2)+omega_b_inf(n,m+ns*nc,2);
                Fw(n,m+ns*nc)=omega_bound(n,m+ns*nc,3)+omega_a_inf(n,m+ns*nc,3)+omega_b_inf(n,m+ns*nc,3);
                
                %Code derived from NASA TN D-6142 (Vortex Lattice Fortran
                %program for estimating subsonic aerodynamic
                %characteristics of complex planforms
%                 x=-panel(i,j).CPprime+panel(k,p).BVprime;
%                 y=-panel(i,j).CP(2)+panel(k,p).BV(2);
%                 z=-panel(i,j).CP(3)+panel(k,p).BV(3);
%                 s=panel(i,j).s;
%                 psi=panel(i,j).sweepprime;
%                 Fw(n,m)=((y*tan(psi)-x)*cos(phi))...
%                     /(x^2+(y*sin(phi))^2+cos(phi)^2*(y^2*tan(psi)^2+z^2*sec(psi)^2-2*y*x*tan(psi))-2*z*cos(phi)*sin(phi)*(y+x*tan(psi)))...
%                     *(((x+s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y+s*cos(phi))*cos(phi)+(z+s*sin(phi))*sin(phi))...
%                     /sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2)...
%                     -((x-s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y-s*cos(phi))*cos(phi)+(z-s*sin(phi))*sin(phi))...
%                     /sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     -(y-s*cos(phi))/((y-s*cos(phi))^2+(z-s*sin(phi))^2)...
%                     *(1-(x-s*cos(phi)*tan(psi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     +(y+s*cos(phi))/((y+s*cos(phi))^2+(z+s*sin(phi))^2)...
%                     *(1-(x+s*cos(phi)*tan(psi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2));
%                 Fv(n,m)=(x*sin(phi)-z*cos(phi)*tan(psi))/(x^2+(y*sin(phi))^2+cos(phi)^2*(y^2*tan(psi)^2+z^2*sec(psi)^2-2*y*x*tan(psi))-2*z*cos(phi)*sin(phi)*(y+x*tan(psi))...
%                     *(((x+s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y+s*cos(phi))*cos(phi)+(z+s*sin(phi))*sin(phi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2))...
%                     -((x-s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y-s*cos(phi))*cos(phi)+(z-s*sin(phi))*sin(phi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     -(z-s*cos(phi))/((y-s*cos(phi))^2+(z-s*sin(phi))^2)*(1-(x-s*cos(phi)*tan(psi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     +(z+s*cos(phi))/((y+s*cos(phi))^2+(z+s*sin(phi))^2)*(1-(x+s*cos(phi)*tan(psi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2));
%                 Fu(n,m)=(z*cos(phi)-y*sin(phi))/(x^2+(y*sin(phi))^2+cos(phi)^2*(y^2*tan(psi)^2+z^2*sec(psi)^2-2*y*x*tan(psi))-2*z*cos(phi)*sin(phi)*(y+x*tan(psi))...
%                     *(((x+s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y+s*cos(phi))*cos(phi)+(z+s*sin(phi))*sin(phi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2))...
%                     -((x-s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y-s*cos(phi))*cos(phi)+(z-s*sin(phi))*sin(phi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2));
% 
%                 %Determining influence coefficients from symmetric wing and
%                 %adding that to the original wing to "fold" influence
%                 %matrices and create F_bar
%                 y=y+2*panel(k,p).BV(2);
%                 Fw(n,m+ns*nc)=((y*tan(psi)-x)*cos(phi))/(x^2+(y*sin(phi))^2+cos(phi)^2*(y^2*tan(psi)^2+z^2*sec(psi)^2-2*y*x*tan(psi))-2*z*cos(phi)*sin(phi)*(y+x*tan(psi)))...
%                     *(((x+s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y+s*cos(phi))*cos(phi)+(z+s*sin(phi))*sin(phi))...
%                     /sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2)...
%                     -((x-s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y-s*cos(phi))*cos(phi)+(z-s*sin(phi))*sin(phi))...
%                     /sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     -(y-s*cos(phi))/((y-s*cos(phi))^2+(z-s*sin(phi))^2)...
%                     *(1-(x-s*cos(phi)*tan(psi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     +(y+s*cos(phi))/((y+s*cos(phi))^2+(z+s*sin(phi))^2)...
%                     *(1-(x+s*cos(phi)*tan(psi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2));
%                 Fv(n,m+ns*nc)=(x*sin(phi)-z*cos(phi)*tan(psi))/(x^2+(y*sin(phi))^2+cos(phi)^2*(y^2*tan(psi)^2+z^2*sec(psi)^2-2*y*x*tan(psi))-2*z*cos(psi)*sin(psi)*(y+x*tan(psi))...
%                     *(((x+s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y+s*cos(phi))*cos(phi)+(z+s*sin(phi))*sin(phi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2))...
%                     -((x-s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y-s*cos(phi))*cos(phi)+(z-s*sin(phi))*sin(phi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     -(z-s*cos(phi))/((y-s*cos(phi))^2+(z-s*sin(phi))^2)*(1-(x-s*cos(phi)*tan(psi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2))...
%                     +(z+s*cos(phi))/((y+s*cos(phi))^2+(z+s*sin(phi))^2)*(1-(x+s*cos(phi)*tan(psi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2));
%                 Fu(n,m+ns*nc)=(z*cos(phi)-y*sin(phi))/(x^2+(y*sin(phi))^2+cos(phi)^2*(y^2*tan(psi)^2+z^2*sec(psi)^2-2*y*x*tan(psi))-2*z*cos(psi)*sin(psi)*(y+x*tan(psi))...
%                     *(((x+s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y+s*cos(phi))*cos(phi)+(z+s*sin(phi))*sin(phi))/sqrt((x+s*cos(phi)*tan(psi))^2+(y+s*cos(phi))^2+(z+s*sin(phi))^2))...
%                     -((x-s*cos(phi)*tan(psi))*cos(phi)*tan(psi)+(y-s*cos(phi))*cos(phi)+(z-s*sin(phi))*sin(phi))/sqrt((x-s*cos(phi)*tan(psi))^2+(y-s*cos(phi))^2+(z-s*sin(phi))^2));
            end
        end
    end
end
% [panel.CP]
% [panel.BV1]
% [panel.BV2]
% r0
% r1
% r2
% omega_bound
% omega_a_inf
% omega_b_inf
% Fv
% Fw
Fu_bar=Fu(:,1:ns*nc)+Fu(:,ns*nc+1:2*ns*nc);
Fv_bar=Fv(:,1:ns*nc)+Fv(:,ns*nc+1:2*ns*nc);
Fw_bar=Fw(:,1:ns*nc)+Fw(:,ns*nc+1:2*ns*nc);
%Determine vortex strength using boundary conditions considering just twist and camber
c=inv(Fw_bar-Fv_bar*tan(phi))*4*pi*sin([panel.twist]'-[panel.dzdx]');  %Eqn 16 in NASA paper and removing small angle assumption on alpha

%Determine vortex strength using boundary conditions where alpha = 1 rad
alpha=4*pi*inv(Fw_bar-Fv_bar*tan(phi))*sin(ones(ns*nc,1));  %Eqn 16 in NASA paper and removing small angle assumption on alpha

for i = 1:ns
    for j = 1:nc
        k=(j-1)*ns+i;
        gamma(i,j).c=c(k);
        gamma(i,j).alpha=alpha(k);
    end
end

Contact us at files@mathworks.com