From 292701d03073789b7fc1ea5a41f354b1b27b9d23 Mon Sep 17 00:00:00 2001
From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch>
Date: Fri, 26 Jun 2020 17:08:27 +0200
Subject: [PATCH] Script to compare simple simulations with MOLI

---
 matlab/MOLI_time_solver.m |  15 ++--
 wk/benchmark.m            | 141 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 148 insertions(+), 8 deletions(-)
 create mode 100644 wk/benchmark.m

diff --git a/matlab/MOLI_time_solver.m b/matlab/MOLI_time_solver.m
index fb88bdd2..ff15c259 100644
--- a/matlab/MOLI_time_solver.m
+++ b/matlab/MOLI_time_solver.m
@@ -25,7 +25,7 @@ options.MOLI = 1;    % 1 -> Solve MOLI, 0 -> off
 options.solver.solver = 3;
 
 % MOLI Linear Fit Solver
-options.LinFitSolver = 2;
+options.LinFitSolver = 0;
 
 %% Main parameter scan
 
@@ -86,16 +86,16 @@ options.COSOlver.cmd   = 'mpirun -np 6 ./bin/CO 2 2 2';
 options.magnetic        = 1;           % 1-> Add toroidal magnetic gradient drift resonance effects
 
 % Physical Parameters
-params.tau              = 1.0;         % Ti/Te
-params.nu               = MODEL.nu;       % electron/ion collision frequency ... only for nu/ omega_pe < nuoveromegapemax (electron plasma frequency) [See Banks et al. (2017)]
+params.tau              = MODEL.tau_i; % Ti/Te
+params.nu               = MODEL.nu;    % electron/ion collision frequency ... only for nu/ omega_pe < nuoveromegapemax (electron plasma frequency) [See Banks et al. (2017)]
 params.nuoveromegapemax = inf;         % Maximum ratio between electron/ion collision frequency and electron plasma frequency [See Banks et al. (2017)]. Set to inf if not desired !!!
 params.mu               = MODEL.sigma_e;   % sqrt(m_e/m_i)
 params.kpar             = 0.0;         % normalized parallel wave number to the major radius
-params.kperp            = GRID.kzmin;         % normalized perpendicular wave number to the soundLarmor radius. Note: If ions ==0 (e.g. EPW), kperp --> b
+params.kperp            = GRID.kzmin;  % normalized perpendicular wave number to the soundLarmor radius. Note: If ions ==0 (e.g. EPW), kperp --> b
 params.alphaD           = 0.0;         % (k*Debye length)^2
-params.Rn               = 1.0;	       % Major Radius / Background density gradient length
-params.RTe              = 0.0;         % Major Radius * normalized kperp / Background electron temperature gradient length
-params.RTi              = 0.0;         % Major Radius * normalized kperp / Background ion temperature gradient length
+params.Rn               = MODEL.eta_n; % Major Radius / Background density gradient length
+params.RTe              = MODEL.eta_T; % Major Radius * normalized kperp / Background electron temperature gradient length
+params.RTi              = MODEL.eta_T; % Major Radius * normalized kperp / Background ion temperature gradient length
 params.Rphi             = 0.0;         % Major Radius * normalized kperp / Background potentiel gradient length [presence of shear] - only for GK
 params.betae            = 1e-6;        % Electron Beta plasma.
 
@@ -143,7 +143,6 @@ options.fscan = 0;         % 1 -> peform scan over scan.list, 0-> off
 options.scan.list = {};% List of scan parameters. If empty, solve MOLI with params
 
 % Time-Evolution Problem [Solver==3] ...
-params.RK4 = 1;
 options.solver.TimeSolver.dt         = BASIC.dt;		% timestep of time evolution (R/c_s or 1/(k v/the) units)
 options.solver.TimeSolver.tmax       = BASIC.tmax;
 options.solver.TimeSolver.Trun       = BASIC.tmax;		  % total time to run time evolution
