Education/ExperimentMenu/1stLevelBasic/ElectronEnergyConfinementTime/Code/Matlab/script.m

%% Tokamak GOLEM  - electron energy confinement time $\tau_E$ calculation
% Strategic flowchart
% 
% 
% 
% 
%% Initialization
% First we clear matlab workspace and define fundamental constants and parameters

clc; clear; close all

VacuumShotNo = 22475;        % Vacuum shot number
PlasmaShotNo=22471;          % Plasma shot number
baseURL='http://golem.fjfi.cvut.cz/utils/data/';

RogowskiCalibration=5.3e6;   % Calibration for Rogowski coil [A/V(10us)] 03/2010, CASTOR calibration (Mr. Zacek), 10 us sampling, Mr. Zacek states 5.3e6 A/Vs
UloopCalibration=5.5;        % Calibration for U_loop measurement
Mu0=4*pi*1e-7;               % [H/m] Permeability 
kB=1.3806503e-23;            % [J/K] Botlzmann constant
eV=1.60217646e-19;           % [J/eV] 1 eV equivalent to J

MajorRadius=0.4;             % [m]
LimiterPosition=0.085;       % [m] max plasma radius    0.05 for ring with Mach probes
MeanPlasmaRadius=0.060;      % [m] mean plasma radius without any stabilization 
PlasmaVolume=pi*LimiterPosition^2*2*pi*MajorRadius; % [m^3]
%% Chamber resistence $R_{ch}$ calculation from vacuum shot
% Plot raw data from NIstandard DAS (Data Acquisition System)
% 
% First let's get the data from the DAS in the columns specified by the given 
% identifiers

Ul = str2num(webread([baseURL num2str(VacuumShotNo) '/uloop']));
Ir = str2num(webread([baseURL num2str(VacuumShotNo) '/irog']));
%% 
% Let's show raw data

figure(1);
h1 = subplot(2,1,1);
plot(Ul(:,1)*1e3,Ul(:,2))
ylabel('channel #1 [V]'); set(gca,'XTickLabels',[]); ylim([0 2]); xlim([0 40])
legend('ID:uloop')
title(['Vacuum shot: #' num2str(VacuumShotNo) ' - raw data from NIstandard DAS'])
h2 = subplot(2,1,2);
p = get(h1, 'pos'); p(2) = p(2) - p(4)*1.1; set(h2,'pos',p) % proper positon of subplot
plot(Ir(:,1)*1e3,Ir(:,2))
ylabel('channel #3 [V]'); xlabel('Time [ms]'); ylim([-.1 0.3]); xlim([0 40])
legend('ID:irog')
%% 
% Get real physical quantities from raw data
% 
% Physical quantities can be obtained by multiplying the raw data by  appropriate 
% calibration constants. In the case of the current, the  derivative is measured, 
% so the signal has to be numerically integrated.
% 
% $U_l$ from ID:uloop needs only multiplication

U_l = Ul(:,2)*UloopCalibration;
%% 
% Chamber current $I_{ch}$ needs offset correction, integration and calibration

offset = mean(Ir(Ir(:,1)<=.004,2)); % Up to 4 ms no signal, good zero specification
I_ch = cumtrapz(Ir(:,1),Ir(:,2)-offset);
I_ch = I_ch*RogowskiCalibration;
%% 
% And let�s plot it

figure(2);
h1 = subplot(2,1,1);
plot(Ul(:,1)*1e3,U_l)
ylabel('U_l [V]'); set(gca,'XTickLabels',[]); ylim([-4 12]); xlim([0 40])
legend('Loop voltage')
title(['Vacuum shot: #' num2str(VacuumShotNo) ' - real data'])
h2 = subplot(2,1,2);
p = get(h1, 'pos'); p(2) = p(2) - p(4)*1.1; set(h2,'pos',p) % proper positon of subplot
plot(Ir(:,1)*1e3,I_ch)
ylabel('I_{ch} [A]'); xlabel('Time [ms]'); ylim([-1e3 1.5e3]); xlim([0 40])
legend('Chamber current I_{ch}')
%% 
% Final chamber resistance specification
% 
% The chanber resistnace should be calculated in the time span where the 
% physical quantities are reasonably stationary.

