Home > classes > @ssm > assemble.m

assemble

PURPOSE ^

assembles embedded subsytems, with exogenous inputs

SYNOPSIS ^

function varargout = assemble( varargin )

DESCRIPTION ^

 assembles embedded subsytems, with exogenous inputs
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 DESCRIPTION: assemble assembles embedded subsytems, with exogenous inputs

 CALL: [sys] = ltpda_ss_assemble(sys_array)

 INPUTS: sys_array - array of systems to assemble

 OUTPUTS: sys - assembled system

 ***** There are no parameters *****

 VERSION: '$Id: ltpda_ss_assemble.m,v 1.2 2008/02/20 09:20:07 adrien Exp$'

 M-FILE INFO: Get information about this methods by calling
              >> ssm.getInfo('assemble')

              Get information about a specified set-plist by calling:
              >> ssm.getInfo('assemble', 'Default')

 HISTORY:
 09-07-2008 A Grynagier
 29-05-2008 A Grynagier
 17-04-2008 A Grynagier
 23-01-2008 A Grynagier
 29-01-2008 A Grynagier

 TO DO : 
 needs work on D inversion.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 % assembles embedded subsytems, with exogenous inputs
0002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0003 %
0004 % DESCRIPTION: assemble assembles embedded subsytems, with exogenous inputs
0005 %
0006 % CALL: [sys] = ltpda_ss_assemble(sys_array)
0007 %
0008 % INPUTS: sys_array - array of systems to assemble
0009 %
0010 % OUTPUTS: sys - assembled system
0011 %
0012 % ***** There are no parameters *****
0013 %
0014 % VERSION: '$Id: ltpda_ss_assemble.m,v 1.2 2008/02/20 09:20:07 adrien Exp$'
0015 %
0016 % M-FILE INFO: Get information about this methods by calling
0017 %              >> ssm.getInfo('assemble')
0018 %
0019 %              Get information about a specified set-plist by calling:
0020 %              >> ssm.getInfo('assemble', 'Default')
0021 %
0022 % HISTORY:
0023 % 09-07-2008 A Grynagier
0024 % 29-05-2008 A Grynagier
0025 % 17-04-2008 A Grynagier
0026 % 23-01-2008 A Grynagier
0027 % 29-01-2008 A Grynagier
0028 %
0029 % TO DO :
0030 % needs work on D inversion.
0031 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0032 
0033 function   varargout = assemble( varargin )
0034 
0035   %% starting initial checks
0036   utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]);
0037   
0038   % Check if this is a call for parameters
0039   if utils.helper.isinfocall(varargin{:})
0040     varargout{1} = getInfo(varargin{3});
0041     return
0042   end
0043 
0044   % checking number of inputs work data
0045   if ~(nargin==2||nargin==1), error('wrong number of inputs!'), end
0046   % checking input class
0047   if ~isa(varargin{1},'ssm'), error(['argument is not a ssm but a ', class(varargin{1})]),end
0048 
0049   sys_array = varargin{1};
0050   Nsys = length(sys_array);
0051   %% begin function body
0052   sys_out = ssm;
0053 
0054   %%  Putting toghether parameter fields
0055   for i=1:Nsys
0056     sys_out.paramnames  = [sys_out.paramnames  sys_array(i).paramnames ];  %#ok<AGROW>
0057     sys_out.paramvalues = [sys_out.paramvalues sys_array(i).paramvalues];  %#ok<AGROW>
0058     sys_out.paramsigmas = [sys_out.paramsigmas sys_array(i).paramsigmas];  %#ok<AGROW>
0059   end
0060   sys_out.isnumerical = true;
0061   for i=1:Nsys
0062     sys_out.isnumerical = sys_out.isnumerical*sys_array(i).isnumerical;
0063   end
0064 
0065   %% merging ss data : ss* output* *input
0066 
0067   names       = cell(1,0);
0068   ssnames       = cell(1,0);
0069   ssvarnames    = cell(1,0);
0070   ssini         = zeros(0,1);
0071   sssizes       = zeros(1,0);
0072   ssposition    = zeros(2,0);
0073   outputnames    = cell(1,0);
0074   outputvarnames = cell(1,0);
0075   outputsizes    = zeros(1,0);
0076   outputposition = zeros(2,0);
0077   inputnames    = cell(1,0);
0078   inputvarnames = cell(1,0);
0079   inputsizes    = zeros(1,0);
0080   inputposition = zeros(2,0);
0081   for i=1:Nsys
0082     names          = [names          sys_array(i).name           ];
0083     ssnames        = [ssnames        sys_array(i).ssnames        ];
0084     ssvarnames     = [ssvarnames     sys_array(i).ssvarnames     ];
0085     ssini          = [ssini        ; sys_array(i).ssini          ];
0086     sssizes        = [sssizes        sys_array(i).sssizes        ];
0087     ssposition     = [ssposition     [i*ones(1,sys_array(i).Nss)      ; 1:sys_array(i).Nss]       ];
0088     outputnames    = [outputnames    sys_array(i).outputnames    ];
0089     outputvarnames = [outputvarnames sys_array(i).outputvarnames ];
0090     outputsizes    = [outputsizes    sys_array(i).outputsizes    ];
0091     outputposition = [outputposition [i*ones(1,sys_array(i).Noutputs) ; 1:sys_array(i).Noutputs]  ];
0092     inputvarnames  = [inputvarnames  sys_array(i).inputvarnames  ];
0093     inputnames     = [inputnames     sys_array(i).inputnames     ];
0094     inputsizes     = [inputsizes     sys_array(i).inputsizes     ];
0095     inputposition  = [inputposition  [i*ones(1,sys_array(i).Ninputs)  ; 1:sys_array(i).Ninputs ]  ];
0096   end
0097   %% data already good to store
0098   sys_out.ssini             = ssini;
0099   sys_out.ssnames           = ssnames;
0100   sys_out.ssvarnames        = ssvarnames;
0101   sys_out.outputnames       = outputnames;
0102   sys_out.outputvarnames    = outputvarnames;
0103 
0104   %% non redundancy checks
0105   for i=1:length(names)
0106     [pos_in, sum_in] = ssm.cellstrfind(names, names{i},'all');
0107     if sum_in>1
0108       error([num2str(sum_in),' systems are named ', names{i}])
0109     end
0110   end
0111   for i=1:length(ssnames)
0112     [pos_in, sum_in] = ssm.cellstrfind(ssnames, ssnames{i},'all');
0113     if sum_in>1
0114       error([num2str(sum_in),' states are named ', ssnames{i}])
0115     end
0116   end
0117   for i=1:length(outputnames)
0118     [pos_in, sum_in] = ssm.cellstrfind(outputnames, outputnames{i},'all');
0119     if sum_in>1
0120       error([num2str(sum_in),' outputs are named ', outputnames{i}])
0121     end
0122   end
0123 
0124   %% fields for outer inputs
0125   inputisouter = false(1,length(outputnames));
0126   for i=1:length(inputnames)
0127     [pos_in, sum_in] = ssm.cellstrfind(outputnames, inputnames(i),'all');
0128     if sum_in==0
0129       inputisouter(i)=true;
0130     end
0131   end
0132 
0133   %% building A, M and C matrices
0134   amats = {};
0135   mmats = {};
0136   cmats = {};
0137   for i=1:Nsys
0138     amats = ...
0139       [amats                      cell(size(amats,1),size(sys_array(i).amats,2))    ; ...
0140       cell(size(sys_array(i).amats,1),size(amats,2))            sys_array(i).amats ] ;
0141     mmats = ...
0142       [mmats                      cell(size(mmats,1),size(sys_array(i).mmats,2))    ; ...
0143       cell(size(sys_array(i).mmats,1),size(mmats,2))            sys_array(i).mmats ] ;
0144     cmats = ...
0145       [cmats                      cell(size(cmats,1),size(sys_array(i).cmats,2))    ; ...
0146       cell(size(sys_array(i).cmats,1),size(cmats,2))            sys_array(i).cmats ] ;
0147   end
0148   sys_out.mmats = mmats;
0149   
0150   %% building B_in and D_in matrices
0151   B_in = cell( length(ssnames),     length(outputnames) );
0152   D_in = cell( length(outputnames), length(outputnames) );
0153   for i=1:length(outputnames)
0154       [pos_in, sum_in] = ssm.cellstrfind(inputnames, outputnames{i},'all');
0155       if sum_in>0
0156         for pos = pos_in
0157           systemNumber = inputposition(1,pos);
0158           inputNumber  = inputposition(2,pos);
0159             B_in(ssposition(1,:)==systemNumber, i)     = sys_array(systemNumber).bmats(:,inputNumber);
0160             D_in(outputposition(1,:)==systemNumber, i) = sys_array(systemNumber).dmats(:,inputNumber);
0161         end
0162       end
0163   end
0164 
0165   %% building B_ext and D_ext matrices
0166   B_ext = cell( length(ssnames),     length(inputnames) );
0167   D_ext = cell( length(outputnames), length(inputnames) );
0168   pos_keep = false(1, length(inputnames));
0169   for i=1:length(inputnames)
0170       [pos_in, sum_in] = ssm.cellstrfind(outputnames, inputnames(i),'all');
0171       if sum_in==0
0172         [pos_in, sum_in] = ssm.cellstrfind(inputnames, inputnames(i),'all');
0173         for pos = pos_in;
0174           systemNumber  = inputposition(1,pos);
0175           inputNumber   = inputposition(2,pos);
0176           B_ext( ssposition(1,:)==systemNumber , pos_in(1) )    = sys_array(systemNumber).bmats(:,inputNumber);
0177           D_ext( outputposition(1,:)==systemNumber, pos_in(1) ) = sys_array(systemNumber).dmats(:,inputNumber);
0178           pos_keep(pos_in(1)) = true;
0179         end
0180       end
0181   end
0182 
0183   %% getting amats, bmats, cmats, dmats
0184   B_ext                 = B_ext(:,pos_keep);
0185   D_ext                 = D_ext(:,pos_keep);
0186   sys_out.inputnames    = inputnames(pos_keep);
0187   sys_out.inputvarnames = inputvarnames(pos_keep);
0188 
0189   %% flattening and getting constant feedthrough
0190   D_in_f = ssm.cell_fusion(D_in, outputsizes,outputsizes);
0191   id_D_inv = (eye(size(D_in_f)) - D_in_f)^-1;
0192   id_D_inv = ssm.cell_recut(id_D_inv, outputsizes, outputsizes);
0193   sys_out.amats = ssm.cell_add(amats, ssm.cell_mult(B_in, ssm.cell_mult(id_D_inv, cmats)));
0194   sys_out.bmats = ssm.cell_add(B_ext, ssm.cell_mult(B_in, ssm.cell_mult(id_D_inv, D_ext)));
0195   sys_out.cmats = ssm.cell_mult(id_D_inv, cmats);
0196   sys_out.dmats = ssm.cell_mult(id_D_inv, D_ext);
0197 
0198   %% building new name and strings
0199   name = 'assembled( ';
0200   for i = 1:Nsys
0201     if i==1
0202       name = [name, sys_array(i).name ];                        %#ok<AGROW>
0203     elseif i<Nsys
0204       name = [name,' + ', sys_array(i).name];                   %#ok<AGROW>
0205     else
0206       name = [name,' + ', sys_array(i).name,')'];               %#ok<AGROW>
0207     end
0208   end
0209   name = [name ')'];
0210   sys_out.name = name;
0211 
0212   %% getting timestep and checking consitency
0213   for i=1:Nsys
0214     if i == 1
0215       sys_out.timestep = sys_array(i).timestep;
0216     elseif ~ sys_out.timestep == sys_array(i).timestep
0217       error(['error because systems 1 and ',num2str(i),...
0218         ' named ',sys_array(i).name,' and ',sys_array(i).name,...
0219         ' have different timesteps :',...
0220         num2str(sys_array(i).timestep),' and ',num2str(sys_array(i).timestep) ]);
0221     end
0222   end
0223 
0224   %% setting history
0225   h = history();
0226   for i=1:Nsys
0227     h(i) = sys_array(i).hist;
0228   end
0229   sys_out.addHistory(ssm.getInfo(mfilename), plist , {''}, h );
0230   %% parsing output
0231   sys_out = validate(sys_out);
0232   varargout = {sys_out};
0233 end
0234 
0235 
0236 function ii = getInfo(varargin)
0237   if nargin == 1 && strcmpi(varargin{1}, 'None')
0238     sets = {};
0239     pls   = [];
0240   elseif nargin == 1 && ~isempty(varargin{1}) && ischar(varargin{1})
0241     sets{1} = varargin{1};
0242     pls = getDefaultPlist(sets{1});
0243   else
0244     sets = {'Default'};
0245     pls = [];
0246     for kk=1:numel(sets)
0247       pls = [pls getDefaultPlist(sets{kk})];
0248     end
0249   end
0250   % Build info object
0251   ii = minfo(mfilename, 'ssm', '', 'STATESPACE', '$Id: resp.m,v 1.17 2008/07/22 10:22:38 ingo Exp $', sets, pls);
0252 end
0253 
0254 function out = getDefaultPlist(set)
0255   switch set
0256     case 'Default'
0257       out = plist;
0258     otherwise
0259       error('### Unknown set [%s] to get the default plist.', set);
0260   end
0261 end

Generated on Mon 25-Aug-2008 22:39:29 by m2html © 2003