diff --git a/wk/Test_Non_Lin.m b/wk/Test_Non_Lin.m new file mode 100644 index 0000000000000000000000000000000000000000..7f7087216350e84c04d05523e2ca7a05f382a900 --- /dev/null +++ b/wk/Test_Non_Lin.m @@ -0,0 +1,156 @@ +%% Run linear simulation on a kr,kz grid and compute the non linear term afterwards +clear all; close all; +BASIC.SIMID = 'test_non_lin'; % 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 = 1; +OUTPUTS.write_Ni00 = '.true.'; +OUTPUTS.write_moments = '.true.'; +OUTPUTS.write_phi = '.true.'; +OUTPUTS.write_doubleprecision = '.true.'; +OUTPUTS.resfile0 = '''results'''; +%% Grid parameters +GRID.pmaxe = 2; +GRID.jmaxe = 2; +GRID.pmaxi = 2; +GRID.jmaxi = 2; +GRID.nkr = 10; +GRID.krmin = 0.0; +GRID.krmax = 0.; +GRID.nkz = 10; +GRID.kzmin = 0.1; +GRID.kzmax = 1.0; +%% Model parameters +MODEL.CO = -2; % Collision operator (0 : L.Bernstein, -1 : Full Coulomb, -2 : Dougherty) +MODEL.nu = 0.01; % 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 = 1.0; % Density +MODEL.eta_T = 0.0; % Temperature +MODEL.eta_B = 0.5; % 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 = 1.0; +INITIAL.initback_moments = 0.01; +INITIAL.initnoise_moments = 0.; +INITIAL.iseed = 42; +INITIAL.selfmat_file = ... + ['''../iCa/self_Coll_GKE_0_GKI_0_ESELF_1_ISELF_1_Pmaxe_',num2str(GRID.pmaxe),... + '_Jmaxe_',num2str(GRID.jmaxe),'_Pmaxi_',num2str(GRID.pmaxi),'_Jmaxi_',... + num2str(GRID.jmaxi),'_pamaxx_10.h5''']; +INITIAL.eimat_file = ... + ['''../iCa/ei_Coll_GKE_0_GKI_0_ETEST_1_EBACK_1_Pmaxe_',num2str(GRID.pmaxe),... + '_Jmaxe_',num2str(GRID.jmaxe),'_Pmaxi_',num2str(GRID.pmaxi),'_Jmaxi_',... + num2str(GRID.jmaxi),'_pamaxx_10_tau_1.0000_mu_0.0233.h5''']; +INITIAL.iemat_file = ... + ['''../iCa/ie_Coll_GKE_0_GKI_0_ITEST_1_IBACK_1_Pmaxe_',num2str(GRID.pmaxe),... + '_Jmaxe_',num2str(GRID.jmaxe),'_Pmaxi_',num2str(GRID.pmaxi),'_Jmaxi_',... + num2str(GRID.jmaxi),'_pamaxx_10_tau_1.0000_mu_0.0233.h5''']; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Write input file and run HeLaZ +INPUT = write_fort90(OUTPUTS,GRID,MODEL,INITIAL,TIME_INTEGRATION,BASIC); +nproc = 1; +EXEC = ' ../bin/helaz '; +RUN = ['mpirun -np ' num2str(nproc)]; +CMD = [RUN, EXEC, INPUT]; +system(CMD); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Run MOLI for each grid point and save the moments evolution +kr_scan = linspace(GRID.krmin,GRID.krmax,GRID.nkr); +kz_scan = linspace(GRID.kzmin,GRID.kzmax,GRID.nkz); +Nmtot = (GRID.pmaxe+1) * (GRID.jmaxe+1) + (GRID.pmaxi+1) * (GRID.jmaxi+1); +Nt = floor(BASIC.tmax/BASIC.dt)+1; +Napj_2D = zeros(GRID.nkr,GRID.nkz,Nt,Nmtot); +params.RK4 = 1; +for ikr = 1:GRID.nkr + for ikz = 1:GRID.nkz + kr = kr_scan(ikr); % used by MOLI_time_solver_2D directly + kz = kz_scan(ikz); + run ../matlab/MOLI_time_solver_2D + Napj_2D(ikr,ikz,:,:) = results.Napj; + end +end +%% Compute non linear term + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Analysis and basic figures +default_plots_options +SAVEFIG = 1; +filename = 'results_00.h5'; +default_plots_options +TITLE = [TITLE,', $k_z=',num2str(GRID.kzmin),'$']; +if params.RK4; MOLIsolvername = 'RK4'; +else; MOLIsolvername = 'ode15i'; +end +bare = @(p_,j_) (GRID.jmaxe+1)*p_ + j_ + 1; +bari = @(p_,j_) bare(GRID.pmaxe, GRID.jmaxe) + (GRID.jmaxi+1)*p_ + j_ + 1; + +%% Convert MOLI moments into HeLaZ format +Nepj_MOLI = zeros(GRID.pmaxe+1, GRID.jmaxe+1,GRID.nkr,GRID.nkz,Nt); +for ip = 1:GRID.pmaxe+1 + for ij = 1:GRID.jmaxe+1 + Nepj_MOLI(ip,ij,:,:,:) = Napj_2D(:,:,:,bare(ip-1,ij-1)); + end +end +Nipj_MOLI = zeros(GRID.pmaxi+1, GRID.jmaxi+1,GRID.nkr,GRID.nkz,Nt); +for ip = 1:GRID.pmaxi+1 + for ij = 1:GRID.jmaxi+1 + Nipj_MOLI(ip,ij,:,:,:) = Napj_2D(:,:,:,bari(ip-1,ij-1)); + end +end +%% Load HeLaZ moments + +moment = 'moments_i'; + +kr = h5read(filename,['/data/var5d/' moment '/coordkr']); +kz = h5read(filename,['/data/var5d/' moment '/coordkz']); +time = h5read(filename,'/data/var5d/time'); +Nipj_HeLaZ = zeros(GRID.pmaxi+1, GRID.jmaxi+1,numel(kr),numel(kz),numel(time)); +for it = 1:numel(time) + tmp = h5read(filename,['/data/var5d/', moment,'/', num2str(it,'%06d')]); + Nipj_HeLaZ(:,:,:,:,it) = tmp.real + 1i * tmp.imaginary; +end + +moment = 'moments_e'; + +kr = h5read(filename,['/data/var5d/' moment '/coordkr']); +kz = h5read(filename,['/data/var5d/' moment '/coordkz']); +time = h5read(filename,'/data/var5d/time'); +Nepj_HeLaZ = zeros(GRID.pmaxe+1, GRID.jmaxe+1,numel(kr),numel(kz),numel(time)); +for it = 1:numel(time) + tmp = h5read(filename,['/data/var5d/', moment,'/', num2str(it,'%06d')]); + Nepj_HeLaZ(:,:,:,:,it) = tmp.real + 1i * tmp.imaginary; +end + +%% Check coherence of linear results +disp('MOLI - HeLaZ differences :'); +disp(sum(sum(sum(sum(sum(Nipj_MOLI-Nipj_HeLaZ)))))... + / sum(sum(sum(sum(sum(Nipj_MOLI)))))); + +%% Non linear term computation +%get phi +phiHeLaZ = zeros(numel(timephi),numel(kr),numel(kz)); +for it = 1:numel(time) + tmp = h5read(filename,['/data/var2d/phi/' num2str(it,'%06d')]); + phiHeLaZ(it,:,:) = tmp.real + 1i * tmp.imaginary; +end + +compute_Sapj +