summaryrefslogtreecommitdiff
path: root/openEMS/matlab/AddLumpedPort.m
diff options
context:
space:
mode:
Diffstat (limited to 'openEMS/matlab/AddLumpedPort.m')
-rw-r--r--openEMS/matlab/AddLumpedPort.m129
1 files changed, 129 insertions, 0 deletions
diff --git a/openEMS/matlab/AddLumpedPort.m b/openEMS/matlab/AddLumpedPort.m
new file mode 100644
index 0000000..ad6d5fa
--- /dev/null
+++ b/openEMS/matlab/AddLumpedPort.m
@@ -0,0 +1,129 @@
+function [CSX, port] = AddLumpedPort( CSX, prio, portnr, R, start, stop, dir, excite, varargin )
+% [CSX, port] = AddLumpedPort( CSX, prio, portnr, R, start, stop, dir, excite, varargin )
+%
+% Add a lumped port as an excitation.
+%
+% A lumped port consists of an excitation, a lumped resistor, a voltage and
+% current probe.
+%
+% CSX: CSX-object created by InitCSX()
+% prio: priority for substrate and probe boxes
+% portnr: (integer) number of the port
+% R: internal resistance of the port (lumped element)
+% start: 3D start rowvector for port definition
+% stop: 3D end rowvector for port definition
+% dir: direction/amplitude of port (e.g.: [1 0 0], [0 1 0] or [0 0 1])
+% excite (optional): if true, the port will be switched on (see AddExcitation())
+% Note: for legacy support a string will be accepted
+% V_Probe_Weight: additional weigth for the voltage probes
+% I_Probe_Weight: additional weigth for the current probes
+% optional (key/values):
+% 'PortNamePrefix': an prefix to the port name
+% varargin (optional): additional excitations options, see also AddExcitation
+%
+% example:
+% start = [0 -width/2 0];
+% stop = [0 width/2 height];
+% [CSX] = AddLumpedPort(CSX, 5 ,1 , 50, start, stop, [0 0 1], true);
+% %this defines an active lumped port in z-direction with a 50 Ohm port impedence
+%
+% openEMS matlab interface
+% -----------------------
+% Sebastian Held <sebastian.held@gmx.de>
+% Jun 1 2010
+% Thorsten Liebig
+% Jul 13 2011
+%
+% See also InitCSX AddExcitation
+
+% check dir
+
+port.type='Lumped';
+port.nr=portnr;
+
+V_Probe_Weight = 1;
+I_Probe_Weight = 1;
+
+if (dir(1)~=0) && (dir(2) == 0) && (dir(3)==0)
+ n_dir = 1;
+elseif (dir(1)==0) && (dir(2) ~= 0) && (dir(3)==0)
+ n_dir = 2;
+elseif (dir(1)==0) && (dir(2) == 0) && (dir(3)~=0)
+ n_dir = 3;
+else
+ error 'dir must have exactly one component ~= 0'
+end
+
+PortNamePrefix = '';
+
+varargin_tmp = varargin;
+for n=1:2:numel(varargin_tmp)
+ if strcmpi('PortNamePrefix',varargin_tmp{n})
+ PortNamePrefix = varargin_tmp{n+1};
+ varargin([n n+1]) = [];
+ elseif strcmpi('V_Probe_Weight',varargin_tmp{n})
+ V_Probe_Weight = varargin_tmp{n+1};
+ elseif strcmpi('I_Probe_Weight',varargin_tmp{n})
+ I_Probe_Weight = varargin_tmp{n+1};
+ end
+end
+
+if (stop(n_dir)==start(n_dir))
+ error 'start/stop in excitation direction in must not be equal'
+end
+
+if (stop(n_dir)-start(n_dir)) > 0
+ direction = +1;
+else
+ direction = -1;
+end
+port.direction = direction;
+
+port.Feed_R = R;
+if (R>0 && (~isinf(R)))
+ CSX = AddLumpedElement(CSX,[PortNamePrefix 'port_resist_' int2str(portnr)], n_dir-1, 'Caps', 1, 'R', R);
+ CSX = AddBox(CSX,[PortNamePrefix 'port_resist_' int2str(portnr)], prio, start, stop);
+elseif (R<=0)
+ CSX = AddMetal(CSX,[PortNamePrefix 'port_resist_' int2str(portnr)]);
+ CSX = AddBox(CSX,[PortNamePrefix 'port_resist_' int2str(portnr)], prio, start, stop);
+end
+
+if (nargin < 8)
+ excite = false;
+end
+
+% legacy support, will be removed at some point
+if ischar(excite)
+ warning('CSXCAD:AddLumpedPort','depreceated: a string as excite option is no longer supported and will be removed in the future, please use true or false');
+ if ~isempty(excite)
+ excite = true;
+ else
+ excite = false;
+ end
+end
+
+port.excite = excite;
+% create excitation
+if (excite)
+ CSX = AddExcitation( CSX, [PortNamePrefix 'port_excite_' num2str(portnr)], 0, -dir*direction, varargin{:});
+ CSX = AddBox( CSX, [PortNamePrefix 'port_excite_' num2str(portnr)], prio, start, stop );
+end
+
+u_start = 0.5*(start + stop);
+u_stop = 0.5*(start + stop);
+u_start(n_dir) = start(n_dir);
+u_stop(n_dir) = stop(n_dir);
+
+port.U_filename = [PortNamePrefix 'port_ut' int2str(portnr)];
+CSX = AddProbe(CSX, port.U_filename, 0, 'weight', -direction*V_Probe_Weight);
+CSX = AddBox(CSX, port.U_filename, prio, u_start, u_stop);
+
+i_start = start;
+i_stop = stop;
+i_start(n_dir) = 0.5*(start(n_dir)+stop(n_dir));
+i_stop(n_dir) = 0.5*(start(n_dir)+stop(n_dir));
+
+port.I_filename = [PortNamePrefix 'port_it' int2str(portnr)];
+CSX = AddProbe(CSX, port.I_filename, 1, 'weight', direction*I_Probe_Weight, 'NormDir', n_dir-1);
+CSX = AddBox(CSX, port.I_filename, prio, i_start, i_stop);
+