Contents
classdef JensenWakeModel < handle
properties
c
end
properties (SetAccess = protected)
A
k
end
methods
function O = JensenWakeModel()
O.setConfig(JensenWakeModelConfig());
end
function O = setConfig(O, config)
O.c = config;
O.k = O.getKFromTI(O.c.TI);
end
function k = getKFromTI(O, TI)
TIs = [.08 .10 .13 .15 .16 .18 .21 .24 .29];
ks = [.040 .052 .063 .075 .083 .920 .100 .108 .117];
k = interp1(TIs, ks, TI);
end
function O = calculateFlowField(O, M)
for ii = 1:M.layout.N
A(:,:,ii) = O.calculateSingleWake( ...
M, ...
M.layout.z(ii) , ...
M.layout.y(ii), ...
1/3 ...
);
end
O.A = O.mixWakes(A);
end
function A = calculateSingleWake(O, M, z0, y0, a)
Fetch Information
k = O.k;
R = M.turbineType.R;
Y = M.mesh.Y;
Z = M.mesh.Z;
nY = M.mesh.nY;
Determine Domain
theta = atan2((Y-y0),(Z-z0));
distTotal = sqrt((Z - z0).^2 + (Y-y0).^2);
distCentral = distTotal .* sin(theta - M.c.alpha);
distCalc = distTotal .* cos(theta - M.c.alpha);
r = R + k * distCalc;
mask = abs(distCentral) < r & distCalc > 0;
Calculate Wake
K = mask .* R ./ r;
A = 1 - (1-(1-2*a)) .* K.^2;
end
function A = mixWakes(O, As)
Multiply
sizes = size(As);
A = ones(sizes(1), sizes(2));
for ii = 1:sizes(3)
A = A .* As(:,:,ii);
end
Maximum Wake
if(sizes(3) > 1)
for ii = 1:sizes(3)
A = min(A, As(:,:,ii));
end
else
A = As(:,:,1);
end
end
function h = plotFlowField(O, M)
h = surf(M.mesh.Z/M.turbineType.D,M.mesh.Y/M.turbineType.D, O.A);
shading interp;
xlabel('z [#D]');
ylabel('y [#D]');
zlabel('u [m/s]');
view(0,90);
axis tight equal;
colorbar;
set(gca, 'CLim', [0, 1]);
zlim([0 1]);
end
function A = getFlowField(O)
A = O.A;
end
end
end