t_start = find(Ul(:,1)>=0.014,1,'first');
t_end = find(Ul(:,1)>=0.015,1,'first');
%% 
% Calculation via Ohm's law $$R_{ch}=U_l/I_{ch}$$

R_ch = U_l(t_start:t_end)./I_ch(t_start:t_end);
R_mean = mean(R_ch);
R_err = std(R_ch);
disp(['Chamber resistance = (' num2str(R_mean*1e3,'%.2f') ' +/- ' num2str(R_err*1e3,'%.2f') ') mOhm'])
%% Energy confinement time $\tau_E$ calculation from plasma shot
% Plot raw data from NIstandard DAS and interferometer
% 
% Get data

Ul = str2num(webread([baseURL num2str(PlasmaShotNo) '/uloop']));
Ir = str2num(webread([baseURL num2str(PlasmaShotNo) '/irog']));
ne = str2num(webread([baseURL num2str(PlasmaShotNo) '/electron_density']));
%% 
% Interpolate the density on the same time axis as the rest of the quantities

n_e = interp1(ne(:,1),ne(:,2),Ul(:,1),'pchip');
%% 
% Let�s show raw data from NIstandard

figure(3);
h1 = subplot(2,1,1);
plot(Ul(:,1)*1e3,Ul(:,2))
ylabel('channel #1 [V]'); set(gca,'XTickLabels',[]); ylim([0 2]); xlim([0 40])
legend('ID:uloop')
title(['Plasma shot: #' num2str(PlasmaShotNo) ' - raw data from NIstandard DAS'])
h2 = subplot(2,1,2);
p = get(h1, 'pos'); p(2) = p(2) - p(4)*1.1; set(h2,'pos',p) % proper positon of subplot
plot(Ir(:,1)*1e3,Ir(:,2))
ylabel('channel #3 [V]'); xlabel('Time [ms]'); ylim([-.1 0.3]); xlim([0 40])
legend('ID:irog')
%% 
% Let�s show raw data from interferometer diagnostics

figure(4)
plot(Ul(:,1)*1e3,n_e)
ylabel('n_e [m^{-3}]'); ylim([0 6e18]); xlim([0 40])
legend('ID:electron\_density')
title(['Plasma shot: #' num2str(PlasmaShotNo) ' - raw data from TektronixDPO'])
%% 
% Get real physical data
% 
% $U_l$ from ID:uloop needs only multiplication

U_l = Ul(:,2)*UloopCalibration;
%% 
% Plasma current $I_p$ needs offset correction, integration calibration 
% and chamber current $I_{ch}$ subtraction (getting from Ohm�s law)

offset = mean(Ir(Ir(:,1)<=.004,2));    
I_chANDp = cumtrapz(Ir(:,1),Ir(:,2)-offset);
I_chANDp = I_chANDp*RogowskiCalibration;
I_p = I_chANDp-U_l/R_mean;
%% 
% And let�s plot it

figure(5);
h1 = subplot(3,1,1);
plot(Ul(:,1)*1e3,U_l)
ylabel('U_l [V]'); set(gca,'XTickLabels',[]); ylim([-4 12]); xlim([0 40])
legend('Loop voltage')
title(['Plasma shot: #' num2str(PlasmaShotNo) ' - real data'])
h2 = subplot(3,1,2);
p = get(h1, 'pos'); p(2) = p(2) - p(4)*1.1; set(h2,'pos',p) % proper positon of subplot
plot(Ir(:,1)*1e3,I_chANDp/1e3)
ylabel('I_{ch} [kA]'); xlabel('Time [ms]'); ylim([-1 5]); xlim([0 40])
legend('Chamber + plasma current I_{ch+p}')
h3 = subplot(3,1,3);
p = get(h2, 'pos'); p(2) = p(2) - p(4)*1.1; set(h3,'pos',p) % proper positon of subplot
plot(Ir(:,1)*1e3,I_p/1e3)
ylabel('I_p [kA]'); xlabel('Time [ms]'); ylim([-1 5]); xlim([0 40])
legend('Plasma current I_p')
%% Data correlation ...
% Select only a signal with plasma

