From 193c7fe6fc63b3bbaffe83bf261f1b8062bfa0ed Mon Sep 17 00:00:00 2001
From: Olivier Sauter <olivier.sauter@epfl.ch>
Date: Mon, 13 May 2019 08:21:28 +0000
Subject: [PATCH] finished implementing and testing
 torbeam_prepare_inputs_and_run and related functions, will test reading
 TORBEAM angles from shotfile from Giovanni

git-svn-id: https://spcsvn.epfl.ch/repos/TCV/gdat/trunk@11874 d63d8f72-b253-0410-a779-e742ad2e26cf
---
 crpptbx/AUG/torbeam_prepare_inputs_and_run.m | 71 +++++++++++---------
 1 file changed, 41 insertions(+), 30 deletions(-)

diff --git a/crpptbx/AUG/torbeam_prepare_inputs_and_run.m b/crpptbx/AUG/torbeam_prepare_inputs_and_run.m
index 9925badf..34cad038 100644
--- a/crpptbx/AUG/torbeam_prepare_inputs_and_run.m
+++ b/crpptbx/AUG/torbeam_prepare_inputs_and_run.m
@@ -3,6 +3,11 @@ function [torbeam_out,torbeam_in,varargout] = torbeam_prepare_inputs_and_run(sho
 % [torbeam_out,torbeam_in,varargout] = aaa(shot,times_in,varargin);
 % 
 % varargin{1}: torbeam_in (from a previous run, so avoids to reload all the data)
+%              leave then times_in empty to rerun at all times in torbeam_in.inbeam.t_some_beam_on or select times points from that array
+%
+% Examples:
+%       [torbeam_out,torbeam_in] = torbeam_prepare_inputs_and_run(30594,linpace(0,10,101));
+%       [torbeam_out2] = torbeam_prepare_inputs_and_run(30594,torbeam_in.inbeam.t_some_beam_on(1:30:end),torbeam_in); % to rerun a few cases
 %
 
 if nargin==0 || isempty(shot)
@@ -32,8 +37,8 @@ else
 end
 
 % base all times on Te data (most important? although ne as well), note take Thomson by default to avoid cut-off
-if ~exist('times_for_torbeam_eff') || isempty(times_for_torbeam_eff),
-  times_for_torbeam_eff = torbeam_in.nete.fit.t;
+if doload && (~exist('times_for_torbeam_eff') || isempty(times_for_torbeam_eff)),
+  times_for_torbeam_eff = torbeam_in.nete.fit.t(torbeam_in.nete.fit.t>0);
 end
 % load beam releated data including theta,phi in torbeam reference
 if doload, 
@@ -47,12 +52,16 @@ end
 % if torbeam_in provided as input (with its own time input sequence) and times_in provided as well: need to adapt times_in to match available inputs
 % (otherwise would take closest eqdsk)
 if doload==0
-  times_for_torbeam_eff = intersect(torbeam_in.inbeam.t_some_beam_on,times_for_torbeam_eff);
-else
-  times_for_torbeam_eff = torbeam_in.inbeam.t_some_beam_on;
+  if ~isempty(times_for_torbeam_eff)
+    times_for_torbeam_eff = intersect(torbeam_in.inbeam.t_some_beam_on,times_for_torbeam_eff);
+  else
+    times_for_torbeam_eff = torbeam_in.inbeam.t_some_beam_on;
+  end
 end
 if doload,
   torbeam_in.eqd_all=gdat(shot,'eqdsk','time',torbeam_in.inbeam.t_some_beam_on,'write',0);
+  torbeam_in.dir_torbeam = ['/tmp/' getenv('USER') '/' num2str(shot) '_torbeam'];
+  unix(['mkdir ' torbeam_in.dir_torbeam]);
 else
   if ~isfield(torbeam_in,'eqd_all') || isempty(torbeam_in.eqd_all)
     error('expects eqd_all as field of torbeam_in (varargin{1}) from gdat(shot,''eqdsk'',''time'',torbeam_in.inbeam.t_some_beam_on,''write'',0);')
@@ -65,8 +74,6 @@ if doload,
   nb_points_prof = 46;
   rhofit = linspace(0,1,nb_points_prof);
   
-  dir_torbeam = ['/tmp/' getenv('USER') '/' num2str(shot) '_torbeam'];
-  unix(['mkdir ' dir_torbeam]);
   tb_par_fields=fieldnames(torbeam_in.inbeam.tb_par);
 
   itime_te = iround_os(torbeam_in.nete.fit.t,times_for_torbeam_eff);
@@ -77,7 +84,7 @@ if doload,
   for it=1:length(torbeam_in.inbeam.t_some_beam_on)
     % Te
     it_te = itime_te(it);
-    torbeam_in.fname{it}.te = fullfile(dir_torbeam,['Te' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it)) '.dat']);
+    torbeam_in.fname{it}.te = fullfile(torbeam_in.dir_torbeam,['Te' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it)) '.dat']);
     fid=fopen(torbeam_in.fname{it}.te,'w'); % te.dat file etc per time
     fprintf(fid,'%d\n',nb_points_prof);
     % tefit = interpos(torbeam_in.nete.fit.rhopolnorm(:,it_te) , torbeam_in.nete.fit.te.data(:,it_te),rhofit,-1,[1 2],[0 0]);
