123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- 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
|