%% 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'])