@@ -87,7 +94,7 @@ if doload,
     fclose(fid);
     % ne
     it_ne = itime_ne(it);
-    torbeam_in.fname{it}.ne = fullfile(dir_torbeam,['ne' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it)) '.dat']);
+    torbeam_in.fname{it}.ne = fullfile(torbeam_in.dir_torbeam,['ne' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it)) '.dat']);
     fid=fopen(torbeam_in.fname{it}.ne,'w'); % ne.dat file etc per time
     fprintf(fid,'%d\n',nb_points_prof);
     nefit = interpos(torbeam_in.nete.fit.rhopolnorm(:,it_ne) , torbeam_in.nete.fit.ne.data(:,it_ne),rhofit,-0.1,[1 0],[0 0]);
@@ -99,7 +106,7 @@ if doload,
     eqd_with_b2=eqdsk_cocos_transform(torbeam_in.eqd_all.eqdsk{it},[17 cocos_out]);
     eqd_with_b1=eqdsk_transform(eqd_with_b2,65,129,-0.1);
     eqd_with_b = read_eqdsk(eqd_with_b1,cocos_out,1); % to compute BR, etc
-    torbeam_in.fname{it}.topfile = fullfile(dir_torbeam,['topfile' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it))]);
+    torbeam_in.fname{it}.topfile = fullfile(torbeam_in.dir_torbeam,['topfile' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it))]);
     fid=fopen(torbeam_in.fname{it}.topfile,'w');
     fprintf(fid,'%s %d %.6f\n',' Number of radial and vertical grid points in ',shot,torbeam_in.inbeam.t_some_beam_on(it));
     fprintf(fid,'%d %d\n',length(eqd_with_b.rmesh),length(eqd_with_b.zmesh));
@@ -133,7 +140,7 @@ if doload,
     
     % extract beam info at given time
     for ibeam=find(torbeam_in.inbeam.beam_on(:,it_inb(it)))',
-      torbeam_in.fname{it}.inbeam{ibeam} = fullfile(dir_torbeam,['inbeam' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it)) 'g' num2str(ibeam) '.dat']);
+      torbeam_in.fname{it}.inbeam{ibeam} = fullfile(torbeam_in.dir_torbeam,['inbeam' '_t' num2str(torbeam_in.inbeam.t_some_beam_on(it)) 'g' num2str(ibeam) '.dat']);
       [aa,bb]=unix(['cp ~/TORBEAM/inbeam_default.dat ' torbeam_in.fname{it}.inbeam{ibeam}]);
       fid=fopen(torbeam_in.fname{it}.inbeam{ibeam},'a');
       fprintf(fid,' xf = %f,	     ! wave frequency om=2*pi*xf\n',torbeam_in.inbeam.freq(ibeam));
@@ -154,48 +161,52 @@ end
 
 % run TORBEAM
 current_dir = pwd;
-eval(['cd ' dir_torbeam])
+eval(['cd ' torbeam_in.dir_torbeam])
 %                   namelist,  ol proj 3 rays(R,z)*100, not used now,  tor proj 3 rays(R,Y),  vol()   dP/dV(r/a) j(r/a)
 %tb_out_files_to_cp = {'echo.dat', 't1_LIB.dat', 't2_LIB.dat', 't1tor_LIB.dat', 'volumes.dat', 't2_new_LIB.dat', 'cntpr.dat'};
 tb_out_files_to_cp = {'t1_LIB.dat', 't1tor_LIB.dat', 'volumes.dat', 't2_new_LIB.dat'};
 tb_out_files_to_cp_varname = strrep(tb_out_files_to_cp,'.dat','');
 torbeam_out.run_torbeam = false .* ones(size(torbeam_in.inbeam.power_t,1),length(times_for_torbeam_eff));
 it_inb_beam_on = iround_os(torbeam_in.inbeam.t_some_beam_on,times_for_torbeam_eff);
+it_inb = iround_os(torbeam_in.inbeam.t,times_for_torbeam_eff);
 torbeam_out.t = torbeam_in.inbeam.t_some_beam_on(it_inb_beam_on);
 tic
+icount = 0;
 for it_eff=1:length(times_for_torbeam_eff)
   it = it_inb_beam_on(it_eff);
   unix(['cp ' torbeam_in.fname{it}.te ' Te.dat']);
   unix(['cp ' torbeam_in.fname{it}.ne ' ne.dat']);
   unix(['cp ' torbeam_in.fname{it}.topfile ' topfile']);
