function [bonds,status] = FMR_cause(bonds);
% Causality for Flow-modulated R component
%SUMMARY FMR: flow-modulated resistor
%DESCRIPTION Port[in]: a simple one port resistor
%DESCRIPTION Port[out]: flow provides modulation for the resistor
%DESCRIPTION Used with the lin CR, with parameters flow,r this gives
%DESCRIPTION a resistance r*f_m where f_m is the flow on port [out]
%DESCRIPTION Can be bicausal - deduces modulation from e and f on port[in]
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %% Version control history
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %% $Id$
% %% $Log$
% %% Revision 1.3 1996/11/01 11:53:48 peterg
% %% Documentation
% %%
% %% Revision 1.2 1996/08/30 13:29:05 peter
% %% Error check on bond numbers.
% %%
% %% Revision 1.1 1996/08/09 08:28:02 peter
% %% Initial revision
% %%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
status = -1;
% Check that there are exactly two bonds.
if check_bonds(bonds,2,'FMR')==0
return
end
% There are 2 ports; extract the information
e_1 = bonds(1,1);
f_1 = bonds(1,2);
e_2 = bonds(2,1);
f_2 = bonds(2,2);
% e_2 must be effort causality (imposes zero effort)
if e_2 == 1 % Conflict
status = 1;
else % Do the rest of the causality
if e_2==0 % Set to the fixed causality
e_2 = -1;
end;
number_set = sum(sum([e_1 f_1 f_2]~=zeros(1,3) ));
if number_set<2 % Under causal
status = -1;
elseif number_set==2 % Set the causality
if f_2 == -1 % Unicausal
if e_1 == 0
e_1 = f_1;
else
f_1 = e_1;
end;
elseif f_2 == 1 % Bicausal
e_1 = 1;
f_1 = -1;
elseif f_2 == 0
if e_1==f_1
f_2 = -1; % Unicausal
else
f_2 = 1; % Bicausal
end;
end;
status = 0;
elseif number_set==3 % Check the causality
if ( (f_2==-1)&(e_1~=f_1) )|( (f_2==1)&(e_1==f_1) )
status = 1;
else
status = 0;
end;
end;
end;
bonds = [e_1 f_1
e_2 f_2];