From ad4e64eaf6f0f47023cd4c8a5e160ecec5233464 Mon Sep 17 00:00:00 2001
From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch>
Date: Tue, 27 Oct 2020 10:48:19 +0100
Subject: [PATCH] Scripts to study behavior of computational cost w.r.t.
 parameters

---
 matlab/computational_cost_estimation.m |   0
 wk/cpu_time_study.m                    | 134 +++++++++++++++++++++++++
 wk/parameters_cpu_time.m               |  44 ++++++++
 3 files changed, 178 insertions(+)
 create mode 100644 matlab/computational_cost_estimation.m
 create mode 100644 wk/cpu_time_study.m
 create mode 100644 wk/parameters_cpu_time.m

diff --git a/matlab/computational_cost_estimation.m b/matlab/computational_cost_estimation.m
new file mode 100644
index 00000000..e69de29b
diff --git a/wk/cpu_time_study.m b/wk/cpu_time_study.m
new file mode 100644
index 00000000..21a119cf
--- /dev/null
+++ b/wk/cpu_time_study.m
@@ -0,0 +1,134 @@
+clear all;
+CPUFREQ   = 3.2e9;%[Hz] cpu clock of the computer
+CTIME_EXP = 425;  %[s] real time for N=64, P=2, J=1, DT = 1e-2, TMAX = 150
+CCOST_EXP = 64*64/2*4*(2*1 + 2*1)*150/1e-2;
+
+FACTOR    = CTIME_EXP/(CCOST_EXP/CPUFREQ);
+
+%% Default parameters
+TMAX    = 20;  % Maximal time unit
+DT      = 5e-2;   % Time step
+N       = 20;     % Frequency gridpoints (Nkr = N/2)
+PMAXE   = 00;     % Highest electron Hermite polynomial degree
+JMAXE   = 00;     % Highest ''       Laguerre ''
+PMAXI   = 00;     % Highest ion      Hermite polynomial degree
+JMAXI   = 00;     % Highest ''       Laguerre ''
+
+%% CPUTIME VS DT
+DTA = logspace(-3,-1,10);
+NN_DT = []; CT_EST_DT = []; CT_REAL_DT = [];
+for DT_ = DTA
+    DT = DT_;   
+    parameters_cpu_time;
+    run;
+    load_results;
+    CCOST      = 4*N*N/2*((PMAXE+1)*(JMAXE+1) + (PMAXI+1)*(JMAXI+1))*TMAX/DT;
+    NN_DT      = [NN_DT,TMAX/DT_]; 
+    CT_EST_DT  = [CT_EST_DT,CCOST/CPUFREQ]; 
+    CT_REAL_DT = [CT_REAL_DT,CPUTIME];
+end
+system('rm test_cputime*');
+if 0
+%%
+figure
+    plot(CT_EST_DT,CT_REAL_DT,'-x'); hold on;
+    xlabel('$4\times N^2/2 \times(P_{e+1} J_{e+1}+ P_{i+1} J_{i+1})\times N_t/\Omega_{CPU}$'); 
+    ylabel('$\tau_\textrm{CPU}$'); grid on;
+end  
+%% CPUTIME VS N
+DT      = 5e-2;   % Time step
+NA = [16 32 64 128 256 512];
+NN_N = []; CT_EST_N = []; CT_REAL_N = [];
+for N_ = NA
+    N = N_;   
+    parameters_cpu_time;
+    run;
+    load_results;
+    CCOST     = FACTOR * N*N/2*4*((PMAXE+1)*(JMAXE+1) + (PMAXI+1)*(JMAXI+1))*TMAX/DT;
+    NN_N      = [NN_N,TMAX/DT_]; 
+    CT_EST_N  = [CT_EST_N,CCOST/CPUFREQ]; 
+    CT_REAL_N = [CT_REAL_N,CPUTIME];
+end
+system('rm test_cputime*');
+if 0
+%%
+figure
+    plot(CT_EST_N,CT_REAL_N,'-x'); hold on;
+    xlabel('$4\times N^2/2 \times(P_{e+1} J_{e+1}+ P_{i+1} J_{i+1})\times N_t/\Omega_{CPU}$'); 
+    ylabel('$\tau_\textrm{CPU}$'); grid on;
+end
+%% CPUTIME VS P
+DT   = 5e-2;   % Time step
+N    = 20;
+PA   = 0:20;
+NN_P = []; CT_EST_P = []; CT_REAL_P = [];
+for P_ = PA
+    PMAXE = P_; PMAXI = P_;   
+    parameters_cpu_time;
+    run;
+    load_results;
+    CCOST     = FACTOR * N*N/2*4*((PMAXE+1)*(JMAXE+1) + (PMAXI+1)*(JMAXI+1))*TMAX/DT;
+    NN_P      = [NN_P,TMAX/DT_]; 
+    CT_EST_P  = [CT_EST_P,CCOST/CPUFREQ]; 
+    CT_REAL_P = [CT_REAL_P,CPUTIME];
+end
+system('rm test_cputime*');
+if 0
+%%
+figure
+    plot(CT_EST_P,CT_REAL_P,'-x'); hold on;
+    xlabel('$4\times N^2/2 \times\sum_a P_{a+1} J_{a+1}\times N_t/\Omega_{CPU}$[s]'); 
+    ylabel('$\tau_\textrm{CPU}$[s]'); grid on;
+end
+%% CPUTIME VS J
+DT   = 5e-2;   % Time step
+N    = 20;
+PMAXI= 0; PMAXE = 0;
+JA   = 0:10;
+NN_J = []; CT_EST_J = []; CT_REAL_J = [];
+for J_ = JA
+    JMAXE = J_; JMAXI = J_;   
+    parameters_cpu_time;
+    run;
+    load_results;
+    CCOST     = FACTOR * N*N/2*4*((PMAXE+1)*(JMAXE+1) + (PMAXI+1)*(JMAXI+1))*TMAX/DT;
+    NN_J      = [NN_J,TMAX/DT_]; 
+    CT_EST_J  = [CT_EST_J,CCOST/CPUFREQ]; 
+    CT_REAL_J = [CT_REAL_J,CPUTIME];
+end
+system('rm test_cputime*');
+if 0
+%%
+figure
+    plot(CT_EST_P,CT_REAL_P,'-x'); hold on;
+    xlabel('$4\times N^2/2 \times\sum_a P_{a+1} J_{a+1}\times N_t/\Omega_{CPU}$[s]'); 
+    ylabel('$\tau_\textrm{CPU}$[s]'); grid on;
+end
+%% Overall comparison
+figure
+    loglog(CT_EST_DT,CT_REAL_DT,'-x','DisplayName','$\Delta t$'); hold on;
+    plot(CT_EST_N, CT_REAL_N, '-x','DisplayName','$N$'); hold on;
+    plot(CT_EST_P, CT_REAL_P, '-x','DisplayName','$P$'); hold on;
+    plot(CT_EST_J, CT_REAL_J, '-x','DisplayName','$J$'); hold on;
+    xlabel('$N^{2}(\sum_a P_{a+1} J_{a+1})^{1}N_s^{1} \Omega_{cpu}^{-1}$[s]'); 
+    ylabel('$\tau_\textrm{CPU}$'); grid on; legend('show');
+    
+%%
+% CTIME     = FACTOR * CCOST/CPUFREQ;
+% HOURS     = floor(CTIME/3600);
+% MINUTES   = floor((CTIME-3600*HOURS)/60);
+% SECONDS   = floor(CTIME-3600*HOURS-60*MINUTES);
+% 
+% disp(['Computational cost ~',sprintf('%.1e',CCOST),' op.']);
+% 
+% TIMESTRING = 'Computational time ~';
+% if HOURS > 0
+%     TIMESTRING = [TIMESTRING,num2str(HOURS),'h '];
+% end
+% if MINUTES > 0
+%     TIMESTRING = [TIMESTRING,num2str(MINUTES),'min '];
+% end
+% if (HOURS + MINUTES == 0) && (SECONDS > 0)
+%     TIMESTRING = [TIMESTRING,num2str(SECONDS),'s '];
+% end
+% disp(TIMESTRING);
diff --git a/wk/parameters_cpu_time.m b/wk/parameters_cpu_time.m
new file mode 100644
index 00000000..eaba00c4
--- /dev/null
+++ b/wk/parameters_cpu_time.m
@@ -0,0 +1,44 @@
+% clear all;
+addpath(genpath('../matlab')) % ... add
+default_plots_options
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Set Up parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% PHYSICAL PARAMETERS
+NU      = 1e-2;   % Collision frequency
+TAU     = 1.0;    % e/i temperature ratio
+ETAB    = 0.0;    % Magnetic gradient
+ETAN    = 1.0;    % Density gradient
+ETAT    = 0.0;    % Temperature gradient
+MU      = 1e-8;   % Hyper diffusivity coefficient
+LAMBDAD = 0.0; 
+NOISE0  = 5.0e-5;
+%% GRID PARAMETERS
+% N       = 32;     % Frequency gridpoints (Nkr = N/2)
+L       = 10;     % Size of the squared frequency domain
+KREQ0   = 0;      % put kr = 0
+% PMAXE   = 02;     % Highest electron Hermite polynomial degree
+% JMAXE   = 00;     % Highest ''       Laguerre ''
+% PMAXI   = 02;     % Highest ion      Hermite polynomial degree
+% JMAXI   = 00;     % Highest ''       Laguerre ''
+KPAR    = 0.0;    % Parellel wave vector component
+%% TIME PARAMETERS 
+% TMAX    = 10;  % Maximal time unit
+% DT    = 1e-2;   % Time step
+SPS2D   = 5;      % Sampling per time unit for 2D arrays
+SPS5D   = 0.5;    % Sampling per time unit for 5D arrays
+RESTART = 0;      % To restart from last checkpoint
+JOB2LOAD= 00;
+%% OPTIONS
+SIMID   = 'test_cputime';  % Name of the simulation
+NON_LIN = 1 *(1-KREQ0);   % activate non-linearity (is cancelled if KREQ0 = 1)
+CO      = -2;  % Collision operator (0 : L.Bernstein, -1 : Full Coulomb, -2 : Dougherty)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% unused
+KR0KH   = 0; A0KH = 0; % Background phi mode to drive Ray-Tay inst.
+NO_E    = 0;  % Remove electrons dynamic
+% DK    = 0;  % Drift kinetic model (put every kernel_n to 0 except n=0 to 1)
+
+
+setup
-- 
GitLab