-  disp(['   t=' num2str(torbeam_in.inbeam.t(it_inb(it))) '   beam=' num2str(find(torbeam_in.inbeam.beam_on(:,it_inb(it)))','%d')]);
-  for ibeam=find(torbeam_in.inbeam.beam_on(:,it_inb(it)))',
+  disp(['   t=' num2str(torbeam_in.inbeam.t(it_inb(it_eff))) '   beam=' num2str(find(torbeam_in.inbeam.beam_on(:,it_inb(it_eff)))','%d')]);
+  for ibeam=find(torbeam_in.inbeam.beam_on(:,it_inb(it_eff)))',
     unix(['cp ' torbeam_in.fname{it}.inbeam{ibeam} ' inbeam.dat']);
     [a,b]=unix('/afs/ipp-garching.mpg.de/home/o/osauter/TORBEAM/lib-OUT/a.out');
+    icount = icount + 1;
     imw = findstr('(MW)',b);
     if ~isempty(imw)
-      torbeam_out.run_torbeam(ibeam,it) = true;
-      torbeam_out.pabs(ibeam,it) = 1e6 * sscanf(b(imw+4:end),'%f',1);
+      torbeam_out.run_torbeam(ibeam,it_eff) = true;
+      torbeam_out.pabs(ibeam,it_eff) = 1e6 * sscanf(b(imw+4:end),'%f',1);
       ima = findstr('(MA)',b);
-      torbeam_out.icd(ibeam,it) = 1e6 * sscanf(b(ima+4:end),'%f',1);
+      torbeam_out.icd(ibeam,it_eff) = 1e6 * sscanf(b(ima+4:end),'%f',1);
       imaxat = findstr('max. at',b);
-      torbeam_out.pabs_roamax(ibeam,it) = sscanf(b(imaxat(1)+7:end),'%f',1);
-      torbeam_out.icd_roamax(ibeam,it) = sscanf(b(imaxat(2)+7:end),'%f',1);
+      torbeam_out.pabs_roamax(ibeam,it_eff) = sscanf(b(imaxat(1)+7:end),'%f',1);
+      torbeam_out.icd_roamax(ibeam,it_eff) = sscanf(b(imaxat(2)+7:end),'%f',1);
       for j=1:length(tb_out_files_to_cp)
-        torbeam_out.(tb_out_files_to_cp_varname{j}){ibeam,it} = load(fullfile(dir_torbeam,[tb_out_files_to_cp{j}]));
+        torbeam_out.(tb_out_files_to_cp_varname{j}){ibeam,it_eff} = load(fullfile(torbeam_in.dir_torbeam,[tb_out_files_to_cp{j}]));
       end
       nnn = load('cntpr.dat');
-      torbeam_out.cntpr.tbegabs(ibeam,it) = nnn(1);
-      torbeam_out.cntpr.dtabs(ibeam,it) = nnn(2);
-      torbeam_out.pdens_jcd_rho(:,ibeam,it) = torbeam_out.t2_new_LIB{ibeam,it}(:,1);
-      torbeam_out.pdens(:,ibeam,it) = torbeam_out.t2_new_LIB{ibeam,it}(:,2);
-      torbeam_out.jcd(:,ibeam,it) = torbeam_out.t2_new_LIB{ibeam,it}(:,3);
+      torbeam_out.cntpr.tbegabs(ibeam,it_eff) = nnn(1);
+      torbeam_out.cntpr.dtabs(ibeam,it_eff) = nnn(2);
+      torbeam_out.pdens_jcd_rho(:,ibeam,it_eff) = torbeam_out.t2_new_LIB{ibeam,it_eff}(:,1);
+      torbeam_out.pdens(:,ibeam,it_eff) = torbeam_out.t2_new_LIB{ibeam,it_eff}(:,2);
+      torbeam_out.jcd(:,ibeam,it_eff) = torbeam_out.t2_new_LIB{ibeam,it_eff}(:,3);
     else
       disp(['TORBEAM did not run properly, no MW result'])
     end
   end
 end
-disp(['time for running all TORBEAMs: ' num2str(toc)])
+aaa=toc;
+disp(['time for running all TORBEAMs: ' num2str(aaa) ' for ' num2str(icount) ' runs so ' num2str(aaa/icount) 's per TORBEAM run'])
 for ibeam=find(any(torbeam_out.run_torbeam,2))'
   figure;
   subplot(2,1,1)
@@ -211,16 +222,16 @@ end
 
 figure
 subplot(3,1,1)
-plot(torbeam_out.t,torbeam_out.pabs/1e6)
+plot(torbeam_out.t,torbeam_out.pabs/1e6,'*-')
 ylabel('Pabs [MW]')
 
 subplot(3,1,2)
-plot(torbeam_out.t,torbeam_out.icd/1e6)
+plot(torbeam_out.t,torbeam_out.icd/1e6,'*-')
 ylabel('Icd [MA]')
 
 subplot(3,1,3)
-plot(torbeam_out.t,torbeam_out.pabs_roamax/1e6)
-ylabel('r/a (max Pdens)')
+plot(torbeam_out.t,torbeam_out.pabs_roamax,'*-')
+ylabel('r(max Pdens) / a')
 xlabel('t [s]')
 
 
-- 
GitLab