From c1d97312f44e0dc8ea5e30dbe8b7e2c7f8e0a87d Mon Sep 17 00:00:00 2001 From: Mauco03 <marco.gaibotti@skywarder.eu> Date: Thu, 16 May 2024 22:15:56 +0200 Subject: [PATCH] [refactoring-ode][classes] Implementing ability to extract data from multiple solutions --- classes/DataWrapper.m | 22 ++++++++--------- functions/miscellaneous/getOdeFcn.m | 37 ++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/classes/DataWrapper.m b/classes/DataWrapper.m index 3fa54c6..6d484e2 100644 --- a/classes/DataWrapper.m +++ b/classes/DataWrapper.m @@ -51,6 +51,16 @@ classdef DataWrapper < handle obj.data(obj.counter + 1) = data; end + function out = getData(obj, startIdx) + % detData - Reads data from wrapper + % This action will NOT reset cache + arguments + obj + startIdx = 1 + end + out = obj.data(startIdx:obj.counter); + end + function setData(obj) % setData - Promoted current data stored in cache % promoted data will be saved until wrapper is reset @@ -71,16 +81,6 @@ classdef DataWrapper < handle obj.reset(); end - function out = getData(obj, startIdx) - % detData - Reads data from wrapper - % This action will NOT reset cache - arguments - obj - startIdx = 1 - end - out = obj.data(startIdx:obj.counter); - end - function obj = reset(obj) % reset - Resets cache to starting conditions @@ -106,7 +106,7 @@ classdef DataWrapper < handle currentValue = [data.(currentField)]; if isstruct(currentValue) - out.(currentField) = DataWrapper.packageData([data.(currentField)]); + out.(currentField) = DataWrapper.packageData(currentValue); else sz = size(data(1).(currentField)); if all(sz > 1) diff --git a/functions/miscellaneous/getOdeFcn.m b/functions/miscellaneous/getOdeFcn.m index d8dbc0c..3b23cd9 100644 --- a/functions/miscellaneous/getOdeFcn.m +++ b/functions/miscellaneous/getOdeFcn.m @@ -1,11 +1,11 @@ function out = getOdeFcn(solution, startIdx) arguments - solution - startIdx = 1 + solution (1, :) struct + startIdx (1, 1) double = 1 end % recallOdeFcn - This function allows to compute some parameters used % inside the ODE integrations. -% +% % INPUTS: % - fun, function, ode function used; % - T, double [n° variation, 1], integration time vector; @@ -17,18 +17,33 @@ end % * m , total mass; % * (Ixx Iyy Izz), Inertias; % * (q0 q1 q2 q3), attitude unit quaternion. -% +% % OUTPUTS: % - allSteps, struct, which contains all the parameters needed. -args = solution.extdata.varargin; -fun = solution.extdata.odefun; +if length(solution) == 1 + args = solution.extdata.varargin; + fun = solution.extdata.odefun; -wrapper = args{end}; -data = wrapper.getData(startIdx); + wrapper = args{end}; + data = wrapper.getData(startIdx); -%% Fixing points at t = 0, t = end + %% Fixing points at t = 0, t = end + + [~, data(1)] = fun(solution.x(startIdx), solution.y(:,startIdx), args{1:end-1}); + [~, data(end)] = fun(solution.x(end), solution.y(:,end), args{1:end-1}); +else + extData = [solution.extdata]; + startFun = extData(1).odefun; + startArgs = extData(1).varargin; + endFun = extData(end).odefun; + endArgs = extData(end).varargin; + + wrapper = endArgs{end}; + data = wrapper.getData(startIdx); + + [~, data(1)] = startFun(solution(1).x(startIdx), solution(1).y(:,startIdx), startArgs{1:end-1}); + [~, data(end)] = endFun(solution(end).x(end), solution(end).y(:,end), endArgs{1:end-1}); +end -[~, data(1)] = fun(solution.x(startIdx), solution.y(:,startIdx), args{1:end-1}); -[~, data(end)] = fun(solution.x(end), solution.y(:,end), args{1:end-1}); out = wrapper.packageData(data); \ No newline at end of file -- GitLab