summaryrefslogtreecommitdiff
path: root/openEMS/matlab/SetBoundaryCond.m
blob: fbfbd4c1ef7e80c1452c4a8d027a7ed05da713f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
function FDTD = SetBoundaryCond(FDTD, BC, varargin)
% FDTD = SetBoundaryCond(FDTD, BC, varargin)
%
% BC = [xmin xmax ymin ymax zmin zmax];
% or BC = {xmin xmax ymin ymax zmin zmax};
% ?min/?max: 
%   0 = PEC      or  'PEC'
%   1 = PMC      or  'PMC'
%   2 = MUR-ABC  or  'MUR'
%   3 = PML-ABC  or  'PML_x' with pml size x => 4..50
% 
% example:
% BC = [ 1     1     0     0     2     3     ]  %using numbers or
% BC = {'PMC' 'PMC' 'PEC' 'PEC' 'MUR' 'PML_8'}  %usign equivalent strings
%
% mur-abc definitions
% define a phase-velocity to be used by the mur-abc
% useful e.g. for dispersive waveguides
% FDTD = SetBoundaryCond(FDTD,BC,'MUR_PhaseVelocity',299792457.93272);
% 
% 
% pml definitions
% 	arguments:  'PML_Grading','gradFunction'
% 		Define the pml grading grading function.
% 		Predefined variables in this grading function are:
% 			D  = depth in the pml in meter
% 			dl = mesh delta inside the pml in meter
% 			W  = width (length) of the pml in meter
% 			N  = number of cells for the pml
% 			Z  = wave impedance at the current depth and position
% 
% example: 
% FDTD = SetBoundaryCond(FDTD,BC); 
% or
% FDTD = SetBoundaryCond(FDTD,BC,'PML_Grading','-log(1e-6)*log(2.5)/(2*dl*pow(2.5,W/dl)-1) * pow(2.5, D/dl) / Z');
%
% 
% openEMS matlab interface
% -----------------------
% author: Thorsten Liebig

if (numel(BC)~=6)
    error('openEMS:SetBoundaryCond','wrong number of boundary conditions');
end

if isnumeric(BC)
    FDTD.BoundaryCond.ATTRIBUTE.xmin=BC(1);
    FDTD.BoundaryCond.ATTRIBUTE.xmax=BC(2);
    FDTD.BoundaryCond.ATTRIBUTE.ymin=BC(3);
    FDTD.BoundaryCond.ATTRIBUTE.ymax=BC(4);
    FDTD.BoundaryCond.ATTRIBUTE.zmin=BC(5);
    FDTD.BoundaryCond.ATTRIBUTE.zmax=BC(6);
elseif iscell(BC)
    FDTD.BoundaryCond.ATTRIBUTE.xmin=BC{1};
    FDTD.BoundaryCond.ATTRIBUTE.xmax=BC{2};
    FDTD.BoundaryCond.ATTRIBUTE.ymin=BC{3};
    FDTD.BoundaryCond.ATTRIBUTE.ymax=BC{4};
    FDTD.BoundaryCond.ATTRIBUTE.zmin=BC{5};
    FDTD.BoundaryCond.ATTRIBUTE.zmax=BC{6};
else
    error('openEMS:SetBoundaryCond','unknown boundary condition type');
end


for n=1:(nargin-2)/2
    FDTD.BoundaryCond.ATTRIBUTE.(varargin{2*n-1}) = varargin{2*n};
end