tstart = str2num(webread([baseURL num2str(PlasmaShotNo) '/plasma_start']));
tend = str2num(webread([baseURL num2str(PlasmaShotNo) '/plasma_end']));
i_start = find(Ul(:,1)>=tstart,1,'first');
i_end = find(Ul(:,1)>=tend,1,'first');
n_e = n_e(i_start:i_end);
I_p = I_p(i_start:i_end);
U_l = U_l(i_start:i_end);
time = Ul(i_start:i_end,1);
%% 
% And let�s plot it

figure(6);
h1 = subplot(3,1,1);
plot(time*1e3,U_l)
ylabel('U_l [V]'); set(gca,'XTickLabels',[]); ylim([-4 12]); xlim([tstart tend]*1e3)
legend('Loop voltage U_l')
title(['Plasma shot: #' num2str(PlasmaShotNo) ' - real data'])
h2 = subplot(3,1,2);
p = get(h1, 'pos'); p(2) = p(2) - p(4)*1.1; set(h2,'pos',p) % proper positon of subplot
plot(time*1e3,I_p/1e3)
ylabel('I_p [kA]'); set(gca,'XTickLabels',[]); ylim([-1 5]); xlim([tstart tend]*1e3)
legend('Plasma current I_p')
h3 = subplot(3,1,3);
p = get(h2, 'pos'); p(2) = p(2) - p(4)*1.1; set(h3,'pos',p) % proper positon of subplot
plot(time*1e3,n_e)
ylabel('n_e [m^{-3}]'); ylim([0 7e18]);  xlabel('Time [ms]'); xlim([tstart tend]*1e3)
legend('Electron density n_e')
%% Final calculations
% Plasma resistivity adopted to avoid $R_p^{-2/3}$ problems @ T_e calculation

R_p = U_l./I_p;
R_p(R_p<0 & isnan(R_p)) = 0;
%% 
% Plasma heating power $P_{OH}$

P_OH = U_l.*I_p;
%% 
% Central electron temperature $T_e$ (the GOLEM specific case)

T_e = 0.9.*R_p.^(-2/3);
%% 
% Energy content in the plasma $W_p$

W_p = PlasmaVolume.*n_e.*eV.*T_e./3;
%% 
% Let�s make final calculations in the stationary phase to avoid complex 
% derivation calculations of plasma energy balance

imin = find(time>=0.015,1,'first');
imax = find(time>=0.020,1,'first');
P_OH = P_OH(imin:imax);
W_p = W_p(imin:imax);
time = time(imin:imax);
tau = W_p./P_OH;
%% 
% Plot

figure(7);
h1 = subplot(3,1,1);
plot(time*1e3,P_OH/1e3)
ylabel('P_{OH} [kW]'); set(gca,'XTickLabels',[]); ylim([20 27]);
legend('Ohmic heating power P_{OH}')
title(['Plasma shot: #' num2str(PlasmaShotNo) ' - energy balance'])
h2 = subplot(3,1,2);
p = get(h1, 'pos'); p(2) = p(2) - p(4)*1.1; set(h2,'pos',p) % proper positon of subplot
plot(time*1e3,W_p)
ylabel('W_p [J]'); set(gca,'XTickLabels',[]); ylim([0.6 1.3]);
legend('Plasma energy W_p')
h3 = subplot(3,1,3);
p = get(h2, 'pos'); p(2) = p(2) - p(4)*1.1; set(h3,'pos',p) % proper positon of subplot
plot(time*1e3,tau*1e6)
ylabel('n_e [m^{-3}]'); ylim([25 50]);  xlabel('Time [ms]')
legend('Energy confinement time \tau_E')
grid on
%% 
% Final calculation

tau_mean = mean(tau);
tau_err = std(tau);
disp(['Energy confinement time = (' num2str(tau_mean*1e6,'%.0f') ' +/- ' num2str(R_err*1e6,'%.0f') ') us'])