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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
function RunOpenEMS(Sim_Path, Sim_File, opts, Settings)
% function RunOpenEMS(Sim_Path, Sim_File, <opts, Settings>)
%
% Run an openEMS simulation.
%
% arguments:
% Sim_Path: specifiy the simulation folder (folder must exist!)
% Sim_File: xml-filename to simulate, created by WriteOpenEMS
%
% optional arguments
%
% opts: list of openEMS options
% possible options:
% --disable-dumps Disable all field dumps for faster simulation
% --debug-material Dump material distribution to a vtk file for debugging
% --debug-PEC Dump metal distribution to a vtk file for debugging
% --debug-operator Dump operator to vtk file for debugging
% --debug-boxes Dump e.g. probe boxes to vtk file for debugging
% --debug-CSX Write CSX geometry file to debugCSX.xml
% --engine=<type> Choose engine type
% --engine=fastest fastest available engine (default)
% --engine=basic basic FDTD engine
% --engine=sse engine using sse vector extensions
% --engine=sse-compressed engine using compressed operator + sse vector extensions
% --engine=MPI engine using compressed operator + sse vector extensions + MPI parallel processing
% --engine=multithreaded engine using compressed operator + sse vector extensions + MPI + multithreading
% --numThreads=<n> Force use n threads for multithreaded engine
% --no-simulation only run preprocessing; do not simulate
% --dump-statistics dump simulation statistics to 'openEMS_run_stats.txt' and 'openEMS_stats.txt'
%
% Additional global arguments
% --showProbeDiscretization Show probe discretization information
% --nativeFieldDumps Dump all fields using the native field components
% -v,-vv,-vvv Set debug level: 1 to 3
%
%
% settings: list of Matlab settings
% possible settings:
% Settings.LogFile = 'openEMS.log'
% Settings.Silent = 0
%
% additional remote simulation settings
% Note: ssh only on unix with working ssh client or windows with putty client
% openEMS Linux server or Windows with cygwin necessary
% Settings.SSH.host = '<hostname or ip>'
% Settings.SSH.bin = '<path_to_openEMS>/openEMS.sh'
% ssh optional:
% Settings.SSH.host_list = {'list','of','hosts'}; %searches for a free host
% %on Windows needed additionally
% Settings.SSH.Putty.Path = '<path_to>\putty';
% Settings.SSH.Putty.Key = '<path_to>\putty_private_key.ppk';
%
% MPI settings:
% Settings.MPI.xxx --> help RunOpenEMS_MPI
%
%
% example:
% %create CSX and FDTD
% WriteOpenEMS('/tmp/path_to_run_in/myfile.xml', FDTD, CSX)
% RunOpenEMS('/tmp/path_to_run_in','myfile.xml','-v')
%
% See also WriteOpenEMS FindFreeSSH InitCSX InitFDTD RunOpenEMS_MPI
%
% openEMS matlab interface
% -----------------------
% author: Thorsten Liebig
if nargin < 2
error 'specify the Sim_Path and Sim_file to simulate'
end
if nargin < 3
opts = '';
end
if (nargin<4)
Settings = [];
end
if (isfield(Settings,'MPI') && isunix)
if (Settings.MPI.NrProc>1)
RunOpenEMS_MPI(Sim_Path, Sim_File, opts, Settings);
return;
end
end
ssh_command = 'ssh';
scp_command = 'scp';
scp_options = '';
ssh_options = '';
enable_ssh = 0;
enable_ssh = isfield(Settings,'SSH') && isunix;
if ~isunix
enable_ssh = isfield(Settings,'SSH') && isfield(Settings.SSH,'Putty');
if (enable_ssh)
ssh_command = [Settings.SSH.Putty.Path '/plink '];
ssh_options = [ssh_options ' -i ' Settings.SSH.Putty.Key];
scp_command = [Settings.SSH.Putty.Path '/pscp '];
scp_options = [scp_options ' -i ' Settings.SSH.Putty.Key];
end
end
savePath = pwd;
cd(Sim_Path);
if (enable_ssh)
scp_options = [scp_options ' -C'];
ssh_options = [ssh_options ' -x -C'];
% ssh options: no X forwarding; no password prompt (use pub keys!); no host checking
if (isunix)
ssh_options = [ssh_options ' -o "PasswordAuthentication no" -o "StrictHostKeyChecking no"'];
scp_options = [scp_options ' -o "PasswordAuthentication no" -o "StrictHostKeyChecking no"'];
end
if isfield(Settings.SSH,'host_list')
host = FindFreeSSH(Settings.SSH.host_list, Settings);
if ~isempty(host)
Settings.SSH.host = host;
else
error('openEMS:RunOpenEMS', 'unable to find host, abort openEMS');
end
end
% create a tmp working dir
[status, result] = system([ssh_command ' ' ssh_options ' ' Settings.SSH.host ' "mktemp -d /tmp/openEMS_XXXXXXXXXXXX"']);
if (status~=0)
disp(result);
error('openEMS:RunOpenEMS','mktemp failed to create tmp directory!');
end
ssh_work_path = strtrim(result); %remove tailing \n
disp(['Running remote openEMS on ' Settings.SSH.host ' at working dir: ' ssh_work_path]);
%copy openEMS all simulation files to the ssh host
[stat, res] = system([scp_command ' ' scp_options ' * ' Settings.SSH.host ':' ssh_work_path '/']);
if (stat~=0)
disp(res);
error('openEMS:RunOpenEMS','scp failed!');
end
%run openEMS (with log file if requested)
if isfield(Settings,'LogFile') && isunix
append_unix = [' 2>&1 | tee ' Settings.LogFile];
else
append_unix = [];
end
status = system([ssh_command ' ' ssh_options ' ' Settings.SSH.host ' "cd ' ssh_work_path ' && ' Settings.SSH.bin ' ' Sim_File ' ' opts '"' append_unix]);
if (status~=0)
disp(result);
error('openEMS:RunOpenEMS','ssh openEMS failed!');
end
disp( 'Remote simulation done... copying back results and cleaning up...' );
%copy back all results
[stat, res] = system([scp_command ' -r ' scp_options ' ' Settings.SSH.host ':' ssh_work_path '/* ' pwd '/']);
if (stat~=0);
disp(res);
error('openEMS:RunOpenEMS','scp failed!');
end
%cleanup
[stat, res] = system([ssh_command ' ' ssh_options ' ' Settings.SSH.host ' rm -r ' ssh_work_path]);
if (stat~=0);
disp(res);
warning('openEMS:RunOpenEMS','remote cleanup failed!');
end
else
args = ['"' Sim_File '" ' opts]
if isfield(Settings,'LogFile') && isfield(Settings,'Silent')
invoke_openEMS(args,['"' Settings.LogFile '"'],Settings.Silent);
elseif isfield(Settings,'LogFile')
invoke_openEMS(args,['"' Settings.LogFile '"']);
elseif isfield(Settings,'Silent')
invoke_openEMS(args,[],Settings.Silent);
else
invoke_openEMS(args);
end
end
cd(savePath);
return
|