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 162
|
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
nf2ff_bin = '/usr/bin/nf2ff';
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
|