function model = mttEmbedAcausalBondgraph(model,component,system) source = model.abg(component) ; if nargin==2 is_root_model = 1 ; target = model ; else is_root_model = 0 ; target = model.abg(system) ; end source_objects = mttGetFieldNames(source,'obj') ; target_objects = mttGetFieldNames(target,'obj') ; for n = 1:length(target_objects) target_object_name = target_objects{n} ; target_object = getfield(target,'obj',target_object_name) ; here = [mttDetachText(target.source,'/'),'/',target_object_name] ; is_abg_instance = 0 ; if ~isempty(target_object.abg) is_abg_instance = target_object.abg==component ; end if is_abg_instance target_object.sympar = source.sympar ; target_object.numpar = source.numpar ; target_object.input = source.input ; target_object.sympar_default = source.sympar_default ; target_object.numpar_default = source.numpar_default ; target_object.input_default = source.input_default ; declarations = length(target_object.sympar) ; values = length(target_object.parameter) ; mttAssert(declarations==values,['Mismatched parameters in object ',here]) ; number_of_target_ports = mttGetFieldLength(target_object,'interface') ; found_target_port = [] ; target_ports_found = [] ; for i = 1:number_of_target_ports target_port_name = target_object.interface(i).name ; target_inbond = target_object.interface(i).in ; target_outbond = target_object.interface(i).out ; is_inline = (~isempty(target_inbond) & ~isempty(target_outbond)) ; next = 0 ; found_target_port(i) = 0 ; matching = 1 ; while matching next = next + 1 ; source_object_name = source_objects{next} ; source_object = getfield(source,'obj',source_object_name) ; if ismember(source_object.class,{'SS','Se','Sf','De','Df'}) source_port_name = source_object_name ; if is_inline source_interface = getfield(source,'obj',source_port_name,'interface') ; inport_found = 0 ; if ~isempty(source_interface.in) inport_found = strcmp(source_port_name,[target_port_name,'_in']) ; end outport_found = 0 ; if ~isempty(source_interface.out) outport_found = strcmp(source_port_name,[target_port_name,'_out']) ; end found_target_port(i) = inport_found | outport_found ; else found_target_port(i) = strcmp(source_port_name,target_port_name) ; end end if found_target_port(i) if isempty(target_ports_found) target_ports_found = {target_port_name} ; else target_ports_found = [target_ports_found, {target_port_name}] ; end matching = 0 ; else matching = (next<length(source_objects)) ; end end mttAssert(found_target_port(i),... ['Unmatched port "',target_object_name,'[',target_port_name,']"']) ; source_object = getfield(source,'obj',source_port_name) ; source_inbond = source_object.interface.in ; source_outbond = source_object.interface.out ; source_class = source_object.class ; source_domain = source_object.domain ; source_domain_item = source_object.domain_item ; is_inward_compatible = ~xor(isempty(target_inbond),isempty(source_outbond)) ; is_outward_compatible = ~xor(isempty(target_outbond),isempty(source_inbond)) ; is_compatible = is_inward_compatible & is_outward_compatible ; mttAssert(is_compatible,... ['Incompatible bond connections at port "',... target_object_name,'[',target_port_name,']"']) ; target_object = setfield(target_object,'interface',{i},'map','in',source_outbond) ; target_object = setfield(target_object,'interface',{i},'map','out',source_inbond) ; target_object = setfield(target_object,'interface',{i},'class',source_class) ; target_object = setfield(target_object,'interface',{i},'domain',source_domain) ; target_object = setfield(target_object,'interface',{i},'domain_item',source_domain_item) ; end number_of_target_ports_found = sum(found_target_port) ; mttAssert(number_of_target_ports_found==number_of_target_ports,... ['Mismatched ports in "',target_object_name,'"']) ; for i = 1:length(source_objects) source_object_name = source_objects{i} ; if ~ismember(source_object_name,target_ports_found) source_object = getfield(source,'obj',source_object_name) ; source_object = mttDeleteField(source_object,'cr_item') ; target_object = setfield(target_object,'obj',source_object_name,source_object) ; end end source_bond_list = getfield(source,'bond') ; target_object = setfield(target_object,'bond',source_bond_list) ; target = setfield(target,'obj',target_object_name,target_object) ; end end if is_root_model model = target ; else if ~isempty(target.invokes) invoked_abgs = target.invokes ; other_abgs = target.invokes(invoked_abgs~=component) ; if isempty(other_abgs) target.invokes = [] ; else target.invokes = other_abgs ; end end model.abg(system) = target ; end