diff --git a/classes/misc/Wind.m b/classes/misc/Wind.m index 109e646c5deddd970be91fa46814081375be1fea..7fae578553a6ad526da4700dfd5832d65c8be826 100644 --- a/classes/misc/Wind.m +++ b/classes/misc/Wind.m @@ -11,17 +11,29 @@ classdef Wind < Config % file properties altitudes (1, :) - + end + + properties(Dependent) magnitudeDistribution (1, :) ... - {mustBeMember(magnitudeDistribution, {'u', 'g'})} = 'u' % [-] Magnitude distrubution: uniform, gaussian + {mustBeMember(magnitudeDistribution, {'u', 'g'})} % [-] Magnitude distrubution: uniform, gaussian azimuthDistribution (1, :) ... - {mustBeMember(azimuthDistribution, {'u', 'g'})} = 'u' % [-] Azimuth distrubution: uniform, gaussian + {mustBeMember(azimuthDistribution, {'u', 'g'})} % [-] Azimuth distrubution: uniform, gaussian elevationDistribution (1, :) ... - {mustBeMember(elevationDistribution, {'u', 'g'})} = 'u' % [-] Elevation distrubution: uniform, gaussian + {mustBeMember(elevationDistribution, {'u', 'g'})} % [-] Elevation distrubution: uniform, gaussian magnitudeParameters (2, :) % [m/s] Distribution parameters: [min; max], [mu; sigma] azimuthParameters (2, :) % [deg] Distribution parameters: [min; max], [mu; sigma] elevationParameters (2, :) % [deg] Distribution parameters: [min; max], [mu; sigma] end + + properties(Access = private) + MAGNITUDE_DISTRIBUTION = 'u' + AZIMUTH_DISTRIBUTION = 'u' + ELEVATION_DISTRIBUTION = 'u' + + MAGNITUDE_PARAMETERS + AZIMUTH_PARAMETERS + ELEVATION_PARAMETERS + end properties(SetAccess = private) azimuth @@ -34,6 +46,85 @@ classdef Wind < Config variableName = 'windCustom' end + + methods + function value = get.magnitudeDistribution(obj) + value = obj.MAGNITUDE_DISTRIBUTION; + end + + function value = get.azimuthDistribution(obj) + value = obj.AZIMUTH_DISTRIBUTION; + end + + function value = get.elevationDistribution(obj) + value = obj.ELEVATION_DISTRIBUTION; + end + + function value = get.magnitudeParameters(obj) + value = obj.MAGNITUDE_PARAMETERS; + end + + function value = get.azimuthParameters(obj) + value = obj.AZIMUTH_PARAMETERS; + end + + function value = get.elevationParameters(obj) + value = obj.ELEVATION_PARAMETERS; + end + + function obj = set.magnitudeDistribution(obj, value) + obj.MAGNITUDE_DISTRIBUTION = value; + if ~isempty(obj.MAGNITUDE_PARAMETERS) + obj = obj.updateElevation(); + obj.magnitude = obj.updateDistribution(value, ... + obj.MAGNITUDE_PARAMETERS); + end + end + + function obj = set.magnitudeParameters(obj, value) + obj.MAGNITUDE_PARAMETERS = value; + if ~isempty(obj.MAGNITUDE_DISTRIBUTION) + obj = obj.updateElevation(); + obj.magnitude = obj.updateDistribution(obj.MAGNITUDE_DISTRIBUTION, ... + value); + end + end + + function obj = set.azimuthDistribution(obj, value) + obj.AZIMUTH_DISTRIBUTION = value; + if ~isempty(obj.AZIMUTH_PARAMETERS) + obj = obj.updateElevation(); + obj.azimuth = obj.updateDistribution(value, ... + obj.AZIMUTH_PARAMETERS); + end + end + + function obj = set.azimuthParameters(obj, value) + obj.AZIMUTH_PARAMETERS = value; + if ~isempty(obj.AZIMUTH_DISTRIBUTION) + obj = obj.updateElevation(); + obj.azimuth = obj.updateDistribution(obj.AZIMUTH_DISTRIBUTION, ... + value); + end + end + + function obj = set.elevationDistribution(obj, value) + obj.ELEVATION_DISTRIBUTION = value; + if ~isempty(obj.ELEVATION_PARAMETERS) + obj.elevation = obj.updateDistribution(value, ... + obj.ELEVATION_PARAMETERS); + end + end + + function obj = set.elevationParameters(obj, value) + obj.ELEVATION_PARAMETERS = value; + if ~isempty(obj.ELEVATION_DISTRIBUTION) + obj.elevation = obj.updateDistribution(obj.ELEVATION_DISTRIBUTION, ... + value); + end + end + end + methods function obj = Wind(mission, varIn) arguments(Input) @@ -41,7 +132,7 @@ classdef Wind < Config varIn = [] end obj@Config(mission, varIn); - obj = obj.updateAll(); + %obj = obj.updateAll(); end function [uw, vw, ww] = getVels(obj, z) @@ -60,57 +151,80 @@ classdef Wind < Config end end - function obj = updateAll(obj) - obj = obj.checkElevation(); + % function obj = updateAll(obj) + % obj = obj.checkElevation(); + % + % s = length(obj.altitudes); + % magVector = nan(1,s); + % azVector = nan(1,s); + % elVector = nan(1,s); + % isUniformMag = strcmp(obj.magnitudeDistribution, "u"); + % isUniformAz = strcmp(obj.azimuthDistribution, "u"); + % isUniformEl = strcmp(obj.elevationDistribution, "u"); + % + % uniformDist = @(val1, val2) rand(1)*(val2 - val1) + val1; + % gaussianDist = @(mean, sigma) normrnd(mean, sigma, 1); + % + % for i = 1:s + % if isUniformMag(i) + % magVector(i) = uniformDist(obj.magnitudeParameters(1,i), ... + % obj.magnitudeParameters(2,i)); + % else + % magVector(i) = gaussianDist(obj.magnitudeParameters(1,i), ... + % obj.magnitudeParameters(2,i)); + % end + % + % if isUniformAz(i) + % azVector(i) = uniformDist(obj.azimuthParameters(1,i), ... + % obj.azimuthParameters(2,i)); + % else + % azVector(i) = gaussianDist(obj.azimuthParameters(1,i), ... + % obj.azimuthParameters(2,i)); + % end + % + % if isUniformEl(i) + % elVector(i) = uniformDist(obj.elevationParameters(1,i), ... + % obj.elevationParameters(2,i)); + % else + % elVector(i) = gaussianDist(obj.elevationParameters(1,i), ... + % obj.elevationParameters(2,i)); + % end + % end + % + % obj.magnitude = magVector; + % obj.azimuth = azVector; + % obj.elevation = elVector; + % end + end + methods(Access = private) + function vec = updateDistribution(obj, dist, parameters) s = length(obj.altitudes); - magVector = nan(1,s); - azVector = nan(1,s); - elVector = nan(1,s); - isUniformMag = strcmp(obj.magnitudeDistribution, "u"); - isUniformAz = strcmp(obj.azimuthDistribution, "u"); - isUniformEl = strcmp(obj.elevationDistribution, "u"); - + vec = nan(1,s); + isUniform = strcmp(dist, "u"); + uniformDist = @(val1, val2) rand(1)*(val2 - val1) + val1; gaussianDist = @(mean, sigma) normrnd(mean, sigma, 1); for i = 1:s - if isUniformMag(i) - magVector(i) = uniformDist(obj.magnitudeParameters(1,i), ... - obj.magnitudeParameters(2,i)); - else - magVector(i) = gaussianDist(obj.magnitudeParameters(1,i), ... - obj.magnitudeParameters(2,i)); - end - - if isUniformAz(i) - azVector(i) = uniformDist(obj.azimuthParameters(1,i), ... - obj.azimuthParameters(2,i)); - else - azVector(i) = gaussianDist(obj.azimuthParameters(1,i), ... - obj.azimuthParameters(2,i)); - end - - if isUniformEl(i) - elVector(i) = uniformDist(obj.elevationParameters(1,i), ... - obj.elevationParameters(2,i)); + if isUniform(i) + vec(i) = uniformDist(parameters(1,i), parameters(2,i)); else - elVector(i) = gaussianDist(obj.elevationParameters(1,i), ... - obj.elevationParameters(2,i)); + vec(i) = gaussianDist(parameters(1,i), parameters(2,i)); end end - - obj.magnitude = magVector; - obj.azimuth = azVector; - obj.elevation = elVector; end - function obj = checkElevation(obj) - if any(size(obj.elevationDistribution) ~= size(obj.azimuthDistribution)) - obj.elevationDistribution = repmat("u", size(obj.azimuthDistribution)); + function obj = updateElevation(obj) + if any(size(obj.ELEVATION_DISTRIBUTION) ~= size(obj.AZIMUTH_DISTRIBUTION)) + obj.ELEVATION_DISTRIBUTION = repmat("u", size(obj.AZIMUTH_DISTRIBUTION)); end - if isempty(obj.elevationParameters) - obj.elevationParameters = zeros(size(obj.azimuthParameters)); + + if isempty(obj.ELEVATION_PARAMETERS) && ~isempty(obj.AZIMUTH_PARAMETERS) + obj.ELEVATION_PARAMETERS = zeros(size(obj.AZIMUTH_PARAMETERS)); + + obj.elevation = obj.updateDistribution(obj.ELEVATION_DISTRIBUTION, ... + obj.ELEVATION_PARAMETERS); end end end