summaryrefslogtreecommitdiff
path: root/CTB/ApplyCurrent2Port.m
diff options
context:
space:
mode:
Diffstat (limited to 'CTB/ApplyCurrent2Port.m')
-rw-r--r--CTB/ApplyCurrent2Port.m69
1 files changed, 69 insertions, 0 deletions
diff --git a/CTB/ApplyCurrent2Port.m b/CTB/ApplyCurrent2Port.m
new file mode 100644
index 0000000..6628714
--- /dev/null
+++ b/CTB/ApplyCurrent2Port.m
@@ -0,0 +1,69 @@
+function [I_port I_orig_port] = ApplyCurrent2Port(net, port, current, varargin)
+% function I_port = ApplyCurrent2Port(net, port, current, varargin)
+%
+% Apply a total current to a given port of your network
+%
+% arguments:
+% port: number of ports to apply the power to
+% current: applied total current
+%
+% output:
+% I_port: Total currents going into the ports
+%
+% See also: InitNetwork, SetPortTermination, AddElement2Port,
+% ApplyRFPower2Port
+%
+% ------
+% Cuicuit Toolbox (https://github.com/thliebig/CTB)
+% (c) Thorsten Liebig, 2013
+
+if (numel(port)>1)
+ I_port = zeros(net.numPorts,net.numFreq);
+ I_orig_port = zeros(net.numPorts,net.numFreq);
+ for n=1:numel(port)
+ [I_p I_op] = ApplyCurrent2Port(net, port(n), current(n), varargin{:});
+ I_port = I_port + I_p;
+ I_orig_port = I_orig_port + I_op;
+ end
+ return
+end
+
+if ((port<1) || (port>net.numPorts))
+ error 'invalid port number'
+end
+
+if (numel(current)==1)
+ current = current*ones(size(net.f))
+end
+
+if (numel(net.Z0)==1)
+ Z0 = net.Z0*ones(net.numPorts,1);
+else
+ Z0 = net.Z0;
+end
+
+z_term = net.z;
+for n=1:net.numPorts
+ z_term(n,n,:) = z_term(n,n,:) + Z0(n);
+end
+
+z_mat = z_term;
+z_mat(port,:,:) = [];
+z_mat(:,port,:) = [];
+
+port_other = 1:net.numPorts;
+port_other(port) = [];
+
+I_port(port,:) = current;
+
+for fn = 1:numel(net.f)
+ z_port_vec = -1*squeeze(z_term(port_other,port,fn));
+ I_port(port_other,fn) = squeeze(z_mat(:,:,fn))\z_port_vec * current(fn);
+end
+
+I_orig_port=I_port*0;
+for n=1:net.numPorts
+ C = reshape(net.ABCD{n}(2,1,:),1,numel(net.f));
+ D = reshape(net.ABCD{n}(2,2,:),1,numel(net.f));
+ I_orig_port(n,:) = (Z0(n)*C + D) .* I_port(n,:);
+end