openEMS/matlab/AddMRStub.m

74 lines
2.3 KiB
Matlab

function CSX = AddMRStub( CSX, materialname, prio, MSL_width, len, alpha, resolution, orientation, normVector, position )
% CSX = AddMRStub( CSX, materialname, prio, MSL_width, len, alpha,
% resolution, orientation, normVector, position )
%
% Microstrip Radial Stub
%
% CSX: CSX-object created by InitCSX()
% materialname: property for the MSL (created by AddMetal() or AddMaterial())
% prio: priority
% MSL_width: width of the MSL to connect the stub to
% len: length of the radial stub
% alpha: angle subtended by the radial stub (degrees)
% resolution: discrete angle spacing (degrees)
% orientation: angle of main direction of the radial stub (degrees)
% normVector: normal vector of the stub
% position: position of the end of the MSL
%
% This radial stub definition is equivalent to the one Agilent ADS uses.
%
% example:
% CSX = AddMRStub( CSX, 'PEC', 10, 1000, 5900, 30, 1, -90, [0 0 1], [0 -10000 254] );
%
%
% Sebastian Held <sebastian.held@gmx.de>
% Jun 1 2010
%
% See also InitCSX AddMetal AddMaterial
% check normVector
if ~(normVector(1) == normVector(2) == 0) && ...
~(normVector(1) == normVector(3) == 0) && ...
~(normVector(2) == normVector(3) == 0) || (sum(normVector) == 0)
error 'normVector must have exactly one component ~= 0'
end
normVector = normVector ./ sum(normVector); % normVector is now a unit vector
% convert angles to radians
alpha_rad = alpha/180*pi;
orientation_rad = orientation/180*pi;
resolution_rad = resolution/180*pi;
%
% build stub at origin (0,0,0) and translate/rotate it later
%
D = 0.5 * MSL_width / sin(alpha_rad/2);
R = cos(alpha_rad/2) * D;
% point at the center of the MSL
p(1,1) = 0;
p(2,1) = -MSL_width/2;
p(1,2) = 0;
p(2,2) = MSL_width/2;
for a = alpha_rad/2 : -resolution_rad : -alpha_rad/2
p(1,end+1) = cos(a) * (D+len) - R;
p(2,end) = sin(a) * (D+len);
end
% rotate
rot = [cos(-orientation_rad), -sin(-orientation_rad); sin(-orientation_rad), cos(-orientation_rad)];
p = (p.' * rot).';
% translate
idx_elevation = [1 2 3];
idx_elevation = idx_elevation(normVector>0);
dim1 = mod( idx_elevation, 3 ) + 1;
dim2 = mod( idx_elevation+1, 3 ) + 1;
p(1,:) = p(1,:) + position(dim1);
p(2,:) = p(2,:) + position(dim2);
elevation = position(idx_elevation);
CSX = AddPolygon( CSX, materialname, prio, normVector, elevation, p );