function model = mttCreateUnifiedModel(model,bondgraph,specification)
model.source = mttCutText(specification.specification,'_abg.txt') ;
model.bondgraph = mttCutText(bondgraph.bondgraph,'_abg.fig') ;
model.obj = bondgraph.obj ;
model.bond = bondgraph.bond ;
object_names = mttGetFieldNames(model,'obj') ;
specified_object_names = mttGetFieldNames(specification,'obj') ;
for n = 1:length(object_names)
object_name = object_names{n} ;
object = getfield(model,'obj',object_name) ;
if ~mttIsPassiveClass(object.class)
mttAssert(ismember(object_name,specified_object_names),...
['Object name "',object_name,'" does not appear in specification']) ;
end
end
for n = 1:length(specified_object_names)
specified_object_name = specified_object_names{n} ;
mttAssert(ismember(specified_object_name,object_names),...
['Specified object name "',specified_object_name,...
'" does not appear in bond graph']) ;
specified_object = getfield(specification,'obj',specified_object_name) ;
object = getfield(model,'obj',specified_object_name) ;
if strcmp(specified_object.name.class,object.class)
mttAssert(~mttIsFoundationClass(object.class),...
'Cannot redefine MTT foundation class') ;
is_abg = 1 ;
else
mttAssert(~mttIsPassiveClass(object.class),...
'Cannot modify MTT junctions or ports') ;
is_abg = 0 ;
end
object.is_abg = is_abg ;
object.name = specified_object.name ;
object.parameter = specified_object.parameter ;
model = setfield(model,'obj',specified_object_name,object) ;
end
model.sympar = specification.sympar ;
model.numpar = specification.numpar ;
model.input = specification.input ;
model.sympar_default = specification.sympar_default ;
model.numpar_default = specification.numpar_default ;
model.input_default = specification.input_default ;
for n = 1:length(object_names)
object_name = object_names{n} ;
object = getfield(model,'obj',object_name) ;
if mttIsPortClass(object.class)
mttAssert(mttGetFieldLength(object,'interface')==1,...
['Port components must have one and only one interface']) ;
switch object.class
case {'Se','Sf'},
mttAssert(~isempty(object.interface.out),...
'Each source port must have an outward bond') ;
case {'De','Df'},
mttAssert(~isempty(object.interface.in),...
'Each detector port must have an inward bond') ;
end
end
if ~ismember(object_name,specified_object_names)
object.name.item = [] ;
object.name.class = object.class ;
object.name.path = [] ;
object.parameter = [] ;
object.is_abg = 1 ;
end
[rubbish,working_directory] = mttDetachText(model.source,'/') ;
local_directory = object.name.path ;
directory = mttLocateDirectory(working_directory,local_directory) ;
source = [directory,'/',object.name.class] ;
current_leaf = model.leaf ;
if object.is_abg
if mttIsPassiveClass(object.name.class)
object.abg = [] ;
else
current_branch = model.branch ;
mttAssert(~ismember(source,current_branch),...
['Recursive definition of "',source,'"']) ;
if isempty(model.abgs)
existing_abg = [] ;
else
existing_abg = strmatch(source,model.abgs,'exact') ;
end
if isempty(existing_abg)
if isempty(current_branch)
next_branch = {source} ;
next_leaf = object_name ;
else
next_branch = [current_branch,{source}] ;
next_leaf = [current_leaf,'/',object_name] ;
end
model.branch = next_branch ;
model.leaf = next_leaf ;
class_model = mttCreateAcausalBondgraph(source,model) ;
model.leaf = current_leaf ;
model.branch = current_branch ;
next_abg = 1 + mttGetFieldLength(model,'abg') ;
for i = 1:mttGetFieldLength(class_model,'abg')
model.abg(next_abg) = class_model.abg(i) ;
model.abgs = class_model.abgs ;
next_abg = next_abg + 1 ;
end
class_model = mttDeleteField(class_model,'abg') ;
model.crs = class_model.crs ;
class_model = mttDeleteField(class_model,'crs') ;
model.cr_usage = class_model.cr_usage ;
class_model = mttDeleteField(class_model,'cr_usage') ;
model.abg(next_abg) = class_model ;
model = mttAppend(model,'abgs',{source}) ;
index = length(model.abgs) ;
mttNotify([' ...made "#',num2str(index),':',object.name.class,'" definition']) ;
mttWriteNewLine ;
end
object.abg = strmatch(source,model.abgs,'exact') ;
end
object.cr = [] ;
object.cr_item = [] ;
else
if isempty(model.crs)
existing_cr = [] ;
else
existing_cr = strmatch(source,model.crs,'exact') ;
end
if isempty(current_leaf)
cr_user = object_name ;
else
cr_user = [current_leaf,'/',object_name] ;
end
if isempty(existing_cr)
model = mttAppend(model,'crs',{source}) ;
N = length(model.crs) ;
model.cr_usage(N).obj{1} = cr_user ;
else
N = 1+length(model.cr_usage(existing_cr).obj) ;
model.cr_usage(existing_cr).obj{N} = cr_user ;
end
object.abg = [] ;
object.cr = strmatch(source,model.crs,'exact') ;
if isempty(object.name.item)
object.cr_item = mttDetachText(model.crs{object.cr},'/') ;
else
object.cr_item = object.name.item ;
end
end
object = mttDeleteField(object,'name') ;
object = mttDeleteField(object,'is_abg') ;
model = setfield(model,'obj',object_name,object) ;
end