summaryrefslogtreecommitdiff
path: root/openEMS/matlab/CalcNF2FF.m
blob: c80b52e4a9ff4f8f6048213c6ed6b4094a423092 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
function nf2ff = CalcNF2FF(nf2ff, Sim_Path, freq, theta, phi, varargin)
% function nf2ff = CalcNF2FF(nf2ff, Sim_Path, freq, theta, phi, varargin)
%
% Calculate the near-field to far-field transformation created by
% CreateNF2FFBox
%
% IMPORTANT:
% Make sure to define the correct nf2ff phase center, aka. central antenna
% position! See optional parameter below!! Default is [0 0 0]
%
% parameter:
% nf2ff:    data structure created by CreateNF2FFBox
% Sim_Path: path to simulation data
% freq:     array of frequencies to analyse
% theta,phi: spherical coordinates to evaluate the far-field on (in radians)
%
% optional paramater:
% 'Center': nf2ff phase center, default is [0 0 0]
%           !! Make sure the center is never outside of your nf2ff box!!
%           Definition is the correct coordinate system necessary
%           --> either Cartesian or cylindrical coordinates
% 'Mode':   'Mode', 0 -> read only, if data already exist (default)
%           'Mode', 1 -> calculate anyway, overwrite existing
%           'Mode', 2 -> read only, fail if not existing
% 'Outfile': alternative nf2ff result hdf5 file name
%            default is: <nf2ff.name>.h5
% 'Verbose': set verbose level for the nf2ff calculation 0-2 supported
% 'Radius':  specify the radius for the nf2ff
% 'Eps_r':   specify the relative electric permittivity for the nf2ff
% 'Mue_r':   specify the relative magnetic permeability for the nf2ff
%
% 'Mirror':  Add mirroring in a given direction (dir), with a given 
%            mirror type (PEC or PMC) and a mirror position in the given
%            direction.
%            Example: 'Mirror', {0, 'PMC', +100}
%
% See also: CreateNF2FFBox, ReadNF2FF
%
% openEMS matlab interface
% -----------------------
% author: Thorsten Liebig, 2012

mode = 0;

filename = nf2ff.name;
nf2ff_xml.Planes = {};

nf2ff_xml.ATTRIBUTE.Outfile = [filename '.h5'];

if (isfield(nf2ff,'Eps_r'))
    nf2ff_xml.ATTRIBUTE.Eps_r = nf2ff.Eps_r;
end
if (isfield(nf2ff,'Mue_r'))
    nf2ff_xml.ATTRIBUTE.Mue_r = nf2ff.Mue_r;
end

for n=1:2:numel(varargin)-1
    if (strcmp(varargin{n},'Mode'))
        mode = varargin{n+1};
    elseif (strcmp(varargin{n},'Mirror'))
        if isfield(nf2ff_xml,'Mirror')
            pos = length(nf2ff_xml.Mirror)+1;
        else
            pos = 1;
        end
        nf2ff_xml.Mirror{pos}.ATTRIBUTE.Dir=varargin{n+1}{1};
        nf2ff_xml.Mirror{pos}.ATTRIBUTE.Type=varargin{n+1}{2};
        nf2ff_xml.Mirror{pos}.ATTRIBUTE.Pos=varargin{n+1}{3};
    else
        nf2ff_xml.ATTRIBUTE.(varargin{n})=varargin{n+1};
    end
end

for (n=1:numel(nf2ff.filenames_E))
    if (nf2ff.directions(n)~=0)
        files_E = dir([Sim_Path '/*' nf2ff.filenames_E{n} '.h5']);
        files_H = dir([Sim_Path '/*' nf2ff.filenames_H{n} '.h5']);
        if (numel(files_E)~=numel(files_H))
            error 'number of E/H planes mismatch!'
        end
        for fn = 1:numel(files_E)
            nf2ff_xml.Planes{end+1}.ATTRIBUTE.E_Field = files_E(fn).name;
            nf2ff_xml.Planes{end}.ATTRIBUTE.H_Field = files_H(fn).name;
        end
    end
end

nf2ff_xml.ATTRIBUTE.freq = freq;
nf2ff_xml.theta = theta;
nf2ff_xml.phi = phi;

nf2ff.xml = [Sim_Path '' filesep '' filename '.xml'];
nf2ff.hdf5 = [Sim_Path '' filesep '' nf2ff_xml.ATTRIBUTE.Outfile];

% create nf2ff structure
struct_2_xml(nf2ff.xml,nf2ff_xml,'nf2ff');

m_filename = mfilename('fullpath');
dir_name = fileparts( m_filename );

if isunix
    nf2ff_bin = searchBinary('nf2ff', ...
    {[dir_name filesep '..' filesep 'nf2ff' filesep], ...
     [dir_name filesep '..' filesep '..' filesep '..' filesep 'bin' filesep]}, 0);
else
    nf2ff_bin = searchBinary('nf2ff.exe',[dir_name filesep '..' filesep], 0);
end

if ((exist(nf2ff.hdf5,'file') && (mode==0)) || (mode==2))
    disp('CalcNF2FF: Reading nf2ff data only...')
    nf2ff = ReadNF2FF(nf2ff);

    % verify read data
    if ( (vectorEqual(nf2ff.freq,freq)==0) || (vectorEqual(nf2ff.theta,theta)==0) || (vectorEqual(nf2ff.phi,phi)==0) )
        error('openEMS:CalcNF2FF','data mismatch between read and requested data --> recalculate nf2ff --> Set Mode to 1 ');
    end
    return;
end

savePath = pwd;
cd(Sim_Path);

try
    if (isempty(nf2ff_bin))
        error('openEMS:CalcNF2FF','nf2ff binary not found!');
    end
    if isunix
        % remove LD_LIBRARY_PATH set by matlab
        system(['export LD_LIBRARY_PATH=; ' nf2ff_bin ' ' filename '.xml']);
    else
        system([nf2ff_bin ' ' filename '.xml']);
    end
    nf2ff.hdf5;
    cd(savePath);
catch
    cd(savePath);
    error 'CalcNF2FF: failed'
end

nf2ff = ReadNF2FF(nf2ff);

% verify read data
if ( (vectorEqual(nf2ff.freq,freq)==0) || (vectorEqual(nf2ff.theta,theta)==0) || (vectorEqual(nf2ff.phi,phi)==0) )
    error('openEMS:CalcNF2FF','data mismatch between read and requested data --> THIS SHOULD NOT HAPPEN!');
end

function equal = vectorEqual(v1, v2, acc)
if (nargin<3)
    acc = 1e-6;
end

equal = 0;
if numel(v1)~=numel(v2)
    return;
end

if sum(abs((v1(:)-v2(:))/v1(:)) > acc)>0
    return;
end
equal = 1;
return