diff --git a/wk/benchmark.m b/wk/benchmark.m
new file mode 100644
index 00000000..32d2e049
--- /dev/null
+++ b/wk/benchmark.m
@@ -0,0 +1,141 @@
+SIMID = 'benchmark'; % Name of the simulations
+addpath(genpath('../matlab')) % ... add 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% outputs options
+OUTPUTS.nsave_0d = 0;
+OUTPUTS.nsave_1d = 0;
+OUTPUTS.nsave_2d = 1;
+OUTPUTS.nsave_5d = 0;
+OUTPUTS.write_Ni00    = '.true.';
+OUTPUTS.write_moments = '.true.';
+OUTPUTS.write_phi     = '.true.';
+OUTPUTS.write_doubleprecision = '.true.';
+OUTPUTS.resfile0      = '''results''';
+%% Grid parameters
+GRID.pmaxe = 20;
+GRID.jmaxe = 10;
+GRID.pmaxi = 20;
+GRID.jmaxi = 10;
+GRID.nkr   = 1;
+GRID.krmin = 0.;
+GRID.krmax = 0.;
+GRID.nkz   = 1;
+GRID.kzmin = 1.0;
+GRID.kzmax = 1.0;
+%% Model parameters
+MODEL.CO      = -1;  % Collision operator (-1 = Full Coulomb, 0 = Dougherty)
+MODEL.nu      = 0.0; % collisionality nu*L_perp/Cs0
+% temperature ratio T_a/T_e
+MODEL.tau_e   = 1.0;
+MODEL.tau_i   = 1.0;
+% mass ratio sqrt(m_a/m_i)
+MODEL.sigma_e = 0.0233380;
+MODEL.sigma_i = 1.0;
+% charge q_a/e
+MODEL.q_e     =-1.0;
+MODEL.q_i     = 1.0;
+% gradients L_perp/L_x
+MODEL.eta_n   = 0.0;        % Density
+MODEL.eta_T   = 1.0;        % Temperature
+MODEL.eta_B   = 0.0;        % Magnetic
+% Debye length
+MODEL.lambdaD = 0.0;
+%% Time integration and intialization parameters
+TIME_INTEGRATION.numerical_scheme  = '''RK4''';
+BASIC.nrun                = 100000;
+BASIC.dt                  = 0.05;
+BASIC.tmax                = 100.0;
+INITIAL.initback_moments  = 0.01;
+INITIAL.initnoise_moments = 0.;
+INITIAL.iseed             = 42;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Write input file
+INPUT = write_fort90(OUTPUTS,GRID,MODEL,INITIAL,TIME_INTEGRATION,BASIC);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Run HeLaZ
+nproc = 1;
+EXEC  = ' ../bin/helaz ';
+RUN   = ['mpirun -np ' num2str(nproc)];
+CMD   = [RUN, EXEC, INPUT];
+system(CMD);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Run MOLI with same input parameters
+params.RK4 = 1;
+run ../matlab/MOLI_time_solver
+if params.RK4; MOLIsolvername = 'RK4';
+else;          MOLIsolvername = 'ode15i';
+end
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Analysis and basic figures
+SAVEFIG = 1;
+filename = 'results_00.h5';
+TITLE  = [];
+TITLE = [TITLE,'$\eta_n=',num2str(MODEL.eta_n),'$, '];
+TITLE = [TITLE,'$\eta_B=',num2str(MODEL.eta_B),'$, '];
+TITLE = [TITLE,'$\eta_T=',num2str(MODEL.eta_T),'$, '];
+TITLE = [TITLE,   '$\nu=',num2str(MODEL.nu),'$, '];
+TITLE = [TITLE, '$(P,J)=(',num2str(GRID.pmaxe),',',num2str(GRID.jmaxe),')$'];
+%% Nipj
+
+moment = 'Ni00';
+
+kr       = h5read(filename,['/data/var2d/' moment '/coordkr']);
+kz       = h5read(filename,['/data/var2d/' moment '/coordkz']);
+timeNi     = h5read(filename,'/data/var2d/time');
+Nipj     = zeros(numel(timeNi),numel(kr),numel(kz));
+for it = 1:numel(timeNi)
+    tmp          = h5read(filename,['/data/var2d/', moment,'/', num2str(it,'%06d')]);
+    Nipj(it,:,:) = tmp.real + 1i * tmp.imaginary; 
+end
+
+%% phi
+timephi  = h5read(filename,'/data/var2d/time');
+kr       = h5read(filename,'/data/var2d/phi/coordkr');
+kz       = h5read(filename,'/data/var2d/phi/coordkz');
+phiHeLaZ      = zeros(numel(timephi),numel(kr),numel(kz));
+for it = 1:numel(timephi)
+    tmp         = h5read(filename,['/data/var2d/phi/' num2str(it,'%06d')]);
+    phiHeLaZ(it,:,:) = tmp.real + 1i * tmp.imaginary;
+end
+
+timephiMOLI = results.time;
+phiMOLI  = zeros(size(timephiMOLI));
+for it = 1:numel(timephiMOLI)
+    phiMOLI(it) = get_phi(results.Napj(it,:),params,options);
+end
+
+fig = figure;
+%HeLaZ results
+semilogy(timephi,abs(phiHeLaZ),'-','DisplayName','HeLaZ RK4')
+hold on
+title(TITLE);
+%MOLI results
+semilogy(timephiMOLI,abs(phiMOLI),'--','DisplayName',['MOLI ',MOLIsolvername])
+grid on
+xlabel('$t$')
+ylabel('$|\phi|$')
+legend('show')
+if SAVEFIG; FIGNAME = 'phi'; save_figure; end;
+
+
+fig = figure;
+%HeLaZ results
+x1 = timeNi;
+y1 = abs(Nipj);
+semilogy(x1,y1,'-','DisplayName','HeLaZ RK4')
+hold on
+%MOLI results
+x2 = results.time;
+y2 = abs(results.Napj(:,1));
+semilogy(x2,y2,'--','DisplayName',['MOLI ',MOLIsolvername]);
+title(TITLE);
+grid on
+legend('show')
+xlabel('$t$')
+ylabel(['$|',moment,'|$'])
+if SAVEFIG; FIGNAME = 'Ni00'; save_figure; end;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ No newline at end of file
-- 
GitLab