90 lines
3.2 KiB
Matlab
90 lines
3.2 KiB
Matlab
|
function [CSX,port] = AddRectWaveGuidePort( CSX, prio, portnr, start, stop, dir, a, b, mode_name, exc_amp, varargin )
|
||
|
% function [CSX,port] = AddRectWaveGuidePort( CSX, prio, portnr, start, stop, dir, a, b, mode_name, exc_amp, varargin )
|
||
|
%
|
||
|
% Create a rectangular waveguide port, including an optional excitation and probes
|
||
|
%
|
||
|
% Note: - The excitation will be located at the start position in the given direction
|
||
|
% - The voltage and current probes at the stop position in the given direction
|
||
|
%
|
||
|
% input:
|
||
|
% CSX: complete CSX structure (must contain a mesh)
|
||
|
% prio: priority of primitives
|
||
|
% start: start coordinates of waveguide port box
|
||
|
% stop: stop coordinates of waveguide port box
|
||
|
% dir: direction of port (0/1/2 for x/y/z-direction)
|
||
|
% a,b: rectangular waveguide width and height (in meter)
|
||
|
% mode_name: mode name, e.g. 'TE11' or 'TM21'
|
||
|
% exc_amp: excitation amplitude (set 0 to be passive)
|
||
|
% varargin: optional additional excitations options, see also AddExcitation
|
||
|
%
|
||
|
% output:
|
||
|
% CSX: modified CSX structure
|
||
|
% port: port structure to use with calcPort
|
||
|
%
|
||
|
% example:
|
||
|
% % create a TE10 circular waveguide mode, using cylindircal coordinates
|
||
|
% start=[mesh.r(1) mesh.a(1) 0 ];
|
||
|
% stop =[mesh.r(end) mesh.a(end) 100];
|
||
|
% [CSX,port] = AddCircWaveGuidePort( CSX, 99, 1, start, stop, 320e-3, 'TE11', 0, 1);
|
||
|
%
|
||
|
% openEMS matlab interface
|
||
|
% -----------------------
|
||
|
% (c) 2013 Thorsten Liebig (thorsten.liebig@gmx.de)
|
||
|
%
|
||
|
% See also InitCSX, AddExcitation, calcWGPort, calcPort
|
||
|
|
||
|
if (~strcmpi(mode_name(1:2),'TE'))
|
||
|
error 'currently only TE type modes are supported'
|
||
|
end
|
||
|
|
||
|
if (nargin<10)
|
||
|
exc_amp = 0;
|
||
|
end
|
||
|
|
||
|
m = str2double(mode_name(3));
|
||
|
n = str2double(mode_name(4));
|
||
|
|
||
|
% values by David M. Pozar, Microwave Engineering, third edition
|
||
|
kc = sqrt((m*pi/a)^2 + (n*pi/b)^2);
|
||
|
|
||
|
if ~isfield(CSX,'RectilinearGrid')
|
||
|
error 'mesh needs to be defined! Use DefineRectGrid() first!';
|
||
|
if (~isfield(CSX.RectilinearGrid,'XLines') || ~isfield(CSX.RectilinearGrid,'YLines') || ~isfield(CSX.RectilinearGrid,'ZLines'))
|
||
|
error 'mesh needs to be defined! Use DefineRectGrid() first!';
|
||
|
end
|
||
|
end
|
||
|
|
||
|
unit = CSX.RectilinearGrid.ATTRIBUTE.DeltaUnit;
|
||
|
kc_draw = kc*unit;
|
||
|
|
||
|
dir_names={'x','y','z'};
|
||
|
|
||
|
dirP = mod((dir+1),3)+1;
|
||
|
dirPP = mod((dir+2),3)+1;
|
||
|
nameX = ['(' dir_names{dirP} '-' num2str(start(dirP)) ')'];
|
||
|
nameY = ['(' dir_names{dirPP} '-' num2str(start(dirPP)) ')'];
|
||
|
|
||
|
%convert a&b to drawing units
|
||
|
a = a/unit;
|
||
|
b = b/unit;
|
||
|
% functions by David M. Pozar, Microwave Engineering, third edition
|
||
|
% electric field mode profile
|
||
|
func_Ex = [num2str( n/b) '*cos(' num2str(m*pi/a) '*' nameX ')*sin(' num2str(n*pi/b) '*' nameY ')'];
|
||
|
func_Ey = [num2str(-m/a) '*sin(' num2str(m*pi/a) '*' nameX ')*cos(' num2str(n*pi/b) '*' nameY ')'];
|
||
|
|
||
|
% magnetic field mode profile
|
||
|
func_Hx = [num2str(m/a) '*sin(' num2str(m*pi/a) '*' nameX ')*cos(' num2str(n*pi/b) '*' nameY ')'];
|
||
|
func_Hy = [num2str(n/b) '*cos(' num2str(m*pi/a) '*' nameX ')*sin(' num2str(n*pi/b) '*' nameY ')'];
|
||
|
|
||
|
|
||
|
func_E{dir+1} = 0;
|
||
|
func_E{dirP} = func_Ex;
|
||
|
func_E{dirPP} = func_Ey;
|
||
|
|
||
|
func_H{dir+1} = 0;
|
||
|
func_H{dirP} = func_Hx;
|
||
|
func_H{dirPP} = func_Hy;
|
||
|
|
||
|
[CSX,port] = AddWaveGuidePort( CSX, prio, portnr, start, stop, dir, func_E, func_H, kc, exc_amp, varargin{:} );
|
||
|
|