function mttWriteSystemInitialisation(model)
assignment.numpar = assign_numerical_parameters(model) ;
assignment.sympar = assign_symbolic_parameters(model) ;
assignment.input = assign_input_variables(model) ;
assignment.invar = assign_input_covariables(model) ;
assignment.state = assign_state_variables(model) ;
write_set_numpar(assignment,model) ;
write_set_input(assignment,model) ;
write_set_state(assignment,model) ;
function code = assign_symbolic_parameters(model)
mttNotify('...assigning symbolic parameters') ;
mttWriteNewLine ;
model_name = mttDetachText(model.source,'/') ;
code = [] ;
line = 0 ;
number_of_variables = mttGetFieldLength(model,'sympar') ;
for i = 1:number_of_variables
variable_name = model.sympar{i} ;
default = model.sympar_default{i} ;
if isempty(default)
line = line + 1 ;
code{line} = [model_name,'___',variable_name,' = 1.0 ;'] ;
else
line = line + 1 ;
code{line} = [model_name,'___',variable_name,' = ',default,' ;'] ;
end
end
function code = assign_numerical_parameters(model,root,branch)
is_root_model = nargin==1 ;
if is_root_model
mttNotify('...assigning numerical parameters') ;
mttWriteNewLine ;
root = model ;
current_branch = mttDetachText(model.source,'/') ;
else
current_branch = branch ;
end
code = [] ;
line = 0 ;
number_of_variables = mttGetFieldLength(model,'numpar') ;
for i = 1:number_of_variables
variable_name = model.numpar{i} ;
default = model.numpar_default{i} ;
line = line + 1 ;
if isempty(default)
code{line} = [current_branch,'___',variable_name,' = 1.0 ;'] ;
else
code{line} = [current_branch,'___',variable_name,' = ',default,' ;'] ;
end
end
objects = mttGetFieldNames(model,'obj') ;
for i = 1:length(objects)
object_name = objects{i} ;
object = getfield(model,'obj',object_name) ;
next_branch = [current_branch,'__',object_name] ;
additional_code = [] ;
if ~isempty(object.abg)
additional_code = assign_numerical_parameters(object,root,next_branch) ;
elseif ~isempty(object.cr)
additional_code = assign_numerical_parameters(object.cr,root,next_branch) ;
end
if isempty(code)
code = additional_code ;
else
line = length(code) ;
for j = 1:length(additional_code)
if ~ismember(additional_code{j},code)
line = line + 1 ;
code{line} = additional_code{j} ;
end
end
end
end
function code = assign_input_variables(model,root,branch)
is_root_model = nargin==1 ;
if is_root_model
mttNotify('...assigning input variables') ;
mttWriteNewLine ;
root = model ;
current_branch = mttDetachText(model.source,'/') ;
else
current_branch = branch ;
end
code = [] ;
line = 0 ;
number_of_variables = mttGetFieldLength(model,'input') ;
for i = 1:number_of_variables
variable_name = model.input{i} ;
default = model.input_default{i} ;
line = line + 1 ;
if isempty(default)
code{line} = [current_branch,'___',variable_name,' = 0.0 ;'] ;
else
code{line} = [current_branch,'___',variable_name,' = ',default,' ;'] ;
end
end
objects = mttGetFieldNames(model,'obj') ;
for i = 1:length(objects)
object_name = objects{i} ;
object = getfield(model,'obj',object_name) ;
next_branch = [current_branch,'__',object_name] ;
additional_code = [] ;
if ~isempty(object.abg)
additional_code = assign_input_variables(object,root,next_branch) ;
elseif ~isempty(object.cr)
additional_code = assign_input_variables(object.cr,root,next_branch) ;
end
if isempty(code)
code = additional_code ;
else
line = length(code) ;
for j = 1:length(additional_code)
if ~ismember(additional_code{j},code)
line = line + 1 ;
code{line} = additional_code{j} ;
end
end
end
end
function code = assign_input_covariables(model,root,branch,env)
is_root_model = nargin==1 ;
if is_root_model
mttNotify('...assigning input covariables') ;
mttWriteNewLine ;
root = model ;
current_branch = mttDetachText(model.source,'/') ;
env = model.env ;
else
current_branch = branch ;
end
code = [] ;
line = 0 ;
objects = mttGetFieldNames(model,'obj') ;
for i = 1:length(objects)
object_name = objects{i} ;
object = getfield(model,'obj',object_name) ;
next_branch = [current_branch,'__',object_name] ;
switch object.class
case {'SS','Se','Sf','De','Df'}
inbond_number = object.interface.in ;
outbond_number = object.interface.out ;
inbond = model.bond(inbond_number) ;
outbond = model.bond(outbond_number) ;
if ~isempty(inbond)
covariables = mttGetCovariables(env,inbond.domain,inbond.domain_item) ;
covar = [] ;
if ~inbond.effort
if ~strcmp(object.class,'Df')
covar = covariables.effort ;
end
elseif inbond.flow
if ~strcmp(object.class,'De')
covar = covariables.flow ;
end
end
for j = 1:length(covar)
line = line + 1 ;
covariable = strrep(covar{j},'.','__') ;
code{line} = [current_branch,'__',object_name,'.',covariable,' = 0.0 ;'] ;
end
end
if ~isempty(outbond)
covariables = mttGetCovariables(env,outbond.domain,outbond.domain_item) ;
if outbond.effort
covar = covariables.effort ;
elseif ~outbond.flow
covar = covariables.flow ;
end
for j = 1:length(covar)
line = line + 1 ;
covariable = strrep(covar{j},'.','__') ;
code{line} = [current_branch,'__',object_name,'.',covariable,' = 0.0 ;'] ;
end
end
end
additional_code = [] ;
if ~isempty(object.abg)
additional_code = assign_input_covariables(object,root,next_branch,env) ;
end
if isempty(code)
code = additional_code ;
else
line = length(code) ;
for j = 1:length(additional_code)
if ~ismember(additional_code{j},code)
line = line + 1 ;
code{line} = additional_code{j} ;
end
end
end
end
function code = assign_state_variables(model,root,branch,env)
is_root_model = nargin==1 ;
if is_root_model
mttNotify('...assigning state variables') ;
mttWriteNewLine ;
root = model ;
current_branch = mttDetachText(model.source,'/') ;
env = model.env ;
else
current_branch = branch ;
end
code = [] ;
line = 0 ;
if isfield(model,'state')
assigned_states = [] ;
counter = 0 ;
port_names = mttGetFieldNames(model.interface,'port') ;
for j = 1:length(port_names)
port_name = port_names{j} ;
port = getfield(model,'interface','port',port_name) ;
if ~isempty(port.assign)
assignment = port.assign ;
if port.was_generic & ~isempty(port.domain)
covariables = mttGetCovariables(env,port.domain,port.domain_item) ;
if port.is_effort_state
covar = covariables.effort ;
default = covariables.effort_default ;
else
covar = covariables.flow ;
default = covariables.flow_default ;
end
block_size = length(covar) ;
for k = 1:length(assignment.state)
counter = counter + 1 ;
assigned_states{counter} = assignment.state{k} ;
for var = 1:block_size
line = line + 1 ;
if isempty(default{var})
code{line} = [current_branch,'___',assignment.state{k},'___',covar{var},'.state = 0.0 ;'] ;
else
code{line} = [current_branch,'___',assignment.state{k},'___',covar{var},'.state = ',default{var},' ;'] ;
end
end
end
end
end
end
number_of_variables = mttGetFieldLength(model,'state') ;
for i = 1:number_of_variables
variable_name = model.state{i} ;
default = model.state_default{i} ;
if ~ismember(variable_name,assigned_states)
line = line + 1 ;
if isempty(default)
code{line} = [current_branch,'___',variable_name,'.state = 0.0 ;'] ;
else
code{line} = [current_branch,'___',variable_name,'.state = ',default,' ;'] ;
end
end
end
end
objects = mttGetFieldNames(model,'obj') ;
for i = 1:length(objects)
object_name = objects{i} ;
object = getfield(model,'obj',object_name) ;
next_branch = [current_branch,'__',object_name] ;
additional_code = [] ;
if ~isempty(object.abg)
additional_code = assign_state_variables(object,root,next_branch,env) ;
elseif ~isempty(object.cr)
additional_code = assign_state_variables(object.cr,root,next_branch,env) ;
end
if isempty(code)
code = additional_code ;
else
line = length(code) ;
for j = 1:length(additional_code)
if ~ismember(additional_code{j},code)
line = line + 1 ;
code{line} = additional_code{j} ;
end
end
end
end
function write_set_numpar(assignment,model)
filename = [model.source,'_include_set_numpar.h'] ;
fid = fopen(filename,'w') ;
mttNotify(['...creating ',filename]) ;
mttWriteNewLine ;
fprintf(fid,['// Numerical Parameters for Ordinary Differential Equations\n']) ;
fprintf(fid,'\n') ;
fprintf(fid,['// file: ',filename,'\n']) ;
fprintf(fid,['// written by MTT on ',datestr(now),'\n']) ;
model_name = mttDetachText(model.source,'/') ;
write_assigned_list(fid,[],assignment.numpar,model_name) ;
fclose(fid) ;
function write_set_input(assignment,model)
filename = [model.source,'_include_set_input.h'] ;
fid = fopen(filename,'w') ;
mttNotify(['...creating ',filename]) ;
mttWriteNewLine ;
fprintf(fid,['// Default Inputs for Ordinary Differential Equations\n']) ;
fprintf(fid,'\n') ;
fprintf(fid,['// file: ',filename,'\n']) ;
fprintf(fid,['// written by MTT on ',datestr(now),'\n']) ;
model_name = mttDetachText(model.source,'/') ;
write_assigned_list(fid,'symbolic_parameters',assignment.sympar,model_name) ;
write_assigned_list(fid,'input_variables',assignment.input,model_name) ;
write_assigned_list(fid,'input_covariables',assignment.invar,model_name) ;
fclose(fid) ;
function write_set_state(assignment,model)
filename = [model.source,'_include_set_state.h'] ;
fid = fopen(filename,'w') ;
mttNotify(['...creating ',filename]) ;
mttWriteNewLine ;
fprintf(fid,['// Initial states for Ordinary Differential Equations\n']) ;
fprintf(fid,'\n') ;
fprintf(fid,['// file: ',filename,'\n']) ;
fprintf(fid,['// written by MTT on ',datestr(now),'\n']) ;
model_name = mttDetachText(model.source,'/') ;
write_assigned_list(fid,[],assignment.state,model_name) ;
fclose(fid) ;
function write_assigned_list(fid,var_type,var_list,model_name)
if ~isempty(var_list)
if ~isempty(var_type)
fprintf(fid,'\n\n') ;
fprintf(fid,['// ',var_type]) ;
end
fprintf(fid,'\n') ;
var_list = sort(var_list) ;
width = 0 ;
for i = 1:length(var_list)
[left,right] = mttCutText(var_list{i},'=') ;
width = max(width,length(left)) ;
end
tab = char(32*ones(1,3)) ;
for i = 1:length(var_list)
[left,right] = mttCutText(var_list{i},'=') ;
nominal_width = width ;
actual_width = length(left) ;
gap = nominal_width - actual_width ;
whitespace = char(32*ones(1,gap)) ;
formatted_assignment = [tab,left,whitespace,' = ',right,'\n'] ;
fprintf(fid,formatted_assignment) ;
end
end