matlab: port API changed, excitation now with automatic name

- some tutorial examples updated

Signed-off-by: Thorsten Liebig <Thorsten.Liebig@gmx.de>
pull/1/head
Thorsten Liebig 2012-10-29 15:34:21 +01:00
parent 211e7170e4
commit 89edc9eb25
5 changed files with 88 additions and 55 deletions

View File

@ -1,5 +1,5 @@
function [CSX,port] = AddCurvePort( CSX, prio, portnr, R, start, stop, excitename )
%[CSX,port] = AddCurvePort( CSX, prio, portnr, R, start, stop [, excitename] )
function [CSX,port] = AddCurvePort( CSX, prio, portnr, R, start, stop, excite, varargin )
%[CSX,port] = AddCurvePort( CSX, prio, portnr, R, start, stop [, excite, varargin] )
%
% Creates a curve port (1-dimensional).
% The mesh must already be initialized.
@ -11,7 +11,9 @@ function [CSX,port] = AddCurvePort( CSX, prio, portnr, R, start, stop, excitenam
% R: internal resistance of the port
% start: 3D start rowvector for port definition
% stop: 3D end rowvector for port definition
% excitename (optional): if specified, the port will be switched on (see AddExcitation())
% excite (optional): if true, the port will be switched on (see AddExcitation())
% Note: for legacy support a string will be accepted
% varargin (optional): additional excitations options, see also AddExcitation
%
% output:
% CSX:
@ -137,12 +139,26 @@ port.drawingunit = unit;
% port.idx1 = idx1;
port.excite = 0;
if (nargin < 7)
excite = false;
end
% legacy support, will be removed at some point
if ischar(excite)
warning('CSXCAD:AddCurvePort','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
% create excitation
if (nargin >= 7) && ~isempty(excitename)
if (excite)
% excitation of this port is enabled
port.excite = 1;
e_start = v_start;
e_stop = v_stop;
CSX = AddExcitation( CSX, excitename, 0, start_idx ~= stop_idx );
CSX = AddBox( CSX, excitename, prio, e_start, e_stop );
CSX = AddExcitation( CSX, ['port_excite_' num2str(portnr)], 0, start_idx ~= stop_idx, varargin{:});
CSX = AddBox( CSX, ['port_excite_' num2str(portnr)], prio, e_start, e_stop );
end

View File

@ -1,5 +1,5 @@
function [CSX] = AddLumpedPort( CSX, prio, portnr, R, start, stop, dir, excitename, varargin )
% [CSX] = AddLumpedPort( CSX, prio, portnr, R, start, stop, dir, excitename, varargin )
function [CSX] = AddLumpedPort( CSX, prio, portnr, R, start, stop, dir, excite, varargin )
% [CSX] = AddLumpedPort( CSX, prio, portnr, R, start, stop, dir, excite, varargin )
%
% Add a 3D lumped port as an excitation.
%
@ -10,7 +10,8 @@ function [CSX] = AddLumpedPort( CSX, prio, portnr, R, start, stop, dir, excitena
% 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])
% excitename (optional): if specified, the port will be switched on (see AddExcitation())
% excite (optional): if true, the port will be switched on (see AddExcitation())
% Note: for legacy support a string will be accepted
% varargin (optional): additional excitations options, see also AddExcitation
%
% example:
@ -58,10 +59,25 @@ elseif (R<=0)
CSX = AddBox(CSX,['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
% create excitation
if (nargin >= 8) && ~isempty(excitename)
CSX = AddExcitation( CSX, excitename, 0, -dir*direction, varargin{:});
CSX = AddBox( CSX, excitename, prio, start, stop );
if (excite)
CSX = AddExcitation( CSX, ['port_excite_' num2str(portnr)], 0, -dir*direction, varargin{:});
CSX = AddBox( CSX, ['port_excite_' num2str(portnr)], prio, start, stop );
end
u_start = 0.5*(start + stop);

View File

@ -11,7 +11,8 @@ function [CSX,port] = AddMSLPort( CSX, prio, portnr, materialname, start, stop,
% evec: excitation vector, which defines the direction of the e-field (must be the same as used in AddExcitation())
%
% variable input:
% 'ExcitePort' necessary excitation name to make the port an active feeding port
% 'ExcitePort' true/false to make the port an active feeding port (default
% is false)
% 'FeedShift' shift to port from start by a given distance in drawing
% units. Default is 0. Only active if 'ExcitePort' is set!
% 'Feed_R' Specifiy a lumped port resistance. Default is no lumped
@ -66,35 +67,41 @@ n_conv_arg = 8; % number of conventional arguments
%set defaults
feed_shift = 0;
feed_R = 0;
excitename = '';
excite = false;
measplanepos = nan;
if (nargin>n_conv_arg)
for n=1:2:(nargin-n_conv_arg)
if (strcmp(varargin{n},'FeedShift')==1);
feed_shift = varargin{n+1};
if (numel(feed_shift)>1)
error 'FeedShift must be a scalar value'
excite_args = {};
for n=1:2:numel(varargin)
if (strcmp(varargin{n},'FeedShift')==1);
feed_shift = varargin{n+1};
if (numel(feed_shift)>1)
error 'FeedShift must be a scalar value'
end
elseif (strcmp(varargin{n},'Feed_R')==1);
feed_R = varargin{n+1};
if (numel(feed_shift)>1)
error 'Feed_R must be a scalar value'
end
elseif (strcmp(varargin{n},'MeasPlaneShift')==1);
measplanepos = varargin{n+1};
if (numel(feed_shift)>1)
error 'MeasPlaneShift must be a scalar value'
end
elseif (strcmp(varargin{n},'ExcitePort')==1);
if ischar(varargin{n+1})
warning('CSXCAD:AddMSLPort','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
else
excite = varargin{n+1};
end
if (strcmp(varargin{n},'Feed_R')==1);
feed_R = varargin{n+1};
if (numel(feed_shift)>1)
error 'Feed_R must be a scalar value'
end
end
if (strcmp(varargin{n},'MeasPlaneShift')==1);
measplanepos = varargin{n+1};
if (numel(feed_shift)>1)
error 'MeasPlaneShift must be a scalar value'
end
end
if (strcmp(varargin{n},'ExcitePort')==1);
excitename = varargin{n+1};
end
else
excite_args{end+1} = varargin{n};
excite_args{end+1} = varargin{n+1};
end
end
@ -227,9 +234,9 @@ ex_stop(idx_prop) = ex_start(idx_prop);
ex_stop(idx_width) = nstop(idx_width);
ex_stop(idx_height) = nstop(idx_height);
if ~isempty(excitename)
CSX = AddExcitation( CSX, excitename, 0, evec );
CSX = AddBox( CSX, excitename, prio, ex_start, ex_stop );
if excite
CSX = AddExcitation( CSX, ['port_excite_' num2str(portnr)], 0, evec, excite_args{:} );
CSX = AddBox( CSX, ['port_excite_' num2str(portnr)], prio, ex_start, ex_stop );
end
if feed_R > 0
CSX = AddLumpedElement( CSX, 'port_R', idx_height-1, 'R', feed_R );

View File

@ -51,7 +51,7 @@ CSX = AddBox( CSX, 'RO4350B', 0, start, stop );
CSX = AddMetal( CSX, 'PEC' );
portstart = [ mesh.x(1), -MSL_width/2, substrate_thickness];
portstop = [ 0, MSL_width/2, 0];
[CSX,portstruct{1}] = AddMSLPort( CSX, 999, 1, 'PEC', portstart, portstop, 0, [0 0 -1], 'ExcitePort', 'excite', 'FeedShift', 10*resolution, 'MeasPlaneShift', MSL_length/3);
[CSX,portstruct{1}] = AddMSLPort( CSX, 999, 1, 'PEC', portstart, portstop, 0, [0 0 -1], 'ExcitePort', true, 'FeedShift', 10*resolution, 'MeasPlaneShift', MSL_length/3);
portstart = [mesh.x(end), -MSL_width/2, substrate_thickness];
portstop = [0 , MSL_width/2, 0];

View File

@ -49,21 +49,15 @@ FDTD = SetBoundaryCond( FDTD, BC );
%% setup CSXCAD geometry & mesh
% currently, openEMS cannot automatically generate a mesh
max_res = c0 / (f0+fc) / unit / 20; % cell size: lambda/20
CSX = InitCSX();
%create fixed lines for the simulation box, substrate and port
mesh.x = [-SimBox(1)/2 SimBox(1)/2 -substrate.width/2 substrate.width/2 -patch.width/2 patch.width/2 feed.pos+[-feed.width/2 feed.width/2]];
mesh.x = SmoothMeshLines( mesh.x, max_res, 1.4); % create a smooth mesh between specified fixed mesh lines
mesh.y = [-SimBox(2)/2 SimBox(2)/2 -substrate.length/2 substrate.length/2 -feed.width/2 feed.width/2 -patch.length/2 patch.length/2];
mesh.y = SmoothMeshLines( mesh.y, max_res, 1.4 );
%create fixed lines for the simulation box and given number of lines inside the substrate
mesh.z = [-SimBox(3)/3 linspace(0,substrate.thickness,substrate.cells) SimBox(3)*2/3 ];
mesh.z = SmoothMeshLines( mesh.z, max_res, 1.4 );
CSX = DefineRectGrid( CSX, unit, mesh );
mesh.x = [-SimBox(1)/2 SimBox(1)/2 -substrate.width/2 substrate.width/2 -patch.width/2 patch.width/2 feed.pos+[-feed.width/2 feed.width/2]];
mesh.y = [-SimBox(2)/2 SimBox(2)/2 -substrate.length/2 substrate.length/2 -feed.width/2 feed.width/2 -patch.length/2 patch.length/2];
mesh.z = [-SimBox(3)/3 SimBox(3)*2/3 linspace(0,substrate.thickness,substrate.cells) ];
% generate a smooth mesh with max. cell size: lambda_min / 20
mesh = SmoothMesh(mesh, c0 / (f0+fc) / unit / 20);
CSX = DefineRectGrid(CSX, unit, mesh);
%% create patch
CSX = AddMetal( CSX, 'patch' ); % create a perfect electric conductor (PEC)
@ -87,7 +81,7 @@ CSX = AddBox(CSX,'gnd',10,start,stop);
%% apply the excitation & resist as a current source
start = [feed.pos-feed.width/2 -feed.width/2 0];
stop = [feed.pos+feed.width/2 +feed.width/2 substrate.thickness];
[CSX] = AddLumpedPort(CSX, 5 ,1 ,feed.R, start, stop, [0 0 1], 'excite');
[CSX] = AddLumpedPort(CSX, 5 ,1 ,feed.R, start, stop, [0 0 1], true);
%%nf2ff calc
start = [mesh.x(4) mesh.y(4) mesh.z(4)];