Double Multiple Streamtube with straight 2-bladed VAWT
This is demonstration of the Double Multiple Streamtube model applied to straight-bladed vertical axis wind turbine (VAWT). The VAWT in this demo has two blades.
------------------------------------------------------------------------ See also Plot2D, LoadAirfoilFile, DMSModel ------------------------------------------------------------------------
Contents
%-------------------------------------------------------------------------- % Copyright (c) 2009, 2010 Princeton Satellite Systems, Inc. % All rights reserved. %--------------------------------------------------------------------------
Airfoil Characteristics
%------------------------ BldPrfFl = 'NACA0012P.af'; % A NACA0012 Blade Profile is assumed af = LoadAirfoilFile(BldPrfFl); af.alpha0 = 0; % Airfoil angle of attack for zero lift
Blade Characteristics
%----------------------- bld = struct; bld.c = 0.0254*8; % Blade chord (m) bld.H = (0.3048/2)*5; % Blade half-length (m) bld.Span = 2*bld.H; % Blade span (m) bld.thknss = 0.12*bld.c; % Blade thickness (m)
Rotor/System Characteristics
%----------------------------- rot = struct; rot.zR = 3; % Blade clearance (m) rot.R = bld.H/1; % Rotor radius (m) rot.N = 2; % Number of blades rot.omega = 135*pi/30; % Rotor speed (rad/s)
Wind Characteristics
%---------------------- wnd.Vinf = 12.5; % Free stream wind speed (m/s) wnd.alphaw = 0; % Wind shear component wnd.rho = 1.21; % Air density (kg/m^3) wnd.nu = 1.48e-5; % Kinematic viscosity (m^2/2)
Wind turbine Characteristics
%----------------------------- TSR = rot.omega*rot.R/wnd.Vinf; Ret = rot.R*rot.omega*bld.c/wnd.nu; % Turbine Reynolds number
Model Options
%-------------- DynStlModel = 'IGormont'; % 'StaticStall' or 'IGormont'
Control settings
%----------------- ControlAlgo = 'OffsetPC'; % 'SinePC' or 'OffsetPC'
Double multiple streamtube model
%--------------------------------- [u, upm] = DMSModel(af,bld,rot,wnd,DynStlModel,ControlAlgo); V = u*wnd.Vinf; Ve = (2*u-1)*wnd.Vinf; Vpm = upm*Ve; Vdpm = (2*u-1)*(2*upm-1)*wnd.Vinf; nAngStps = 100; % Number of angular steps per half rotation dTa = pi/nAngStps; % Angle increment dT = dTa/rot.omega; % Time step taUp = -pi/2:dTa:pi/2; ntaUp = length(taUp); taDn = pi/2:dTa:3*pi/2; Xu = rot.R*rot.omega/V; % Upwind tip-speed ratio Xd = rot.R*rot.omega/Vpm; % Downwind tip-speed ratio PwPrfP = zeros(2*ntaUp,1); % Power taP = zeros(2*ntaUp,1); % Theta FTP = zeros(2*ntaUp,1); % Tangential force alphaP = zeros(2*ntaUp,1); % Angle of attack alphadotP = zeros(2*ntaUp,1); % Angle of attack rate DAlpP = zeros(2*ntaUp,1); % Amount of pitch control CQP = zeros(2*ntaUp,1); % Torque coefficient CNP = zeros(2*ntaUp,1); % Normal force coefficient FNP = zeros(2*ntaUp,1); % Normal force NRF = zeros(2*ntaUp,1); % Net Radial Force for j = 1:ntaUp W = V*sqrt((Xu-sin(taUp(j)))^2 + (cos(taUp(j)))^2); Reb = (Ret/Xu)*(W/V); alpha1 = asin(V*cos(taUp(j))/W); alpha2 = feval(ControlAlgo,taUp(j)); alpha = alpha1+alpha2; if( j == ntaUp ) WTemp = Vpm*sqrt((Xd-sin(taDn(2)))^2 + (cos(taDn(2)))^2); alphaTemp1 = asin(Vpm*cos(taDn(2))/WTemp); alphaTemp2 = feval(ControlAlgo,taDn(2)); alphaTemp = alphaTemp1 + alphaTemp2; else WTemp = V*sqrt((Xu-sin(taUp(j+1)))^2 + (cos(taUp(j+1)))^2); alphaTemp1 = asin(V*cos(taUp(j+1))/WTemp); alphaTemp2 = feval(ControlAlgo,taUp(j+1)); alphaTemp = alphaTemp1 + alphaTemp2; end alphadot = (alphaTemp-alpha)/dT; alpha = mod(alpha,2*pi); [CL,CD,CM] = feval(DynStlModel,af,bld,Reb,alpha,alphadot,W); qF = 0.5*bld.c*wnd.rho*W^2*bld.Span; CL = CL*qF; CD = CD*qF; CM = CM*qF; CN = CL*cos(alpha) + CD*sin(alpha); CT = CL*sin(alpha) - CD*cos(alpha); FTP(j) = CT; CQP(j) = FTP(j)*rot.R/(2*wnd.rho*wnd.Vinf^2*rot.R*bld.Span*2*rot.R); FNP(j) = CN; CNP(j) = CN/qF; PwPrfP(j) = rot.omega*rot.R*CT; if( alpha > pi ) alphaP(j) = alpha-2*pi; else alphaP(j) = alpha; end DAlpP(j) = feval(ControlAlgo,taUp(j)); alphadotP(j) = alphadot; W = Vpm*sqrt((Xd-sin(taDn(j)))^2 + (cos(taDn(j)))^2); Reb = (Ret/Xd)*(W/Vpm); alpha1 = asin(Vpm*cos(taDn(j))/W); alpha2 = feval(ControlAlgo,taDn(j)); alpha = alpha1+alpha2; if( j==ntaUp ) WTemp = V*sqrt((Xu-sin(taUp(2)))^2 + (cos(taUp(2)))^2); alphaTemp1 = asin(V*cos(taUp(2))/WTemp); alphaTemp2 = feval(ControlAlgo,taUp(2)); alphaTemp = alphaTemp1 + alphaTemp2; else WTemp = Vpm*sqrt((Xd-sin(taDn(j+1)))^2 + (cos(taDn(j+1)))^2); alphaTemp1 = asin(Vpm*cos(taDn(j+1))/WTemp); alphaTemp2 = feval(ControlAlgo,taDn(j+1)); alphaTemp = alphaTemp1 + alphaTemp2; end alphadot = (alphaTemp-alpha)/dT; alpha = mod(alpha,2*pi); [CL,CD,CM] = feval(DynStlModel,af,bld,Reb,alpha,alphadot,W); qF = bld.c*(1/2)*wnd.rho*W^2*bld.Span; CL = CL*qF; CD = CD*qF; CM = CM*qF; CN = CL*cos(alpha) + CD*sin(alpha); CT = CL*sin(alpha) - CD*cos(alpha); FTP(j+ntaUp) = CT; CQP(j+ntaUp) = FTP(j+ntaUp)*rot.R/(2*wnd.rho*wnd.Vinf^2*rot.R*bld.Span*2*rot.R); FNP(j+ntaUp) = CN; CNP(j+ntaUp) = CN/qF; PwPrfP(j+ntaUp) = rot.omega*rot.R*CT; if( alpha > pi ) alphaP(j+ntaUp) = alpha-2*pi; else alphaP(j+ntaUp) = alpha; end alphadotP(j+ntaUp) = alphadot; DAlpP(j+ntaUp) = feval(ControlAlgo,taDn(j)); PwPrfP(j) = (PwPrfP(j) + PwPrfP(j+ntaUp))/1; PwPrfP(j+ntaUp) = PwPrfP(j); CQP(j) = (CQP(j) + CQP(j+ntaUp))/1; CQP(j+ntaUp) = CQP(j); taP(j) = -pi/2 + (j-1)*dTa; taP(j+ntaUp) = taP(j) + pi; NRF(j) = FNP(j) + FNP(j+ntaUp); NRF(j+ntaUp) = NRF(j); end
Results
fprintf(1,'\n') fprintf(1,'Dynamic Stall Model Used = %s\n', DynStlModel) fprintf(1,'Average Power = %5.3f kW\n', mean(PwPrfP)/1000) fprintf(1,'Max. Tangential Force = %5.2f N\n', max(FTP)) fprintf(1,'Min. Tangential Force = %5.2f N\n', min(FTP)) fprintf(1,'Max. Normal Force = %5.2f N\n', max(FNP)) fprintf(1,'Min. Normal Force = %5.2f N\n', min(FNP)) fprintf(1,'Tip Speed Ratio = %5.2f\n', TSR) fprintf(1,'Rotor speed = %5.2f rpm\n', rot.omega*30/pi) fprintf(1,'Rotor height = %3.2f ft, Rotor diameter = %3.2f ft, Chord length = %3.2f in\n',... bld.Span/(0.0254*12), 2*rot.R/(0.0254*12), bld.c/0.0254) fprintf(1,'\n') xL = 'Azimuthal angle, (deg)'; yL = 'Power (Watts)'; Plot2D(taP'*180/pi,PwPrfP',xL,yL,'Power versus { }\theta') grid on yL = {'Tangential Force F_T (N)', 'Normal Force F_N (N)'}; Title = 'Tangential and Normal forces versus { }\theta'; Plot2D(taP'*180/pi,[FTP';FNP'],xL,yL, Title) grid on yL = {'Angle of attack, \alpha (deg)', 'd\alpha/dt', '\Delta\alpha'}; Title = 'Angle of attack, its derivative, \Delta\alpha versus { }\theta'; Plot2D(taP'*180/pi,[alphaP'*180/pi;alphadotP';DAlpP'*180/pi],xL,yL, Title) grid on yL = 'Net Radial Force (N)'; Title = 'Net Radial Force (N) versus { }\theta'; Plot2D(taP'*180/pi,NRF',xL,yL, Title) grid on %-------------------------------------- % $Date$ % $Id: c09804aee35bf0b62fd792e0464f2aa3cb0fabde $
Dynamic Stall Model Used = IGormont Average Power = -0.020 kW Max. Tangential Force = 11.86 N Min. Tangential Force = -10.35 N Max. Normal Force = 80.98 N Min. Normal Force = -84.49 N Tip Speed Ratio = 0.86 Rotor speed = 135.00 rpm Rotor height = 5.00 ft, Rotor diameter = 5.00 ft, Chord length = 8.00 in