From 6038dc392e1adcbb5998ec88e6454fa870a58776 Mon Sep 17 00:00:00 2001 From: Antoine Hoffmann <antoine.hoffmann@epfl.ch> Date: Thu, 3 Aug 2023 18:24:42 +0200 Subject: [PATCH] use of the new routine growth rate --- matlab/compute/mode_growth_meter.m | 62 ++++++++++++++++--- wk/lin_run_script.m | 23 ++++---- wk/lin_scan_script.m | 58 ++++++++---------- wk/load_metadata_scan.m | 95 +++++++++++++++++++----------- 4 files changed, 152 insertions(+), 86 deletions(-) diff --git a/matlab/compute/mode_growth_meter.m b/matlab/compute/mode_growth_meter.m index 921dd743..9993b265 100644 --- a/matlab/compute/mode_growth_meter.m +++ b/matlab/compute/mode_growth_meter.m @@ -30,6 +30,8 @@ TW = [OPTIONS.KY_TW; OPTIONS.KX_TW]; [~,ikzf] = max(mean(squeeze(abs(field(1,:,FRAMES))),2)); +[wkykx, ekykx] = compute_growth_rates(DATA.PHI(:,:,:,FRAMES),DATA.Ts3D(FRAMES)); + FIGURE.fig = figure; %set(gcf, 'Position', [100 100 1200 700]) FIGURE.FIGNAME = 'mode_growth_meter'; for i = 1:2 @@ -41,14 +43,20 @@ for i = 1:2 if MODES_SELECTOR == 2 switch OPTIONS.ik case 'sum' - plt_ = @(x,ik) movmean(squeeze(sum(abs((x(:,ik,FRAMES))),1)),Nma); + plt_ = @(f,ik) movmean(squeeze(sum(abs((f(:,ik,FRAMES))),1)),Nma); MODESTR = '$\sum_{k_y}$'; + omega= @(ik) wkykx(1,:,end); + err = @(ik) ekykx(1,:); case 'max' - plt_ = @(x,ik) movmean(squeeze(max(abs((x(:,ik,FRAMES))),[],1)),Nma); + plt_ = @(f,ik) movmean(squeeze(max(abs((f(:,ik,FRAMES))),[],1)),Nma); MODESTR = '$\max_{k_y}$'; + omega= @(ik) wkykx(1,:,end); + err = @(ik) ekykx(1,:); otherwise - plt_ = @(x,ik) movmean(abs(squeeze(x(OPTIONS.ik,ik,FRAMES))),Nma); + plt_ = @(f,ik) movmean(abs(squeeze(f(OPTIONS.ik,ik,FRAMES))),Nma); MODESTR = ['$k_y=$',num2str(DATA.grids.ky(OPTIONS.ik))]; + omega= @(ik) wkykx(OPTIONS.ik,:,end); + err = @(ik) ekykx(OPTIONS.ik,:); end kstr = 'k_x'; % Number max of modes to plot is kx>0 (1/2) of the non filtered modes (2/3) @@ -59,13 +67,19 @@ for i = 1:2 case 'sum' plt_ = @(x,ik) movmean(squeeze(sum(abs((x(ik,:,FRAMES))),2)),Nma); MODESTR = '$\sum_{k_x}$'; + omega= @(ik) wkykx(:,1,end); + err = @(ik) ekykx(:,1); case 'max' plt_ = @(x,ik) movmean(squeeze(max(abs((x(ik,:,FRAMES))),[],2)),Nma); MODESTR = '$\max_{k_x}$'; + omega= @(ik) wkykx(:,1,end); + err = @(ik) ekykx(:,1); otherwise plt_ = @(x,ik) movmean(abs(squeeze(x(ik,OPTIONS.ik,FRAMES))),Nma); MODESTR = ['$k_x=$',num2str(DATA.grids.kx(OPTIONS.ik))]; - end + omega= @(ik) wkykx(:,OPTIONS.ik,end); + err = @(ik) ekykx(:,OPTIONS.ik); + end kstr = 'k_y'; % Number max of modes to plot is ky>0 (1/1) of the non filtered modes (2/3) Nmax = ceil(DATA.grids.Nky*2/3); @@ -81,6 +95,8 @@ for i = 1:2 gamma = MODES; amp = MODES; + % w_ky = zeros(numel(MODES),numel(FRAMES)-1); + % ce = zeros(numel(MODES),numel(FRAMES)); i_=1; for ik = MODES @@ -88,9 +104,29 @@ for i = 1:2 gr = polyfit(t(it1:it2),to_measure(it1:it2),1); gamma(i_) = gr(1); amp(i_) = gr(2); + + % % Second method for measuring growth rate (measures frequ. too) + % if MODES_SELECTOR == 1 + % to_measure = reshape(DATA.PHI(ik,1,:,FRAMES),DATA.grids.Nz,numel(FRAMES)); + % else + % to_measure = reshape(DATA.PHI(1,ik,:,FRAMES),DATA.grids.Nz,numel(FRAMES)); + % end + % for it = 2:numel(FRAMES) + % phi_n = to_measure(:,it); + % phi_nm1 = to_measure(:,it-1); + % dt = t(it)-t(it-1); + % ZS = sum(phi_nm1,1); %sum over z + % + % wl = log(phi_n./phi_nm1)/dt; + % w_ky(i_,it) = squeeze(sum(wl.*phi_nm1,1)./ZS); + % + % % for iky = 1:numel(w_ky(:,it)) + % % ce(iky,it) = abs(sum(abs(w_ky(iky,it)-wl(iky,:)).^2.*phi_nm1(iky,:),2)./ZS(iky,:)); + % % end + % end i_=i_+1; end - mod2plot = [2:min(Nmax,OPTIONS.NMODES+1)]; + mod2plot = 2:min(Nmax,OPTIONS.NMODES+1); clr_ = jet(numel(mod2plot)); %plot % subplot(2+d,3,1+3*(i-1)) @@ -120,15 +156,25 @@ for i = 1:2 % subplot(2+d,3,3+3*(i-1)) FIGURE.axes(3+3*(i-1)) = subplot(2+d,3,3+3*(i-1),'parent',FIGURE.fig); - plot(k(MODES),gamma,... - 'DisplayName',['(',num2str(DATA.inputs.PMAX),',',num2str(DATA.inputs.JMAX),')']); hold on; + % yyaxis("left") + errorbar(k(MODES),real(omega(ik)),real(err(ik)),'-k',... + 'DisplayName',... + ['$\gamma$, (',num2str(DATA.inputs.PMAX),',',num2str(DATA.inputs.JMAX),')']); + hold on; for i_ = 1:numel(mod2plot) plot(k(MODES(mod2plot(i_))),gamma(mod2plot(i_)),'x','color',clr_(i_,:)); end if MODES_SELECTOR == 2 plot(k(ikzf),gamma(ikzf),'ok'); end - xlabel(['$',kstr,'\rho_s$']); ylabel('$\gamma$'); + % ylabel('$\gamma$'); + % yyaxis("right") + errorbar(k(MODES),imag(omega(ik)),imag(err(ik)),'--k',... + 'DisplayName',... + ['$\omega$, (',num2str(DATA.inputs.PMAX),',',num2str(DATA.inputs.JMAX),')']); + hold on; + ylabel('$\gamma,\omega$'); + xlabel(['$',kstr,'\rho_s$']); title('Growth rates') end diff --git a/wk/lin_run_script.m b/wk/lin_run_script.m index 46e94362..acb62f80 100644 --- a/wk/lin_run_script.m +++ b/wk/lin_run_script.m @@ -6,8 +6,8 @@ %% Set up the paths for the necessary Matlab modules gyacomodir = pwd; gyacomodir = gyacomodir(1:end-2); -% mpirun = 'mpirun'; -mpirun = '/opt/homebrew/bin/mpirun'; % for macos +mpirun = 'mpirun'; +% mpirun = '/opt/homebrew/bin/mpirun'; % for macos addpath(genpath([gyacomodir,'matlab'])) % Add matlab folder addpath(genpath([gyacomodir,'matlab/plot'])) % Add plot folder addpath(genpath([gyacomodir,'matlab/compute'])) % Add compute folder @@ -24,20 +24,23 @@ EXECNAME = 'gyacomo23_sp'; % single precision % run lin_DTT_HM_rho85 % run lin_DTT_HM_rho98 % run lin_DTT_LM_rho90 -run lin_DTT_LM_rho95 -% run lin_JET_rho97 +% run lin_DTT_LM_rho95 +run lin_JET_rho97 % run lin_Entropy % run lin_ITG +% run lin_KBM %% Change parameters NY = 2; -PMAX = 4; +NX = 4; +PMAX = 2; JMAX = PMAX/2; -ky = 1.0; +ky = 0.5; LY = 2*pi/ky; -DT = 1e-5; -% SIGMA_E = 0.04; -TMAX = 10; -DTSAVE0D = 200*DT; +DT = 1e-3; +TMAX = 10; +% % SIGMA_E = 0.04; +% TMAX = 10; +% DTSAVE0D = 200*DT; DTSAVE3D = TMAX/50; %%------------------------------------------------------------------------- %% RUN diff --git a/wk/lin_scan_script.m b/wk/lin_scan_script.m index a587fc23..fa4b3509 100644 --- a/wk/lin_scan_script.m +++ b/wk/lin_scan_script.m @@ -16,37 +16,41 @@ addpath(genpath([gyacomodir,'wk/parameters'])) % Add parameters folder %% Setup run or load an executable RUN = 1; % To run or just to load -RERUN = 1; % rerun if the data does not exist +RERUN = 0; % rerun if the data does not exist default_plots_options EXECNAME = 'gyacomo23_sp'; % single precision % EXECNAME = 'gyacomo23_dp'; % double precision -%% Setup basic parameters -run lin_DTT_AB_rho85_PT +%% Setup parameters +% run lin_DTT_AB_rho85 +% run lin_DTT_AB_rho98 +run lin_JET_rho97 % run lin_Entropy % run lin_ITG -%% Modify parameters -% NZ = 1; -NY = 2; -DT = 0.5e-3; -TMAX = 50; -MU_X = 0.1; MU_Y = 0.1; +%% Change parameters +NY = 2; +% SIGMA_E = 0.023; %% Scan parameters SIMID = [SIMID,'_scan']; P_a = [2 4 6 8]; -ky_a = 0.05:0.05:1.5; +ky_a = logspace(-1.5,1.5,30); %% Scan loop % arrays for the result -g_ky = zeros(numel(ky_a),numel(P_a),2); -g_avg= g_ky*0; +g_ky = zeros(numel(ky_a),numel(P_a)); g_std= g_ky*0; +w_ky = g_ky*0; +w_std= g_ky*0; j = 1; for PMAX = P_a JMAX = P/2; i = 1; for ky = ky_a - LY = 2*pi/ky; + LY = 2*pi/ky; + DT = 1e-4;%min(1e-2,1e-3/ky); + TMAX = 10;%min(10,1.5/ky); + DTSAVE0D = 0.1; + DTSAVE3D = 0.1; %% RUN setup % naming @@ -67,8 +71,7 @@ for PMAX = P_a end data_ = compile_results_low_mem(data_,LOCALDIR,00,00); [data_.PHI, data_.Ts3D] = compile_results_3D(LOCALDIR,00,00,'phi'); - if numel(data_.Ts3D)>10 - if numel(data_.Ts3D)>5 + if numel(data_.Ts0D)>10 % Load results after trying to run filename = [SIMID,'/',PARAMS,'/']; LOCALDIR = [gyacomodir,'results/',filename,'/']; @@ -83,23 +86,14 @@ for PMAX = P_a [~,it1] = min(abs(data_.Ts3D-0.5*data_.Ts3D(end))); % start of the measurement time window [~,it2] = min(abs(data_.Ts3D-1.0*data_.Ts3D(end))); % end of ... - field = 0; - field_t = 0; - for ik = 2:NY/2+1 - field = squeeze(sum(abs(data_.PHI),3)); % take the sum over z - field_t = squeeze(field(ik,1,:)); % take the kx =0, ky = ky mode only - to_measure = log(field_t(it1:it2)); - tw = double(data_.Ts3D(it1:it2)); - % gr = polyfit(tw,to_measure,1); - gr = fit(tw,to_measure,'poly1'); - err= confint(gr); - g_ky(i,j,ik) = gr.p1; - g_std(i,j,ik) = abs(err(2,1)-err(1,1))/2; - end + [wkykx,ekykx] = compute_growth_rates(data_.PHI(:,:,:,it1:it2),data_.Ts3D(it1:it2)); + g_ky (i,j) = real(wkykx(2,1,end)); + g_std(i,j) = real(ekykx(2,1)); + w_ky (i,j) = imag(wkykx(2,1,end)); + w_std(i,j) = imag(ekykx(2,1)); [gmax, ikmax] = max(g_ky(i,j,:)); msg = sprintf('gmax = %2.2f, kmax = %2.2f',gmax,data_.grids.ky(ikmax)); disp(msg); - end end i = i + 1; end @@ -107,11 +101,11 @@ for PMAX = P_a end %% take max growth rate among z coordinate -y_ = g_ky(:,:,2); -e_ = g_std(:,:,2); +y_ = g_ky + 1i*w_ky; +e_ = g_std+ 1i*w_std; %% Save scan results (gamma) -if(numel(ky_a)>1 && numel(P_a)>1) +if(numel(ky_a)>1 || numel(P_a)>1) pmin = num2str(min(P_a)); pmax = num2str(max(P_a)); kymin = num2str(min(ky_a)); kymax= num2str(max(ky_a)); filename = [num2str(NX),'x',num2str(NZ),... diff --git a/wk/load_metadata_scan.m b/wk/load_metadata_scan.m index 600797d1..6615ee53 100644 --- a/wk/load_metadata_scan.m +++ b/wk/load_metadata_scan.m @@ -13,26 +13,32 @@ addpath(genpath([gyacomodir,'matlab/load'])) % ... add% EXECNAME = 'gyacomo_1.0' % datafname = 'lin_DTT_AB_rho85_PT_scan/16x24_ky_0.1_0.5_P_2_8_DGGK_0.05_be_0.0034.mat'; % datafname = 'lin_DTT_AB_rho85_PT_scan/16x24_ky_0.1_0.5_P_2_8_DGGK_0.05_be_0.0039.mat'; % datafname = 'lin_DTT_AB_rho85_PT_scan/16x24_ky_0.1_1_P_2_8_DGGK_0.05_be_0.0039.mat'; -datafname = 'lin_DTT_AB_rho85_PT_scan/16x24_ky_0.1_0.9_P_2_8_kN_1.33_DGGK_0.56901_be_0.0039.mat'; +% datafname = 'lin_DTT_AB_rho85_PT_scan/16x24_ky_0.1_0.9_P_2_8_kN_1.33_DGGK_0.56901_be_0.0039.mat'; % datafname = 'lin_DTT_AB_rho85_PT_scan/8x24_ky_0.05_1.5_P_2_8_kN_1.33_DGGK_0.1_be_0.0039.mat'; +% datafname = 'lin_JET_rho97_scan/4x32_ky_0.01_10_P_2_8_kN_10_DGGK_0.1_be_0.0031.mat'; +% datafname = 'lin_JET_rho97_scan/4x32_ky_0.01_10_P_2_8_kN_10_DGGK_0.05_be_0.0031.mat'; +% datafname = 'lin_JET_rho97_scan/8x32_ky_0.01_10_P_2_8_kN_10_DGGK_0.05_be_0.0031.mat'; +% datafname = 'lin_JET_rho97_scan/8x32_ky_0.01_10_P_2_2_kN_10_DGGK_0.05_be_0.0031.mat'; +datafname = 'lin_JET_rho97_scan/8x32_ky_0.031623_31.6228_P_2_2_kN_10_DGGK_0.1_be_0.0031.mat'; %% Chose if we filter gamma>0.05 FILTERGAMMA = 0; %% Load data fname = ['../results/',datafname]; d = load(fname); +gamma = real(d.data); g_err = real(d.err); +omega = imag(d.data); w_err = imag(d.err); if FILTERGAMMA - d.data = d.data.*(d.data>0.025); - d.err = d.err.*(d.data>0.025); + d.data = real(gamma).*(real(gamma)>0.025) + imag(gamma); end if 0 %% Pcolor of the peak figure; % [XX_,YY_] = meshgrid(d.s1,d.s2); [XX_,YY_] = meshgrid(1:numel(d.s1),1:numel(d.s2)); -pclr=imagesc_custom(XX_,YY_,d.data'.*(d.data>0)'); -% pclr=contourf(1:numel(d.s1),1:numel(d.s2),d.data'.*(d.data>0)'); -% pclr=surf(1:numel(d.s1),1:numel(d.s2),d.data'.*(d.data>0)'); +pclr=imagesc_custom(XX_,YY_,gamma'.*(gamma>0)'); +% pclr=contourf(1:numel(d.s1),1:numel(d.s2),gamma'.*(gamma>0)'); +% pclr=surf(1:numel(d.s1),1:numel(d.s2),gamma'.*(gamma>0)'); title(d.title); xlabel(d.s1name); ylabel(d.s2name); set(gca,'XTick',1:numel(d.s1),'XTicklabel',d.s1) @@ -48,23 +54,40 @@ if 1 %% Scan along first dimension figure colors_ = jet(numel(d.s2)); +subplot(121) for i = 1:numel(d.s2) - % plot(d.s1,d.data(:,i),'s-',... - plot(d.s1(d.data(:,i)>0),d.data((d.data(:,i)>0),i),'s-',... - 'LineWidth',2.0,... - 'DisplayName',[d.s2name,'=',num2str(d.s2(i))],... - 'color',colors_(i,:)); - % errorbar(d.s1,d.data(:,i),d.err(:,i),'s-',... - % 'LineWidth',2.0,... - % 'DisplayName',[d.s2name,'=',num2str(d.s2(i))],... - % 'color',colors_(i,:)); + % plot(d.s1,gamma(:,i),'s-',... + % plot(d.s1(gamma(:,i)>0),gamma((gamma(:,i)>0),i),'s-',... + % 'LineWidth',2.0,... + % 'DisplayName',[d.s2name,'=',num2str(d.s2(i))],... + % 'color',colors_(i,:)); + errorbar(d.s1,gamma(:,i),g_err(:,i),'s-',... + 'LineWidth',2.0,... + 'DisplayName',[d.s2name,'=',num2str(d.s2(i))],... + 'color',colors_(i,:)); hold on; end xlabel(d.s1name); ylabel(d.dname);title(d.title); xlim([d.s1(1) d.s1(end)]); + +subplot(122) +for i = 1:numel(d.s2) + % plot(d.s1,gamma(:,i),'s-',... + % plot(d.s1(gamma(:,i)>0),gamma((gamma(:,i)>0),i),'s-',... + % 'LineWidth',2.0,... + % 'DisplayName',[d.s2name,'=',num2str(d.s2(i))],... + % 'color',colors_(i,:)); + errorbar(d.s1,omega(:,i),w_err(:,i),'s-',... + 'LineWidth',2.0,... + 'DisplayName',[d.s2name,'=',num2str(d.s2(i))],... + 'color',colors_(i,:)); + hold on; +end +xlabel(d.s1name); ylabel('$\omega c_s/R$');title(d.title); +xlim([d.s1(1) d.s1(end)]); + colormap(colors_); clb = colorbar; -% caxis([d.s2(1)-0.5,d.s2(end)+0.5]); clim([1 numel(d.s2)+1]); clb.Ticks=linspace(d.s2(1),d.s2(end),numel(d.s2)); clb.Ticks =1.5:numel(d.s2)+1.5; @@ -78,11 +101,11 @@ if 0 figure colors_ = jet(numel(d.s1)); for i = 1:numel(d.s1) - plot(d.s2,d.data(i,:),'s-',... + plot(d.s2,gamma(i,:),'s-',... 'LineWidth',2.0,... 'DisplayName',[d.s1name,'=',num2str(d.s1(i))],... 'color',colors_(i,:)); -% errorbar(d.s2,d.data(i,:),d.err(i,:),'s-',... +% errorbar(d.s2,gamma(i,:),g_err(i,:),'s-',... % 'LineWidth',2.0,... % 'DisplayName',[d.s1name,'=',num2str(d.s1(i))],... % 'color',colors_(i,:)); @@ -104,13 +127,13 @@ end if 0 %% Convergence analysis figure -% target_ = 0.25*(d.data(end,end)+d.data(end-i_,end)+d.data(end,end-i_)+d.data(end-i_,end-i_)); +% target_ = 0.25*(gamma(end,end)+gamma(end-i_,end)+gamma(end,end-i_)+gamma(end-i_,end-i_)); colors_ = jet(numel(d.s1)); for i = 1:numel(d.s1) -% target_ = d.data(i,end); +% target_ = gamma(i,end); target_ = 2.79666916212537142172e-01; % Value for nuDGDK = 0.05, kT=6.96, (40,20), Nkx=8 if target_ > 0 - eps_ = abs(target_ - d.data(i,1:end-1))/abs(target_); + eps_ = abs(target_ - gamma(i,1:end-1))/abs(target_); semilogy(d.s2(1:end-1),eps_,'-s',... 'LineWidth',2.0,... 'DisplayName',[d.s1name,'=',num2str(d.s1(i))],... @@ -140,30 +163,30 @@ figure; i_ = 0; % target_ = 1.39427e-01; % Value for nuDGDK = 0.001, kT=5.3, (30,16), Nkx=8 target_ = 2.72510405826983714839e-01 % Value for nuDGDK = 0.001, kT=6.96, (50,25), Nkx=8 % target_ = 2.73048910051283844069e-01; % Value for nuDGDK = 0.0, kT=6.96, (40,20), Nkx=8 -% target_ = 0.25*(d.data(end,end)+d.data(end-i_,end)+d.data(end,end-i_)+d.data(end-i_,end-i_)); -% eps_ = log(abs(target_ - d.data)/abs(target_)); -eps_ = max(-10,log(abs(target_ - d.data)/abs(target_))); -sign_ = 1;%sign(d.data - target_); -eps_ = d.data; +% target_ = 0.25*(gamma(end,end)+gamma(end-i_,end)+gamma(end,end-i_)+gamma(end-i_,end-i_)); +% eps_ = log(abs(target_ - gamma)/abs(target_)); +eps_ = max(-10,log(abs(target_ - gamma)/abs(target_))); +sign_ = 1;%sign(gamma - target_); +eps_ = gamma; for i = 1:numel(d.s1) for j = 1:numel(d.s2) - % target_ = d.data(i,end); - % target_ = d.data(i,end); - % target_ = d.data(end,j); - eps_(i,j) = log(abs(target_ - d.data(i,j))/target); + % target_ = gamma(i,end); + % target_ = gamma(i,end); + % target_ = gamma(end,j); + eps_(i,j) = log(abs(target_ - gamma(i,j))/target); if target_ > 0 - % eps_(i,:) = max(-12,log(abs(target_ - d.data(i,1:end))/abs(target_))); - % eps_(i,:) = log(abs(target_ - d.data(i,1:end))/abs(target_)); - % eps_(i,:) = min(100,100*abs(target_ - d.data(i,1:end))/abs(target_)); + % eps_(i,:) = max(-12,log(abs(target_ - gamma(i,1:end))/abs(target_))); + % eps_(i,:) = log(abs(target_ - gamma(i,1:end))/abs(target_)); + % eps_(i,:) = min(100,100*abs(target_ - gamma(i,1:end))/abs(target_)); else end end end [XX_,YY_] = meshgrid(d.s1,d.s2); [XX_,YY_] = meshgrid(1:numel(d.s1),1:numel(d.s2)); -pclr=imagesc_custom(XX_,YY_,eps_'.*(d.data>0)'.*sign_'); -% pclr=contourf(1:numel(d.s1),1:numel(d.s2),eps_'.*(d.data>0)'.*sign_',5); -% pclr=surf(1:numel(d.s1),1:numel(d.s2),eps_'.*(d.data>0)'.*sign_'); +pclr=imagesc_custom(XX_,YY_,eps_'.*(gamma>0)'.*sign_'); +% pclr=contourf(1:numel(d.s1),1:numel(d.s2),eps_'.*(gamma>0)'.*sign_',5); +% pclr=surf(1:numel(d.s1),1:numel(d.s2),eps_'.*(gamma>0)'.*sign_'); title(d.title); xlabel(d.s1name); ylabel(d.s2name); set(gca,'XTick',1:numel(d.s1),'XTicklabel',d.s1) -- GitLab