summaryrefslogtreecommitdiff
path: root/openEMS/matlab/optimizer_asco_sim.m
diff options
context:
space:
mode:
Diffstat (limited to 'openEMS/matlab/optimizer_asco_sim.m')
-rw-r--r--openEMS/matlab/optimizer_asco_sim.m88
1 files changed, 88 insertions, 0 deletions
diff --git a/openEMS/matlab/optimizer_asco_sim.m b/openEMS/matlab/optimizer_asco_sim.m
new file mode 100644
index 0000000..6f62ebf
--- /dev/null
+++ b/openEMS/matlab/optimizer_asco_sim.m
@@ -0,0 +1,88 @@
+function optimizer_asco_sim( optimdir, inputfile, outputfile, simfun )
+%optimizer_asco_sim( optimdir, inputfile, outputfile, simfun )
+%
+% This function is called from general.sh. Do not call it yourself.
+%
+% tasks:
+% - set correct matlab path
+% - evaluate inputfile
+% - start simulation or get result from cache
+% - postprocess simulation results
+% - create output file (important: needs single \n at the first line and double \n at the last line!)
+
+error( nargchk(4,4,nargin) );
+
+% add CSXCAD and openEMS to the matlab path
+folder = fileparts( mfilename('fullpath') );
+addpath( folder );
+addpath( [folder '/../../CSXCAD/matlab'] );
+
+% change to optimdir
+olddir = pwd;
+cd( optimdir );
+
+% read parameters set by asco
+if ~isempty( strfind(inputfile,'-') )
+ % matlab cannot execute a file with dashes...
+ inputfile2 = strrep( inputfile,'-','_' );
+ movefile( [inputfile '.m'], [inputfile2 '.m'] );
+ run( inputfile2 );
+ movefile( [inputfile2 '.m'], [inputfile '.m'] );
+end
+% now a structure named 'params' is available
+
+% check cache
+folder = create_folder_name( params );
+if exist( ['./' folder], 'dir' ) && exist( ['./' folder '/result.mat'], 'file' )
+ % read cache
+ disp( 'CACHE HIT' );
+ result = load( [folder '/result.mat'], 'result' );
+ result = result.result;
+else
+ % start simulation in folder <folder>
+ disp( ['starting simulation function ' simfun] );
+ disp( [' simulation folder ' folder] );
+ [simfun_folder,simfun] = fileparts(simfun);
+ oldpath = path;
+ addpath( simfun_folder );
+ fhandle = str2func(simfun); % does not work for octave-3.2.4!
+ path( oldpath );
+ mkdir( folder );
+ result = fhandle(folder,params);
+ save( [folder '/result.mat'], 'result', '-mat' );
+end
+
+% write results for asco
+fid = fopen( outputfile, 'wt' );
+fprintf( fid, '\nvalue= %e\n\n', result );
+fclose( fid );
+
+% update best result
+best = [];
+best.result = result;
+best.params = params;
+if exist( [pwd '/best_result.mat'], 'file' )
+ old = load( 'best_result.mat', 'best' );
+ if old.best.result > best.result
+ save( 'best_result.mat', 'best', '-mat' );
+ end
+else
+ save( 'best_result.mat', 'best', '-mat' );
+end
+
+% restore old folder
+cd( olddir );
+
+
+
+
+
+
+
+function folder = create_folder_name( params )
+params = orderfields( params );
+folder = 'opt';
+fnames = fieldnames(params);
+for n=1:numel(fnames)
+ folder = [folder '_' fnames{n} '=' num2str(params.(fnames{n}))];
+end