diff --git a/aerodynamicsOptimization/mainOptimization.m b/aerodynamicsOptimization/mainOptimization.m index ad493fb45b2c5176bdb19f43a263f2ca61bd277a..ecb35c11e10c237529f3f03fd07d3ad6e033f9e3 100644 --- a/aerodynamicsOptimization/mainOptimization.m +++ b/aerodynamicsOptimization/mainOptimization.m @@ -1,7 +1,7 @@ function mainOptimization(rocket, wind, environment, settings, options) arguments rocket Rocket = Rocket.empty - wind WindCustom = WindCustom.empty + wind Wind = Wind.empty environment Environment = Environment.empty settings Settings = Settings.empty @@ -53,7 +53,7 @@ if ~contains(path, dissilePath), addpath(genpath(dissilePath)); end mission = Mission(true); if isempty(rocket), rocket = Rocket(mission); end if isempty(environment), environment = Environment(mission, rocket.motor); end -if isempty(wind), wind = WindCustom(mission); end +if isempty(wind), wind = Wind(mission); end if isempty(settings), settings = Settings('ode', 'optimization'); end Settings.read(settings, options, 'optimization'); @@ -141,7 +141,7 @@ vars.mach = 0.1:0.2:0.9; vars.alpha = [-20 -15 -10 -5 -2.5 -1 -0.1 0 0.1 1 2.5 5 10 15 20]; vars.beta = [-20 -15 -10 -5 -2.5 -1 -0.1 0 0.1 1 2.5 5 10 15 20]; vars.alt = environment.z0 + (0:1000:4000); -vars.xcg = rocket.xCg; +vars.xcg = rocket.xcg; vars.hprot = []; % vars.hprot = rocket.airbrakes.height; diff --git a/aerodynamicsOptimization/src/OptimizationGA.m b/aerodynamicsOptimization/src/OptimizationGA.m index 69a43fd8b6f69ae33892ad4ed7974d9cc32381ff..9e7a828e9a1d65d36e9576e06762c86649c49cdf 100644 --- a/aerodynamicsOptimization/src/OptimizationGA.m +++ b/aerodynamicsOptimization/src/OptimizationGA.m @@ -4,7 +4,7 @@ arguments input struct rocket Rocket environment Environment - wind WindCustom + wind Wind settings Settings wrapper DataWrapper end @@ -49,7 +49,7 @@ input.fltcon.NALPHA = length(input.fltcon.ALPHA); % [-] Number of alphas input.fltcon.NMACH = length(input.fltcon.MACH); %%% aerodynmics coefficient - full -input.refq.XCG = rocket.xCg([1, length(rocket.xCg)]); +input.refq.XCG = rocket.xcg([1, length(rocket.xcg)]); % state.xcgTime = state.xcgTime([1, end]); input.flagXCP = false; [coeff] = dissileMatcom(input); @@ -67,7 +67,6 @@ azCase = (360)*pi/180; wind.magnitudeParameters = ones(2,2).*magCase; wind.azimuthParameters = ones(2,2).*azCase; -wind.updateAll(); apogee1 = quickApogeeOnly(rocket, environment, wind, settings, wrapper); @@ -76,7 +75,6 @@ azCase = (180)*pi/180; wind.magnitudeParameters = ones(2,2).*magCase; wind.azimuthParameters = ones(2,2).*azCase; -wind.updateAll(); apogee2 = quickApogeeOnly(rocket, environment, wind, settings, wrapper); @@ -86,7 +84,6 @@ azCase = (360)*pi/180; wind.magnitudeParameters = ones(2,2).*magCase; wind.azimuthParameters = ones(2,2).*azCase; -wind.updateAll(); apogee3 = quickApogeeOnly(rocket, environment, wind, settings, wrapper); @@ -95,7 +92,6 @@ azCase = (180)*pi/180; wind.magnitudeParameters = ones(2,2).*magCase; wind.azimuthParameters = ones(2,2).*azCase; -wind.updateAll(); apogee4 = quickApogeeOnly(rocket, environment, wind, settings, wrapper); diff --git a/aerodynamicsOptimization/src/XCPcheck.m b/aerodynamicsOptimization/src/XCPcheck.m index a07bb62d0928025bab0a7db7778fb016cb9eaca7..da16982b84ce406067fb6657bbfe1809982cd197 100644 --- a/aerodynamicsOptimization/src/XCPcheck.m +++ b/aerodynamicsOptimization/src/XCPcheck.m @@ -106,7 +106,7 @@ nCases = length(launchpad.indexAlpha); %%% both lateral and longitudinal XCP involved % the launchpad dynamics is used to write the aerodynamics states -xcg = rocket.xCg; +xcg = rocket.xcg; %%% aerodynamics coefficient @launchpad exit only diff --git a/apogeeAnalysis/mainApogeeAnalysis.m b/apogeeAnalysis/mainApogeeAnalysis.m index 8cd0d05214ab6c6b10d1064c34b9a6fed5bdba54..8fba160540d416378816865940e8c33984cdfbda 100644 --- a/apogeeAnalysis/mainApogeeAnalysis.m +++ b/apogeeAnalysis/mainApogeeAnalysis.m @@ -46,20 +46,18 @@ end %% PREPARE DATA FOR SIMULATION % Winds -winds = [WindCustom(); WindCustom()]; +winds = [Wind(); Wind()]; winds(1).altitudes = settings.cases(1).wind.altitudes; winds(1).magnitudeDistribution = "u"; winds(1).azimuthDistribution = "u"; winds(1).magnitudeParameters = settings.cases(1).wind.magVec * ones(2, 1); winds(1).azimuthParameters = settings.cases(1).wind.azVec * ones(2, 1); -winds(1).updateAll; winds(2).altitudes = settings.cases(2).wind.altitudes; winds(2).magnitudeDistribution = "u"; winds(2).azimuthDistribution = "u"; winds(2).magnitudeParameters = settings.cases(2).wind.magVec * ones(2, 1); winds(2).azimuthParameters = settings.cases(2).wind.azVec * ones(2, 1); -winds(2).updateAll; % Environments environments = [Environment(mission, rocket.motor); Environment(mission, rocket.motor)]; @@ -70,7 +68,7 @@ environments(2).omega = settings.cases(2).omega; environments(2).phi = settings.cases(2).phi; % Airbrakes -airbrakes = [Airbrakes(mission, rocket.motor); Airbrakes(mission, rocket.motor)]; +airbrakes = [Airbrakes(mission); Airbrakes(mission)]; airbrakes(1).enabled = settings.cases(1).airbrakes.enabled; airbrakes(1).extension = settings.cases(1).airbrakes.extension; airbrakes(1).deltaTime = settings.cases(1).airbrakes.deltaTime; @@ -80,7 +78,7 @@ airbrakes(2).extension = settings.cases(2).airbrakes.extension; airbrakes(2).deltaTime = settings.cases(2).airbrakes.deltaTime; %% MOTORS SELECTION -if settings.analysis.isEngineCut && ~(rocket.motor.isHRE) +if settings.analysis.isEngineCut && rocket.motor.type ~= MotorType.Hybrid msg="The Engine Cut Analysis can be used for HRE motors only"; error(msg) end @@ -105,8 +103,8 @@ if isempty(settings.selection.motorName) for i=1:size(motors, 1) if (motors(i).Itot > settings.selection.totalImpulseRange(1) && motors(i).Itot < settings.selection.totalImpulseRange(2) ... && any(strcmp(motors(i).producer, settings.selection.producer)) ... - && ( (rocket.motor.isHRE == false) || (motors(i).ODfus == rocket.diameter) ) ... - && ( (rocket.motor.isHRE == false) || ((settings.selection.transient == 2) || ... + && ( (rocket.motor.type ~= MotorType.Hybrid) || (motors(i).ODfus == rocket.diameter) ) ... + && ( (rocket.motor.type ~= MotorType.Hybrid) || ((settings.selection.transient == 2) || ... (settings.selection.transient == motors(i).transientFlag)))) selectedMotors(j) = motors(i); j = j + 1; diff --git a/apogeeAnalysis/src/engineCutApogee.m b/apogeeAnalysis/src/engineCutApogee.m index cbb5dc74c9857aeb00a0754b4778363f8da62f4b..41c240004abe5b91026f7174ba775a0d3966f9ed 100644 --- a/apogeeAnalysis/src/engineCutApogee.m +++ b/apogeeAnalysis/src/engineCutApogee.m @@ -5,7 +5,7 @@ arguments mission Mission selectedMotors (:, 1) struct environments (2, 1) Environment - winds (2, 1) WindCustom + winds (2, 1) Wind airbrakes (2, 1) Airbrakes end % @@ -63,7 +63,6 @@ for i = 1:2 % highest and lowest apogee cases for l = 1:nCutOffTime rocket.motor.cutoffTime = timeEngineCutVect(l); - rocket.updateAll; rocket.coefficients.state.xcgTime = linspace(0, rocket.motor.cutoffTime, ... length(rocket.coefficients.state.xcgTime)); % Apogee diff --git a/apogeeAnalysis/src/plotApogeeAnalysis.m b/apogeeAnalysis/src/plotApogeeAnalysis.m index f0bf990acddc297e981c58451245bc446a183bad..be61a38653337b1dfcdb6ae54867f8432d9e1669 100644 --- a/apogeeAnalysis/src/plotApogeeAnalysis.m +++ b/apogeeAnalysis/src/plotApogeeAnalysis.m @@ -120,12 +120,12 @@ for i = 1:2 % green rectangle below the target line if delta(1) > 0 rectangle('Position', [xGridMin minApo (xGridMax-xGridMin) delta(1)], ... - 'FaceColor', [0 1 0 0.1], 'Linestyle', 'none'); + 'FaceColor', [0 1 0 0.1], 'Linestyle', 'none', 'FaceAlpha', 0.3); end else % green rectangle over the target line rectangle('Position', [xGridMin settings.plots.targetApogee (xGridMax-xGridMin) delta(2)], ... - 'FaceColor', [0 1 0 0.1], 'Linestyle', 'none'); + 'FaceColor', [0 1 0 0.1], 'Linestyle', 'none', 'FaceAlpha', 0.3); end plotApogee.XLim = [xGridMin-margin, xGridMax+margin]; diff --git a/apogeeAnalysis/src/standardApogee.m b/apogeeAnalysis/src/standardApogee.m index fb089e62681fe8e232c13e101691a61b64dc033b..efd81950458311a7127d7267796682437cd3cf34 100644 --- a/apogeeAnalysis/src/standardApogee.m +++ b/apogeeAnalysis/src/standardApogee.m @@ -5,7 +5,7 @@ arguments mission Mission selectedMotors (:, 1) struct environments (2, 1) Environment - winds (2, 1) WindCustom + winds (2, 1) Wind airbrakes (2, 1) Airbrakes end % @@ -48,8 +48,8 @@ for i = 1:2 % highest and lowest apogee cases for k = 1:nMotors tempMotor.name = selectedMotors(k).MotorName; + rocket.mass = []; % Disables any ovverrides rocket.motor = tempMotor; - rocket.updateAll; rocket.coefficients.state.xcgTime = linspace(0, tempMotor.cutoffTime, ... length(rocket.coefficients.state.xcgTime)); rocket.motor.thrust = rocket.motor.thrust * ... diff --git a/autoMatricesProtub/mainAutoMatProtub.m b/autoMatricesProtub/mainAutoMatProtub.m index ad85f77314cd2613799be1050520bcfbee2865a7..5dcd6e0dbefdf3ef3a38dc9fae84e8d6fdc714af 100644 --- a/autoMatricesProtub/mainAutoMatProtub.m +++ b/autoMatricesProtub/mainAutoMatProtub.m @@ -29,15 +29,14 @@ autoMatSettings.vars.hprot = rocket.airbrakes.height; autoMatSettings.varsHighAOA.hprot = []; % overriding xcg number if the motor is solid -if ~rocket.motor.isHRE && autoMatSettings.vars.Nxcg ~= 2 +if rocket.motor.type == MotorType.Solid && autoMatSettings.vars.Nxcg ~= 2 warning('Overwriting xCg to 2 for solid rocket motors.') autoMatSettings.vars.Nxcg = 2; end %% CHOICE OF NUMBER OF XCG timeXcgTotal = rocket.motor.time; -xcgTotal = rocket.xCg; -nXcg = autoMatSettings.vars.Nxcg; +xcgTotal = rocket.xcg; if nXcg == 1 chosenXcg = xcgTotal(1); @@ -76,7 +75,7 @@ end tic %% COMPUTE HIGH AOA AERODYNAMIC COEFFICIENTS -autoMatSettings.varsHighAOA.xcg = rocket.xCg(end); +autoMatSettings.varsHighAOA.xcg = rocket.xcg(end); if length(autoMatSettings.varsHighAOA.alpha) > 20 || ... length(autoMatSettings.varsHighAOA.mach) > 20 error("automatrices with Dissile and alpha/mach" + ... diff --git a/caAnalysis/mainCaAnalysis.m b/caAnalysis/mainCaAnalysis.m index 7b6421cf2ade32d0b0ce096edc11ef3863ece2b1..cabaf9845796c321e99c69f6f1499f5215444894 100644 --- a/caAnalysis/mainCaAnalysis.m +++ b/caAnalysis/mainCaAnalysis.m @@ -1,7 +1,7 @@ function [dHdCA] = mainCaAnalysis(rocket, wind, environment, cfdData) arguments rocket = [] % Rocket = Rocket.empty - wind = [] % WindCustom = WindCustom.empty + wind = [] % Wind = Wind.empty environment = [] % Environment = Environment.empty cfdData (2, :) double = [] end @@ -22,7 +22,7 @@ if isDissileMissing, addpath(genpath(dissilePath)); end mission = Mission(true); if isempty(rocket), rocket = Rocket(mission); end if isempty(environment), environment = Environment(mission, rocket.motor); end -if isempty(wind), wind = WindCustom(mission); end +if isempty(wind), wind = Wind(mission); end settings = Settings('ode'); settings.addprop('simulator'); diff --git a/caAnalysis/src/initCaAnalysis.m b/caAnalysis/src/initCaAnalysis.m index 33a3e6cb2205f40807ea02db3114ad6761a7411d..b61d5bf9f678fc3a73579489f595325969f2edf0 100644 --- a/caAnalysis/src/initCaAnalysis.m +++ b/caAnalysis/src/initCaAnalysis.m @@ -1,7 +1,7 @@ function [defaultCa, modCa] = initCaAnalysis(rocket, wind, settings, cfd) arguments rocket Rocket - wind WindCustom + wind Wind settings Settings cfd (2, :) double = [] end @@ -52,5 +52,4 @@ wind.magnitudeParameters = [0; 0]; wind.azimuthDistribution = 'u'; wind.azimuthParameters = [0; 0]; -wind.updateAll(); end \ No newline at end of file diff --git a/common b/common index 7589b2690bf66066247dd1236f27eb2ee7c52cbd..bc61b5b9265bde0f30dfc53db0bf5820e3c69b04 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 7589b2690bf66066247dd1236f27eb2ee7c52cbd +Subproject commit bc61b5b9265bde0f30dfc53db0bf5820e3c69b04 diff --git a/sensitivityAnalysis/mainSensitivity.m b/sensitivityAnalysis/mainSensitivity.m index eee5d0ba90afb7ba8d1f657be75940fdb55affe0..56ac7b8a3304468c95c98759afba48d32ca87a90 100644 --- a/sensitivityAnalysis/mainSensitivity.m +++ b/sensitivityAnalysis/mainSensitivity.m @@ -2,7 +2,7 @@ function [postProcess, parameters] = ... mainSensitivity(rocket, wind, environment, settings, plots) arguments rocket = [] % Rocket = Rocket.empty - wind = [] % WindCustom = WindCustom.empty + wind = [] % Wind = Wind.empty environment = [] % Environment = Environment.empty settings = [] % Settings = Settings.empty @@ -47,7 +47,7 @@ if isDissileMissing, addpath(genpath(dissilePath)); end mission = Mission(true); if isempty(rocket), rocket = Rocket(mission); end if isempty(environment), environment = Environment(mission, rocket.motor); end -if isempty(wind), wind = WindCustom(mission); end +if isempty(wind), wind = Wind(mission); end if isempty(settings), settings = Settings('ode', 'sensitivity'); end Settings.read(settings, plots, 'sensitivity', 'plots'); diff --git a/sensitivityAnalysis/sensitivityConfig.m b/sensitivityAnalysis/sensitivityConfig.m index a7d713ff31213c3bc239acd9d1ff83e7010cc772..7653b39f4939cadaad4678a8d377226a639ab065 100644 --- a/sensitivityAnalysis/sensitivityConfig.m +++ b/sensitivityAnalysis/sensitivityConfig.m @@ -13,7 +13,7 @@ % SPDX-License-Identifier: GPL-3.0-or-later %% SIMULATION PARAMETERS -sensitivity.n = 2000; % Number of cases +sensitivity.n = 100; % Number of cases sensitivity.type = 4; % Simulation type: % 1-apogee only diff --git a/sensitivityAnalysis/src/sensitivityStochRun.m b/sensitivityAnalysis/src/sensitivityStochRun.m index e4ecac839e8658fa481493db9ccc689b9269daea..b8921df049fc11386ebaa28c61c26c3757974998 100644 --- a/sensitivityAnalysis/src/sensitivityStochRun.m +++ b/sensitivityAnalysis/src/sensitivityStochRun.m @@ -1,9 +1,9 @@ function [ascent, descentPara, descentBall, stability] = ... - sensitivityStochRun(rocketRef, envRef, wind, parameters, settings, wrapper) + sensitivityStochRun(rocketRef, envRef, windRef, parameters, settings, wrapper) arguments rocketRef Rocket envRef Environment - wind WindCustom {mustBeA(wind, {'WindCustom', 'WindMatlab'})} + windRef Wind {mustBeA(windRef, {'Wind', 'WindMatlab'})} parameters struct settings Settings wrapper DataWrapper @@ -97,17 +97,18 @@ if ballFlag end if stabFlag - stability = stdStability(rocketRef, envRef, wind, settings, wrapper); + stability = stdStability(rocketRef, envRef, windRef, settings, wrapper); wrapper.reset(); stability(1, n) = stability; end parfor i = 1:n ascentSol = []; - rocket = copy(rocketRef); - env = copy(envRef); + rocket = rocketRef; + env = envRef; + wind = windRef; uncertanty = struct(); - updateData(rocket, env, wind, parameters, i); + [rocket, env, wind] = updateData(rocket, env, wind, parameters, i); if ascentFlag [ascentSol, ascent(i)] = stdAscent(rocket, env, wind, settings, wrapper); diff --git a/sensitivityAnalysis/src/stochParameters/initParameter.m b/sensitivityAnalysis/src/stochParameters/initParameter.m index 1d9db0add415adba11358e2d106ba17337477bc3..621446fb3e12731b73adb9389d498ff5e31e0441 100644 --- a/sensitivityAnalysis/src/stochParameters/initParameter.m +++ b/sensitivityAnalysis/src/stochParameters/initParameter.m @@ -55,28 +55,28 @@ for i = 1:length(parameters) parameters(i).value = rocket.inertia(3, :); parameters(i).udm = 'kg*m^4'; case 'drogueSurface' - parameters(i).value = rocket.parachutes(1, 1).surface; + parameters(i).value = rocket.parachutes{1, 1}.surface; parameters(i).udm = 'm2'; case 'drogueMass' - parameters(i).value = rocket.parachutes(1, 1).mass; + parameters(i).value = rocket.parachutes{1, 1}.mass; parameters(i).udm = 'kg'; case 'drogueCl' - parameters(i).value = rocket.parachutes(1, 1).cl; + parameters(i).value = rocket.parachutes{1, 1}.cl; parameters(i).udm = '-'; case 'drogueCd' - parameters(i).value = rocket.parachutes(1, 1).cd; + parameters(i).value = rocket.parachutes{1, 1}.cd; parameters(i).udm = '-'; case 'mainSurface' - parameters(i).value = rocket.parachutes(2, 1).surface; + parameters(i).value = rocket.parachutes{2, 1}.surface; parameters(i).udm = 'm2'; case 'mainMass' - parameters(i).value = rocket.parachutes(2, 1).mass; + parameters(i).value = rocket.parachutes{2, 1}.mass; parameters(i).udm = 'kg'; case 'mainCl' - parameters(i).value = rocket.parachutes(2, 1).cl; + parameters(i).value = rocket.parachutes{2, 1}.cl; parameters(i).udm = '-'; case 'mainCd' - parameters(i).value = rocket.parachutes(2, 1).cd; + parameters(i).value = rocket.parachutes{2, 1}.cd; parameters(i).udm = '-'; % rocket geometry --- available with the stability run only case 'rocketDiameter' @@ -86,7 +86,7 @@ for i = 1:length(parameters) parameters(i).value = rocket.lengthCenter; parameters(i).udm = 'm'; case 'centerOfMass' - parameters(i).value = rocket.xCg; + parameters(i).value = rocket.xcg; parameters(i).udm = 'm'; case 'finsRootChord' parameters(i).value = rocket.rear.finsRootChord; diff --git a/sensitivityAnalysis/src/stochParameters/updateData.m b/sensitivityAnalysis/src/stochParameters/updateData.m index e6e858eb13715fbac02489e0843c42070f490253..7035709c6cd3cb746be3049e2f5196842a26979a 100644 --- a/sensitivityAnalysis/src/stochParameters/updateData.m +++ b/sensitivityAnalysis/src/stochParameters/updateData.m @@ -1,8 +1,8 @@ -function updateData(rocket, env, wind, parameters, k) +function [rocket, env, wind] = updateData(rocket, env, wind, parameters, k) arguments rocket Rocket env Environment - wind WindCustom + wind Wind parameters struct k double end @@ -36,6 +36,8 @@ end coefficients = {'CA','CYB','CY0','CNA','CN0','Cl','Clp', ... 'Cma','Cm0','Cmad','Cmq','Cnb','Cn0','Cnr','Cnp'}; +wind = wind.updateAll(); + for i = 1:length(parameters) value = applyModFactor(parameters(i), k); @@ -62,28 +64,28 @@ for i = 1:length(parameters) case 'Izz' rocket.inertia(3, :) = value; case 'drogueSurface' - rocket.parachutes(1, 1).surface = value; + rocket.parachutes{1, 1}.surface = value; case 'drogueMass' - rocket.parachutes(1, 1).mass = value; + rocket.parachutes{1, 1}.mass = value; case 'drogueCl' - rocket.parachutes(1, 1).cl = value; + rocket.parachutes{1, 1}.cl = value; case 'drogueCd' - rocket.parachutes(1, 1).cd = value; + rocket.parachutes{1, 1}.cd = value; case 'mainSurface' - rocket.parachutes(2, 1).surface = value; + rocket.parachutes{2, 1}.surface = value; case 'mainMass' - rocket.parachutes(2, 1).mass = value; + rocket.parachutes{2, 1}.mass = value; case 'mainCl' - rocket.parachutes(2, 1).cl = value; + rocket.parachutes{2, 1}.cl = value; case 'mainCd' - rocket.parachutes(2, 1).cd = value; + rocket.parachutes{2, 1}.cd = value; % rocket geometry --- available with the stability run only case 'rocketDiameter' rocket.diameter = value; case 'rocketLCenter' rocket.lengthCenter = value; case 'centerOfMass' - rocket.xCg = value; + rocket.xcg = value; case 'finsRootChord' rocket.rear.finsRootChord = value; case 'finsFreeChord' @@ -102,9 +104,5 @@ for i = 1:length(parameters) error(strcat('Parameter: <', parameters(i).name ,'> not known')); end end - -rocket.updateAll(); -env.updateAllExcetpG0(); -wind.updateAll(); end diff --git a/simulator/mainSimulator.m b/simulator/mainSimulator.m index 3d374e55561452492398a40e83144f12e2c8140e..b9ec897857d6eae5de45f3019d59db52b87435f9 100644 --- a/simulator/mainSimulator.m +++ b/simulator/mainSimulator.m @@ -1,7 +1,7 @@ function [ascent, descent] = mainSimulator(rocket, wind, environment, settings, options) arguments rocket = [] % Rocket = Rocket.empty - wind = [] % WindCustom = WindCustom.empty + wind = [] % Wind = Wind.empty environment = [] % Environment = Environment.empty settings = [] % Settings = Settings.empty @@ -45,13 +45,13 @@ if isCommonMissing, addpath(genpath(commonPath)); end mission = Mission(true); if isempty(rocket), rocket = Rocket(mission); end if isempty(environment), environment = Environment(mission, rocket.motor); end -if isempty(wind), wind = WindCustom(mission); end +if isempty(wind), wind = Wind(mission); end if isempty(settings), settings = Settings('ode', 'simulator'); end Settings.read(settings, options, 'simulator'); %% CHECKS -if settings.simulator.ballistic && rocket.parachutes(end, 1).finalAltitude ~= 0 +if settings.simulator.ballistic && rocket.parachutes{end, 1}.finalAltitude ~= 0 error('The landing will be not achived, check the final altitude of the last parachute in config.m') end if settings.simulator.ballistic && settings.simulator.parafoil diff --git a/simulator/src/stdPlots.m b/simulator/src/stdPlots.m index df42c8dea503f84f02c8f7adb85918f6a682b674..6ef6d6868cfa354bcec857b3c1d35345176a06b9 100644 --- a/simulator/src/stdPlots.m +++ b/simulator/src/stdPlots.m @@ -182,7 +182,7 @@ if ~settings.simulator.ballistic plots(iPlot) = plot3(xM, yM, zM, 'o',... 'MarkerSize', 10, 'MarkerFaceColor', colorMarker(:, iMarker) , 'MarkerEdgeColor', 'none'); - labels(iPlot) = strcat("Stage: ", num2str(j), " ", rocket.parachutes(i,j).name ," opening"); + labels(iPlot) = strcat("Stage: ", num2str(j), " ", rocket.parachutes{i,j}.name ," opening"); iPlot = iPlot + 1; iMarker = iMarker + 1; end @@ -301,7 +301,7 @@ if ~settings.simulator.ballistic subplot(3, 1, 3); plots(iPlot) = plot(tDescent, vzDescent); - legends(iPlot) = strcat( "Stage ", num2str(j), ": ", rocket.parachutes(i, j).name , " trajectory" ); + legends(iPlot) = strcat( "Stage ", num2str(j), ": ", rocket.parachutes{i, j}.name , " trajectory" ); iPlot = iPlot + 1; end end @@ -470,7 +470,7 @@ if ~settings.simulator.ballistic subplot(1, 3, 3); plots(iPlot) = plot(yDescent, zDescent); - legends(iPlot) = strcat( "Stage ", num2str(j), ": ", rocket.parachutes(i, j).name , " trajectory" ); + legends(iPlot) = strcat( "Stage ", num2str(j), ": ", rocket.parachutes{i, j}.name , " trajectory" ); iPlot = iPlot + 1; end end diff --git a/stabilityAnalysis/mainStabilityAnalysis.m b/stabilityAnalysis/mainStabilityAnalysis.m index 28208bb1299ae3d8e63dafe8aa8491b0edd0eee7..b4ae30af6a95f30fadbbf521c5563478ce473d63 100644 --- a/stabilityAnalysis/mainStabilityAnalysis.m +++ b/stabilityAnalysis/mainStabilityAnalysis.m @@ -44,13 +44,13 @@ addpath(genpath(dissilePath)); mission = Mission(true); if isempty(rocket), rocket = Rocket(mission); end if isempty(environment), environment = Environment(mission, rocket.motor); end -if isempty(wind), wind = WindCustom(mission); end +if isempty(wind), wind = Wind(mission); end if isempty(settings), settings = Settings('stabilityAnalysis', 'ode'); end % Settings.read(settings, options, 'stability'); settings.stability.dissile.alt = environment.z0; -settings.stability.dissile.xcg = rocket.xCg(1); +settings.stability.dissile.xcg = rocket.xcg(1); %% LAUNCHPAD DYNAMICS % states to compute the exit pad velocity @@ -73,7 +73,7 @@ solution = ode113(@ballistic, [0, 10], Y0, options, ... vExit = solution.y(4, end); machExit = vExit/a; settings.stability.dissile.fltcon.MACH = machExit; % Mach @launchpad -settings.stability.dissile.refq.XCG = interpLinear(rocket.motor.time, rocket.xCg, solution.x(end)); +settings.stability.dissile.refq.XCG = interpLinear(rocket.motor.time, rocket.xcg, solution.x(end)); settings.stability.dissile.fltcon.ALT = environment.z0; % Altitude @launchpad diff --git a/stabilityAnalysis/src/computeStability.m b/stabilityAnalysis/src/computeStability.m index bdf24a9e879a436a71078195fbefdd201a7bb97f..976090cd5e6d73017c7d1c569c8c9467f9b0b8e5 100644 --- a/stabilityAnalysis/src/computeStability.m +++ b/stabilityAnalysis/src/computeStability.m @@ -115,6 +115,10 @@ for i = 1:nCall azVec = windMesh(2, ind); nInd = length(ind); + % Set uniform wind distribution + wind.magnitudeDistribution = 'u'; + wind.azimuthDistribution = 'u'; + %%% Launchpad exit flight condition for j = 1:nInd index = (nFC * (i-1)) + j; diff --git a/utils/rocketpyData/exportRocketpy.m b/utils/rocketpyData/exportRocketpy.m index 14af13de3f524454412c7a65f845983c5286ecfb..9c56cb1517973a111ac02b336c9ce3b87078aaf6 100644 --- a/utils/rocketpyData/exportRocketpy.m +++ b/utils/rocketpyData/exportRocketpy.m @@ -35,34 +35,34 @@ CA_3 = squeeze(cat(3, rocket.coefficients.total(1, alpha0, 1:iOpen, beta0, 1, 3, rocket.coefficients.total(1, alpha0, iOpen+1:end, beta0, 1, 1, 1))); %% bays details -total_center_of_mass = rocket.xCg(end); +total_center_of_mass = rocket.xcg(end); rocket_mass = rocket.massNoMotor; rocket_center_of_mass = rocket.xCgNoMotor; booster_mass = rocket.stagesMass(1); payload_mass = rocket.stagesMass(2); -booster_center_of_mass = ((rocket.parafoil.noseLength + rocket.xCg(end))*rocket.mass(end) ... - - rocket.parafoil.xCg*rocket.parafoil.mass)/rocket.stagesMass(1) - rocket.parafoil.length; -payload_center_of_mass = rocket.parafoil.xCg; +booster_center_of_mass = ((rocket.parafoil.noseLength + rocket.xcg(end))*rocket.mass(end) ... + - rocket.parafoil.xcg*rocket.parafoil.mass)/rocket.stagesMass(1) - rocket.parafoil.length; +payload_center_of_mass = rocket.parafoil.xcg; % parafoil mPld = rocket.parafoil.mass; lPld = rocket.parafoil.length; -xcgPld = rocket.parafoil.xCg; +xcgPld = rocket.parafoil.xcg; % recovery mRcs = rocket.recovery.mass; lRcs = rocket.recovery.length; -xcgRcs = rocket.recovery.xCg; +xcgRcs = rocket.recovery.xcg; % electronics mElc = rocket.electronics.mass; lElc = rocket.electronics.length; -xcgElc = rocket.electronics.xCg; +xcgElc = rocket.electronics.xcg; % airbrakes mArb = rocket.airbrakes.mass; lArb = rocket.airbrakes.length; -xcgArb = rocket.airbrakes.xCg; +xcgArb = rocket.airbrakes.xcg; % motor propMass = rocket.motor.propellantMass; @@ -70,7 +70,7 @@ usedPropMass = propMass - propMass(end); time = rocket.motor.time; propMassDot = diff(usedPropMass)./diff(time); propMassDot(end + 1) = propMassDot(end); -propCG = (rocket.xCg.*(usedPropMass + total_center_of_mass) - total_center_of_mass*total_center_of_mass)./usedPropMass; +propCG = (rocket.xcg.*(usedPropMass + total_center_of_mass) - total_center_of_mass*total_center_of_mass)./usedPropMass; propCG(end) = propCG(end - 1); propCG = propCG - rocket.absolutePositions("motor"); burn_time = time(end); @@ -78,15 +78,15 @@ thrust = rocket.motor.thrust; motor_dry_mass = rocket.motor.structureMass; lMot = rocket.motor.length; -xcgMotWet = rocket.motor.xCg; +xcgMotWet = rocket.motor.xcg; motor_center_of_dry_mass = 1/rocket.motor.structureMass *... - (rocket.motor.xCg(1) * (rocket.motor.structureMass + rocket.motor.propellantMass(1)) - ... + (rocket.motor.xcg(1) * (rocket.motor.structureMass + rocket.motor.propellantMass(1)) - ... rocket.motor.propellantMass(1) * propCG(1)); % rear (fins + fincan + boat, it overlaps with motor) mRear = rocket.rear.mass; lRear = rocket.rear.length; -xcgRear = rocket.rear.xCg; +xcgRear = rocket.rear.xcg; %% inertia details % inertia without motor @@ -96,9 +96,9 @@ rocket_I_33 = rocket.inertiaNoMotor(1); % propellant inertia prop_I_11 = (rocket.inertia(2, :) - rocket.inertia(2, end)) - ... - usedPropMass .* (rocket.xCg - (rocket.absolutePositions("motor") + propCG)).^2; + usedPropMass .* (rocket.xcg - (rocket.absolutePositions("motor") + propCG)).^2; prop_I_22 = (rocket.inertia(3, :) - rocket.inertia(3, end)) - ... - usedPropMass .* (rocket.xCg - (rocket.absolutePositions("motor") + propCG)).^2; + usedPropMass .* (rocket.xcg - (rocket.absolutePositions("motor") + propCG)).^2; prop_I_33 = (rocket.inertia(1, :) - rocket.inertia(1, end)); % motor inertia @@ -114,10 +114,10 @@ motor_I_33_dry = motor_I_33(1) - prop_I_33(1); % booster inertia deltaDistance = rocket.absolutePositions("parafoil") + rocket.parafoil.length; -booster_I_11 = rocket.inertia(2, end) + rocket.mass(end) * (rocket.xCg(end) - deltaDistance - booster_center_of_mass)^2 - ... - (rocket.parafoil.inertia(2, end) + rocket.parafoil.mass * (rocket.parafoil.length - rocket.parafoil.xCg + booster_center_of_mass)^2); -booster_I_22 = rocket.inertia(3, end) + rocket.mass(end) * (rocket.xCg(end) - deltaDistance - booster_center_of_mass)^2 - ... - (rocket.parafoil.inertia(3, end) + rocket.parafoil.mass * (rocket.parafoil.length - rocket.parafoil.xCg + booster_center_of_mass)^2); +booster_I_11 = rocket.inertia(2, end) + rocket.mass(end) * (rocket.xcg(end) - deltaDistance - booster_center_of_mass)^2 - ... + (rocket.parafoil.inertia(2, end) + rocket.parafoil.mass * (rocket.parafoil.length - rocket.parafoil.xcg + booster_center_of_mass)^2); +booster_I_22 = rocket.inertia(3, end) + rocket.mass(end) * (rocket.xcg(end) - deltaDistance - booster_center_of_mass)^2 - ... + (rocket.parafoil.inertia(3, end) + rocket.parafoil.mass * (rocket.parafoil.length - rocket.parafoil.xcg + booster_center_of_mass)^2); booster_I_33 = rocket.inertia(1, end) - rocket.parafoil.inertia(1, end); % parafoil inertia @@ -146,16 +146,16 @@ fins_position = rocket.lengthCenter - rocket.rear.finsAxialDistance - root_chord boat_position = rocket.lengthCenter; %% parachutes -booster_drogue_cd_s = rocket.parachutes(1, 1).surface * rocket.parachutes(1, 1).cd; -booster_drogue_opening_delay = rocket.parachutes(1,1).openingTime; +booster_drogue_cd_s = rocket.parachutes{1, 1}.surface * rocket.parachutes{1, 1}.cd; +booster_drogue_opening_delay = rocket.parachutes{1,1}.openingTime; -booster_main_cd_s = rocket.parachutes(2, 1).surface * rocket.parachutes(2, 1).cd; -booster_main_opening_delay = rocket.parachutes(2,1).openingTime; -booster_main_opening_altitude = rocket.parachutes(1, 1).finalAltitude + environment.z0; +booster_main_cd_s = rocket.parachutes{2, 1}.surface * rocket.parachutes{2, 1}.cd; +booster_main_opening_delay = rocket.parachutes{2,1}.openingTime; +booster_main_opening_altitude = rocket.parachutes{1, 1}.finalAltitude + environment.z0; -payload_drogue_cd_s = rocket.parachutes(1, 2).surface * rocket.parachutes(1, 2).cd; -payload_drogue_opening_delay = rocket.parachutes(1, 2).openingTime; -parafoil_opening_altitude = rocket.parachutes(1, 2).finalAltitude + environment.z0; +payload_drogue_cd_s = rocket.parachutes{1, 2}.surface * rocket.parachutes{1, 2}.cd; +payload_drogue_opening_delay = rocket.parachutes{1, 2}.openingTime; +parafoil_opening_altitude = rocket.parachutes{1, 2}.finalAltitude + environment.z0; %% launchpad and environment details latitude = environment.lat0;