diff --git a/matlab/compute/invert_kxky_to_kykx_gene_results.m b/matlab/compute/invert_kxky_to_kykx_gene_results.m new file mode 100644 index 0000000..904bc6d --- /dev/null +++ b/matlab/compute/invert_kxky_to_kykx_gene_results.m @@ -0,0 +1,21 @@ +function [ data ] = invert_kxky_to_kykx_gene_results( data ) +%to go from nkx nky Gene representation to nky nkx HeLaZ one + +rotate = @(x) permute(x,[2 1 3 4]); + +data.PHI = rotate(data.PHI); +data.DENS_I = rotate(data.DENS_I); +data.TPER_I = rotate(data.TPER_I); +data.TPAR_I = rotate(data.TPAR_I); +data.TEMP_I = rotate(data.TEMP_I); + +data.Ny = data.Nky*2-1; +data.Nx = data.Nkx; + +dkx = data.kx(2); dky = data.ky(2); +Lx = 2*pi/dkx; Ly = 2*pi/dky; +x = linspace(-Lx/2,Lx/2,data.Nx+1); x = x(1:end-1); +y = linspace(-Ly/2,Ly/2,data.Ny+1); y = y(1:end-1); +data.x = x; data.y = y; data.Lx = Lx; data.Ly = Ly; +end + diff --git a/matlab/plot/plot_radial_transport_and_spacetime.m b/matlab/plot/plot_radial_transport_and_spacetime.m index 1957f42..0e81e20 100644 --- a/matlab/plot/plot_radial_transport_and_spacetime.m +++ b/matlab/plot/plot_radial_transport_and_spacetime.m @@ -1,145 +1,120 @@ -function [FIGURE] = plot_radial_transport_and_spacetime(DATA, TAVG_0, TAVG_1,stfname,Nmvm, COMPZ) +function [FIGURE] = plot_radial_transport_and_spacetime(DATA, OPTIONS) %Compute steady radial transport - tend = TAVG_1; tstart = TAVG_0; + tend = OPTIONS.TAVG_1; tstart = OPTIONS.TAVG_0; [~,its0D] = min(abs(DATA.Ts0D-tstart)); [~,ite0D] = min(abs(DATA.Ts0D-tend)); SCALE = DATA.scale;%(1/DATA.Nx/DATA.Ny)^2; Gx_infty_avg = mean(DATA.PGAMMA_RI(its0D:ite0D))*SCALE; Gx_infty_std = std (DATA.PGAMMA_RI(its0D:ite0D))*SCALE; Qx_infty_avg = mean(DATA.HFLUX_X(its0D:ite0D))*SCALE; Qx_infty_std = std (DATA.HFLUX_X(its0D:ite0D))*SCALE; [~,ikzf] = max(squeeze(mean(abs(squeeze(DATA.PHI(:,1,1,:))),2))); Ns3D = numel(DATA.Ts3D); [KX, KY] = meshgrid(DATA.kx, DATA.ky); - z = DATA.z; %% computations % Compute Gamma from ifft matlab Gx = zeros(DATA.Ny,DATA.Nx,numel(DATA.Ts3D)); for it = 1:numel(DATA.Ts3D) for iz = 1:DATA.Nz Gx(:,:,it) = Gx(:,:,it) + ifourier_GENE(-1i*KY.*(DATA.PHI(:,:,iz,it)))... .*ifourier_GENE(DATA.DENS_I(:,:,iz,it)); end Gx(:,:,it) = Gx(:,:,it)/DATA.Nz; end Gx_t_mtlb = squeeze(mean(mean(Gx,1),2)); % Compute Heat flux from ifft matlab Qx = zeros(DATA.Ny,DATA.Nx,numel(DATA.Ts3D)); for it = 1:numel(DATA.Ts3D) for iz = 1:DATA.Nz Qx(:,:,it) = Qx(:,:,it) + ifourier_GENE(-1i*KY.*(DATA.PHI(:,:,iz,it)))... .*ifourier_GENE(DATA.TEMP_I(:,:,iz,it)); end Qx(:,:,it) = Qx(:,:,it)/DATA.Nz; end Qx_t_mtlb = squeeze(mean(mean(Qx,1),2)); % zonal vs nonzonal energies for phi(t) E_Zmode_SK = zeros(1,Ns3D); E_NZmode_SK = zeros(1,Ns3D); for it = 1:numel(DATA.Ts3D) E_Zmode_SK(it) = squeeze(DATA.ky(ikzf).^2.*abs(DATA.PHI(ikzf,1,1,it))^2); E_NZmode_SK(it) = squeeze(sum(sum(((1+KX.^2+KY.^2).*abs(DATA.PHI(:,:,1,it)).^2.*(KY~=0))))); end [~,its3D] = min(abs(DATA.Ts3D-tstart)); [~,ite3D] = min(abs(DATA.Ts3D-tend)); %% Figure -mvm = @(x) movmean(x,Nmvm); +mvm = @(x) movmean(x,OPTIONS.NMVA); FIGURE.fig = figure; FIGURE.FIGNAME = ['ZF_transport_drphi','_',DATA.PARAMS]; set(gcf, 'Position', [100, 100, 1000, 600]) subplot(311) yyaxis left plot(mvm(DATA.Ts0D),mvm(DATA.PGAMMA_RI*SCALE),'DisplayName','$\langle n_i \partial_y\phi \rangle_y$'); hold on; plot(mvm(DATA.Ts3D),mvm(Gx_t_mtlb),'DisplayName','matlab comp.'); hold on; plot(DATA.Ts0D(its0D:ite0D),ones(ite0D-its0D+1,1)*Gx_infty_avg, '-k',... 'DisplayName',['$\Gamma^{\infty} = $',num2str(Gx_infty_avg),'$\pm$',num2str(Gx_infty_std)]); ylabel('$\Gamma_x$') ylim([0,5*abs(Gx_infty_avg)]); xlim([DATA.Ts0D(1),DATA.Ts0D(end)]); yyaxis right plot(mvm(DATA.Ts0D),mvm(DATA.HFLUX_X*SCALE),'DisplayName','$\langle n_i \partial_y\phi \rangle_y$'); hold on; plot(mvm(DATA.Ts3D),mvm(Qx_t_mtlb),'DisplayName','matlab comp.'); hold on; plot(DATA.Ts0D(its0D:ite0D),ones(ite0D-its0D+1,1)*Qx_infty_avg, '-k',... 'DisplayName',['$Q_x^{\infty} = $',num2str(Qx_infty_avg),'$\pm$',num2str(Qx_infty_std)]); ylabel('$Q_x$') ylim([0,5*abs(Qx_infty_avg)]); xlim([DATA.Ts0D(1),DATA.Ts0D(end)]); grid on; set(gca,'xticklabel',[]); title({DATA.param_title,... ['$\Gamma^{\infty} = $',num2str(Gx_infty_avg),'$, Q^{\infty} = $',num2str(Qx_infty_avg)]}); %% radial shear radial profile % computation Ns3D = numel(DATA.Ts3D); - [KY, KX] = meshgrid(DATA.ky, DATA.kx); - plt = @(x) mean(x(:,:,1,:),1); + [KX, KY] = meshgrid(DATA.kx, DATA.ky); + plt = @(x) mean(x(:,:,:),1); kycut = max(DATA.ky); kxcut = max(DATA.kx); LP = (abs(KY)<kycut).*(abs(KX)<kxcut); %Low pass filter - switch COMPZ - case 'avg' - compz = @(f) mean(f,3); - nameL = '$\langle$ '; - nameR = ' $\rangle_{z}$'; - otherwise - compz = @(f) f(:,:,COMPZ); - nameL = ''; - nameR = [' $(z=',num2str(z(COMPZ)),')$']; - end - switch stfname - case 'phi' - phi = zeros(DATA.Ny,DATA.Nx,1,Ns3D); - for it = 1:numel(DATA.Ts3D) - phi(:,:,1,it) = ifourier_GENE(compz(DATA.PHI(:,:,:,it))); - end - f2plot = phi; fname = '$\phi$'; - case 'v_y' - dxphi = zeros(DATA.Nx,DATA.Ny,1,Ns3D); - for it = 1:numel(DATA.Ts3D) - dxphi(:,:,1,it) = ifourier_GENE(-1i*KX.*compz(DATA.PHI(:,:,:,it)).*LP); - end - f2plot = dxphi; fname = '$\langle \partial_x\phi\rangle_y$'; - case 'v_x' - dyphi = zeros(DATA.Nx,DATA.Ny,1,Ns3D); - for it = 1:numel(DATA.Ts3D) - dyphi(:,:,1,it) = ifourier_GENE(1i*KY.*compz(DATA.PHI(:,:,:,it)).*LP); - end - f2plot = dyphi; fname = '$\langle \partial_y\phi\rangle_y$'; - case 'szf' - dx2phi = zeros(DATA.Nx,DATA.Ny,1,Ns3D); - for it = 1:numel(DATA.Ts3D) - dx2phi(:,:,1,it) = ifourier_GENE(-KX.^2.*compz(DATA.PHI(:,:,:,it)).*LP); - end - f2plot = dx2phi; fname = '$\langle \partial_x^2\phi\rangle_y$'; - end - clim = max(max(abs(plt(f2plot(:,:,1,its3D:ite3D))))); + + OPTIONS.NAME = OPTIONS.ST_FIELD; + OPTIONS.PLAN = 'xy'; + OPTIONS.COMP = 'avg'; + OPTIONS.TIME = DATA.Ts3D; + OPTIONS.POLARPLOT = 0; + toplot = process_field(DATA,OPTIONS); + f2plot = toplot.FIELD; + + clim = max(max(max(abs(plt(f2plot(:,:,its3D:ite3D)))))); subplot(313) [TY,TX] = meshgrid(DATA.x,DATA.Ts3D); pclr = pcolor(TX,TY,squeeze(plt(f2plot))'); set(pclr, 'edgecolor','none'); - legend([nameL,fname,nameR]) %colorbar; + legend(['$\langle ',OPTIONS.ST_FIELD,' \rangle_{y,z}$']) %colorbar; caxis(clim*[-1 1]); cmap = bluewhitered(256); colormap(cmap) xlabel('$t c_s/R$'), ylabel('$x/\rho_s$'); - if strcmp(stfname,'Gx') + if OPTIONS.INTERP + shading interp + end + if strcmp(OPTIONS.ST_FIELD,'Gx') subplot(311) plot(DATA.Ts3D,squeeze(mean(plt(f2plot),1))); end %% Zonal vs NZonal energies subplot(312) it0 = 1; itend = Ns3D; trange = it0:itend; plt1 = @(x) x;%-x(1); plt2 = @(x) x./max((x(its3D:ite3D))); toplot = sum(squeeze(plt(f2plot)).^2,1); %ST from before % plty = @(x) x(500:end)./max(squeeze(x(500:end))); yyaxis left % plot(plt1(DATA.Ts3D(trange)),plt2(E_Zmode_SK(trange)),'DisplayName','$k_{zf}^2|\phi_{kzf}|^2$'); plot(plt1(DATA.Ts3D(trange)),plt2(toplot(trange)),'DisplayName','Sum $A^2$'); ylim([-0.1, 1.5]); ylabel('$E_{Z}$') yyaxis right plot(plt1(DATA.Ts3D(trange)),plt2(E_NZmode_SK(trange)),'DisplayName','$(1+k^2)|\phi^k|^2$'); xlim([DATA.Ts3D(it0), DATA.Ts3D(itend)]); ylim([-0.1, 1.5]); ylabel('$E_{NZ}$') xlabel('$t c_s/R$'); grid on; set(gca,'xticklabel',[]);% xlim([0 500]); end \ No newline at end of file diff --git a/matlab/plot/real_plot_1D.m b/matlab/plot/real_plot_1D.m index ec3217f..d0e93cd 100644 --- a/matlab/plot/real_plot_1D.m +++ b/matlab/plot/real_plot_1D.m @@ -1,171 +1,175 @@ function [ FIGURE ] = real_plot_1D( data, options ) +nplots = 0; +if data.Nx > 1; nplots = nplots + 1; end; +if data.Ny > 1; nplots = nplots + 1; end; +if data.Nz > 1; nplots = nplots + 1; end; + options.PLAN = 'xy'; options.COMP = options.COMPZ; options.POLARPLOT = 0; options.INTERP = 0; toplot = process_field(data,options); t = data.Ts3D; frames = toplot.FRAMES; colors = jet(numel(frames)); switch options.NAME case '\Gamma_x' FIGURE.fig = figure; FIGURE.FIGNAME = ['transport_1D_avg_',data.PARAMS]; yname = '\Gamma'; case 'v_y' FIGURE.fig = figure; FIGURE.FIGNAME = ['ZF_1D_avg_',data.PARAMS]; yname = 'v_y'; case 's_y' FIGURE.fig = figure; FIGURE.FIGNAME = ['ZS_1D_avg_',data.PARAMS]; yname = 's_y'; case '\phi' FIGURE.fig = figure; FIGURE.FIGNAME = ['phi_1D_avg_',data.PARAMS]; yname = '\phi'; case 'n_i' FIGURE.fig = figure; FIGURE.FIGNAME = ['ni_1D_avg_',data.PARAMS]; yname = 'n_i'; case 'n_e' FIGURE.fig = figure; FIGURE.FIGNAME = ['ne_1D_avg_',data.PARAMS]; yname = 'n_e'; end switch options.COMPX case 'avg' - compx = @(x) mean(x,1); + compx = @(x) mean(x,2); ynamex = ['$\langle ',yname,'\rangle_x$']; otherwise - compx = @(x) x(1,:); + compx = @(x) x(:,1); ynamex = ['$',yname,'(y,x=0)$']; end switch options.COMPY case 'avg' - compy = @(x) mean(x,2); + compy = @(x) mean(x,1); ynamey = ['$\langle ',yname,'\rangle_y$']; otherwise - compy = @(x) x(:,1); + compy = @(x) x(1,:); ynamey = ['$',yname,'(x,y=0)$']; end set(gcf, 'Position', [20 50 1000 500]) -subplot(1,3,1) +subplot(1,nplots,1) X = data.x; xname = '$x$'; switch options.COMPT case 'avg' Y = compy(mean(toplot.FIELD(:,:,:),3)); Y = squeeze(Y); if options.NORM Y = Y./max(abs(Y)); end plot(X,Y,'DisplayName',['$t\in[',num2str(t(frames(1))),',',num2str(t(frames(end))),']$'],... 'Color',colors(1,:)); hold on; legend('show') otherwise for it = 1:numel(toplot.FRAMES) - Y = compy(toplot.FIELD(:,:,toplot.FRAMES(it))); + Y = compy(toplot.FIELD(:,:,it)); Y = squeeze(Y); if options.NORM Y = Y./max(abs(Y)); end plot(X,Y,'DisplayName',['$t=',num2str(t(frames(it))),'$'],... 'Color',colors(it,:)); hold on; end legend('show','Location','eastoutside') end grid on xlabel(xname); ylabel(ynamey) xlim([min(X),max(X)]); -subplot(1,3,2) +subplot(1,nplots,2) X = data.y; xname = '$y$'; switch options.COMPT case 'avg' Y = compx(mean(toplot.FIELD(:,:,:),3)); Y = squeeze(Y); if options.NORM Y = Y./max(abs(Y)); end plot(X,Y,'DisplayName',['$t\in[',num2str(t(frames(1))),',',num2str(t(frames(end))),']$'],... 'Color',colors(1,:)); hold on; legend('show') otherwise for it = 1:numel(toplot.FRAMES) - Y = compx(toplot.FIELD(:,:,toplot.FRAMES(it))); + Y = compx(toplot.FIELD(:,:,it)); Y = squeeze(Y); if options.NORM Y = Y./max(abs(Y)); end plot(X,Y,'DisplayName',['$t=',num2str(t(frames(it))),'$'],... 'Color',colors(it,:)); hold on; end legend('show','Location','eastoutside') end grid on % title('HeLaZ $k_y$ transport spectrum'); legend('show','Location','eastoutside'); xlabel(xname); ylabel(ynamex) xlim([min(X),max(X)]); %% Z plot if data.Nz > 1 options.PLAN = 'yz'; options.COMP = options.COMPX; options.POLARPLOT = 0; options.INTERP = 0; toplot = process_field(data,options); t = data.Ts3D; frames = toplot.FRAMES; -end switch options.COMPZ case 'avg' compz = @(x) mean(x,1); ynamez = ['$\langle ',yname,'\rangle_y$']; otherwise compz = @(x) x(1,:); ynamez = ['$',yname,'(z,y=0)$']; end -subplot(1,3,3) +subplot(1,nplots,3) X = data.z; xname = '$z$'; switch options.COMPT case 'avg' Y = compz(mean(toplot.FIELD(:,:,:),3)); Y = squeeze(Y); if options.NORM Y = Y./max(abs(Y)); end plot(X,Y,'DisplayName',['$t\in[',num2str(t(frames(1))),',',num2str(t(frames(end))),']$'],... 'Color',colors(1,:)); hold on; legend('show') otherwise for it = 1:numel(toplot.FRAMES) Y = compx(toplot.FIELD(:,:,toplot.FRAMES(it))); Y = squeeze(Y); if options.NORM Y = Y./max(abs(Y)); end plot(X,Y,'DisplayName',['$t=',num2str(t(frames(it))),'$'],... 'Color',colors(it,:)); hold on; end legend('show','Location','eastoutside') end grid on % title('HeLaZ $k_y$ transport spectrum'); legend('show','Location','eastoutside'); xlabel(xname); ylabel(ynamez) xlim([min(X),max(X)]); end - +end diff --git a/matlab/plot/show_geometry.m b/matlab/plot/show_geometry.m index 926eef8..0723b80 100644 --- a/matlab/plot/show_geometry.m +++ b/matlab/plot/show_geometry.m @@ -1,111 +1,110 @@ function [ FIGURE ] = show_geometry(DATA,OPTIONS) % filtering Z pinch and torus if DATA.Nz > 1 % Torus flux tube geometry Nptor = DATA.Nz; Tgeom = 1; Nturns = 1; a = DATA.EPS; % Torus minor radius R = 1.; % Torus major radius q = (DATA.Nz>1)*DATA.Q0; % Flux tube safety factor theta = linspace(-pi, pi, Nptor) ; % Poloidal angle phi = linspace(0., 2.*pi, Nptor) ; % Toroidal angle [t, p] = meshgrid(phi, theta); x_tor = (R + a.*cos(p)) .* cos(t); y_tor = (R + a.*cos(p)) .* sin(t); z_tor = a.*sin(p); DIMENSIONS = [50 50 1200 600]; else % Zpinch geometry Nturns = 0.1; Tgeom = 0; a = 0.7; % Torus minor radius R = 0; % Torus major radius q = 0; theta = linspace(-Nturns*pi, Nturns*pi, 100); % Poloidal angle phi = linspace(-0.1, 0.1, 5); % cylinder height [t, p] = meshgrid(phi, theta); x_tor = a.*cos(p); z_tor = a.*sin(p); y_tor = t; DIMENSIONS = [50 50 numel(OPTIONS.TIME)*400 500]; end % field line coordinates Xfl = @(z) (R+a*cos(z)).*cos(q*z); Yfl = @(z) (R+a*cos(z)).*sin(q*z); Zfl = @(z) a*sin(z); Rvec= @(z) [Xfl(z); Yfl(z); Zfl(z)]; % xvec xX = @(z) (Xfl(z)-R*cos(q*z))./sqrt((Xfl(z)-R*cos(q*z)).^2+(Yfl(z)-R*sin(q*z)).^2+Zfl(z).^2); xY = @(z) (Yfl(z)-R*sin(q*z))./sqrt((Xfl(z)-R*cos(q*z)).^2+(Yfl(z)-R*sin(q*z)).^2+Zfl(z).^2); xZ = @(z) Zfl(z)./sqrt((Xfl(z)-R*cos(q*z)).^2+(Yfl(z)-R*sin(q*z)).^2+Zfl(z).^2); xvec= @(z) [xX(z); xY(z); xZ(z)]; % bvec bX = @(z) Tgeom*(a*cos(z).*cos(q*z) - q*Yfl(z))./sqrt(Tgeom*(a*cos(z).*cos(q*z) - q*Yfl(z)).^2+(a*cos(z).*sin(q*z) + q*Xfl(z)).^2+(a*cos(z)).^2); bY = @(z) (a*cos(z).*sin(q*z) + q*Xfl(z))./sqrt(Tgeom*(a*cos(z).*cos(q*z) - q*Yfl(z)).^2+(a*cos(z).*sin(q*z) + q*Xfl(z)).^2+(a*cos(z)).^2); bZ = @(z) a*cos(z)./sqrt(Tgeom*(a*cos(z).*cos(q*z) - q*Yfl(z)).^2+(a*cos(z).*sin(q*z) + q*Xfl(z)).^2+(a*cos(z)).^2); bvec= @(z) [bX(z); bY(z); bZ(z)]; % yvec = b times x yX = @(z) bY(z).*xZ(z)-bZ(z).*xY(z)./sqrt((bY(z).*xZ(z)-bZ(z).*xY(z)).^2+(bZ(z).*xX(z)-bX(z).*xZ(z)).^2+(bX(z).*xY(z)-bY(z).*xX(z)).^2); yY = @(z) bZ(z).*xX(z)-bX(z).*xZ(z)./sqrt((bY(z).*xZ(z)-bZ(z).*xY(z)).^2+(bZ(z).*xX(z)-bX(z).*xZ(z)).^2+(bX(z).*xY(z)-bY(z).*xX(z)).^2); yZ = @(z) bX(z).*xY(z)-bY(z).*xX(z)./sqrt((bY(z).*xZ(z)-bZ(z).*xY(z)).^2+(bZ(z).*xX(z)-bX(z).*xZ(z)).^2+(bX(z).*xY(z)-bY(z).*xX(z)).^2); yvec= @(z) [yX(z); yY(z); yZ(z)]; % Plot high res field line % Planes plot theta = DATA.z ; % Poloidal angle % Plot x,y,bvec at these points scale = 0.10; %% Plot plane result OPTIONS.POLARPLOT = 0; OPTIONS.PLAN = 'xy'; r_o_R = DATA.rho_o_R; -[Y,X] = meshgrid(r_o_R*DATA.y,r_o_R*DATA.x); +[X,Y] = meshgrid(r_o_R*DATA.x,r_o_R*DATA.y); max_ = 0; -FIELDS = zeros(DATA.Nx,DATA.Ny,DATA.Nz); +FIELDS = zeros(DATA.Ny,DATA.Nx,DATA.Nz); FIGURE.fig = figure; FIGURE.FIGNAME = ['geometry','_',DATA.PARAMS]; set(gcf, 'Position', DIMENSIONS) for it_ = 1:numel(OPTIONS.TIME) subplot(1,numel(OPTIONS.TIME),it_) %plot magnetic geometry if OPTIONS.PLT_MTOPO magnetic_topo=surf(x_tor, y_tor, z_tor); hold on;alpha 1.0;%light('Position',[-1 1 1],'Style','local') set(magnetic_topo,'edgecolor',[1 1 1]*0.7,'facecolor','none') end %plot field line theta = linspace(-Nturns*pi, Nturns*pi, 512) ; % Poloidal angle plot3(Xfl(theta),Yfl(theta),Zfl(theta)); hold on; %plot vector basis theta = DATA.z ; % Poloidal angle plot3(Xfl(theta),Yfl(theta),Zfl(theta),'ok'); hold on; quiver3(Xfl(theta),Yfl(theta),Zfl(theta),scale*xX(theta),scale*xY(theta),scale*xZ(theta),0,'r'); quiver3(Xfl(theta),Yfl(theta),Zfl(theta),scale*yX(theta),scale*yY(theta),scale*yZ(theta),0,'g'); quiver3(Xfl(theta),Yfl(theta),Zfl(theta),scale*bX(theta),scale*bY(theta),scale*bZ(theta),0,'b'); xlabel('X');ylabel('Y');zlabel('Z'); %Plot time dependent data - [~,it] = min(abs(OPTIONS.TIME(it_)-DATA.Ts3D)); for iz = OPTIONS.PLANES OPTIONS.COMP = iz; toplot = process_field(DATA,OPTIONS); - FIELDS(:,:,iz) = toplot.FIELD(:,:,it); + FIELDS(:,:,iz) = toplot.FIELD(:,:,it_); tmp = max(max(abs(FIELDS(:,:,iz)))); if (tmp > max_) max_ = tmp; end for iz = OPTIONS.PLANES z_ = DATA.z(iz); Xp = Xfl(z_) + X*xX(z_) + Y*yX(z_); Yp = Yfl(z_) + X*xY(z_) + Y*yY(z_); Zp = Zfl(z_) + X*xZ(z_) + Y*yZ(z_); s=surface(Xp,Yp,Zp,FIELDS(:,:,iz)/max_); s.EdgeColor = 'none'; colormap(bluewhitered); % caxis([-1,1]); end if DATA.Nz == 1 xlim([0.65 0.75]); ylim([-0.1 0.1]); zlim([-0.2 0.2]); end end %% axis equal view([1,-2,1]) end diff --git a/matlab/process_field.m b/matlab/process_field.m index 5258ef7..5709653 100644 --- a/matlab/process_field.m +++ b/matlab/process_field.m @@ -1,451 +1,478 @@ function [ TOPLOT ] = process_field( DATA, OPTIONS ) %UNTITLED4 Summary of this function goes here % Detailed explanation goes here %% Setup time %% FRAMES = zeros(size(OPTIONS.TIME)); for i = 1:numel(OPTIONS.TIME) [~,FRAMES(i)] =min(abs(OPTIONS.TIME(i)-DATA.Ts3D)); end - +FRAMES = unique(FRAMES); %% Setup the plot geometry -[KY,~] = meshgrid(DATA.ky,DATA.kx); +[~,KY] = meshgrid(DATA.kx,DATA.ky); directions = {'x','y','z'}; Nx = DATA.Nx; Ny = DATA.Ny; Nz = DATA.Nz; Nt = numel(FRAMES); POLARPLOT = OPTIONS.POLARPLOT; LTXNAME = OPTIONS.NAME; switch OPTIONS.PLAN case 'xy' XNAME = '$x$'; YNAME = '$y$'; [X,Y] = meshgrid(DATA.x,DATA.y); REALP = 1; COMPDIM = 3; POLARPLOT = 0; SCALE = 1; case 'xz' XNAME = '$x$'; YNAME = '$z$'; [Y,X] = meshgrid(DATA.z,DATA.x); REALP = 1; COMPDIM = 1; SCALE = 0; case 'yz' XNAME = '$y$'; YNAME = '$z$'; [Y,X] = meshgrid(DATA.z,DATA.y); REALP = 1; COMPDIM = 2; SCALE = 0; case 'kxky' XNAME = '$k_x$'; YNAME = '$k_y$'; [X,Y] = meshgrid(DATA.kx,DATA.ky); REALP = 0; COMPDIM = 3; POLARPLOT = 0; SCALE = 1; case 'kxz' XNAME = '$k_x$'; YNAME = '$z$'; [Y,X] = meshgrid(DATA.z,DATA.kx); REALP = 0; COMPDIM = 1; POLARPLOT = 0; SCALE = 0; case 'kyz' XNAME = '$k_y$'; YNAME = '$z$'; [Y,X] = meshgrid(DATA.z,DATA.ky); REALP = 0; COMPDIM = 2; POLARPLOT = 0; SCALE = 0; case 'sx' XNAME = '$v_\parallel$'; YNAME = '$\mu$'; [Y,X] = meshgrid(OPTIONS.XPERP,OPTIONS.SPAR); REALP = 1; COMPDIM = 3; POLARPLOT = 0; SCALE = 0; end Xmax_ = max(max(abs(X))); Ymax_ = max(max(abs(Y))); Lmin_ = min([Xmax_,Ymax_]); Rx = Xmax_/Lmin_ * SCALE + (1-SCALE)*1.2; Ry = Ymax_/Lmin_ * SCALE + (1-SCALE)*1.2; DIMENSIONS = [100, 100, 400*Rx, 400*Ry]; ASPECT = [Rx, Ry, 1]; % Polar grid POLARNAME = []; if POLARPLOT POLARNAME = 'polar'; X__ = (X+DATA.a).*cos(Y); Y__ = (X+DATA.a).*sin(Y); X = X__; Y = Y__; XNAME='X'; YNAME='Z'; DIMENSIONS = [100, 100, 500, 500]; ASPECT = [1,1,1]; sz = size(X); FIELD = zeros(sz(1),sz(2),Nt); else sz = size(X); FIELD = zeros(sz(1),sz(2),Nt); end %% Process the field to plot switch OPTIONS.COMP case 'avg' compr = @(x) mean(x,COMPDIM); COMPNAME = ['avg',directions{COMPDIM}]; FIELDNAME = ['\langle ',LTXNAME,'\rangle_',directions{COMPDIM}]; case 'max' compr = @(x) max(x,[],COMPDIM); COMPNAME = ['max',directions{COMPDIM}]; FIELDNAME = ['\max_',directions{COMPDIM},' ',LTXNAME]; otherwise switch COMPDIM case 1 i = OPTIONS.COMP; compr = @(x) x(i,:,:); if REALP COMPNAME = sprintf(['x=','%2.1f'],DATA.x(i)); else COMPNAME = sprintf(['k_x=','%2.1f'],DATA.kx(i)); end FIELDNAME = [LTXNAME,'(',COMPNAME,')']; case 2 i = OPTIONS.COMP; compr = @(x) x(:,i,:); if REALP COMPNAME = sprintf(['y=','%2.1f'],DATA.y(i)); else COMPNAME = sprintf(['k_y=','%2.1f'],DATA.ky(i)); end FIELDNAME = [LTXNAME,'(',COMPNAME,')']; case 3 i = OPTIONS.COMP; compr = @(x) x(:,:,i); COMPNAME = sprintf(['z=','%2.1f'],DATA.z(i)); FIELDNAME = [LTXNAME,'(',COMPNAME,')']; end end switch REALP case 1 % Real space plot INTERP = OPTIONS.INTERP; - process = @(x) real(fftshift(ifft2(x,Ny,Nx))); + process = @(x) real(fftshift(ifourier_GENE(x))); shift_x = @(x) x; shift_y = @(x) x; case 0 % Frequencies plot INTERP = 0; switch COMPDIM case 1 process = @(x) abs(fftshift(x,2)); shift_x = @(x) fftshift(x,1); shift_y = @(x) fftshift(x,1); case 2 process = @(x) abs((x)); shift_x = @(x) (x); shift_y = @(x) (x); case 3 process = @(x) abs(fftshift(x,2)); shift_x = @(x) fftshift(x,2); shift_y = @(x) fftshift(x,2); end end switch OPTIONS.NAME case '\phi' NAME = 'phi'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.PHI(:,:,:,FRAMES(it)))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.PHI(:,:,iz,FRAMES(it)))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'N_i^{00}' NAME = 'Ni00'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.Ni00(:,:,:,FRAMES(it)))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.Ni00(:,:,iz,FRAMES(it)))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'n_e' NAME = 'ne'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.DENS_E(:,:,:,FRAMES(it)))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.DENS_E(:,:,iz,FRAMES(it)))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'k^2n_e' NAME = 'k2ne'; - [KY, KX] = meshgrid(DATA.ky, DATA.kx); + [KX, KY] = meshgrid(DATA.kx, DATA.ky); if COMPDIM == 3 for it = 1:numel(FRAMES) for iz = 1:DATA.Nz tmp = squeeze(compr(-(KX.^2+KY.^2).*DATA.DENS_E(:,:,iz,FRAMES(it)))); end FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(-(KX.^2+KY.^2).*DATA.DENS_E(:,:,iz,FRAMES(it)))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'n_e^{NZ}' NAME = 'neNZ'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.DENS_E(:,:,:,FRAMES(it)).*(KY~=0))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.DENS_E(:,:,iz,FRAMES(it)).*(KY~=0))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'n_i' NAME = 'ni'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.DENS_I(:,:,:,FRAMES(it)))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.DENS_I(:,:,iz,FRAMES(it)))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'T_i' NAME = 'Ti'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.TEMP_I(:,:,:,FRAMES(it)))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.TEMP_I(:,:,iz,FRAMES(it)))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'n_i^{NZ}' NAME = 'niNZ'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.DENS_I(:,:,:,FRAMES(it)).*(KY~=0))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.DENS_I(:,:,iz,FRAMES(it)).*(KY~=0))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case '\phi^{NZ}' NAME = 'phiNZ'; if COMPDIM == 3 for it = 1:numel(FRAMES) tmp = squeeze(compr(DATA.PHI(:,:,:,FRAMES(it)).*(KY~=0))); FIELD(:,:,it) = squeeze(process(tmp)); end else if REALP - tmp = zeros(Nx,Ny,Nz); + tmp = zeros(Ny,Nx,Nz); else - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); end for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(DATA.PHI(:,:,iz,FRAMES(it)).*(KY~=0))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'v_y' NAME = 'vy'; - [~, KX] = meshgrid(DATA.ky, DATA.kx); - vE = zeros(DATA.Nx,DATA.Ny,DATA.Nz,numel(FRAMES)); + [KX, ~] = meshgrid(DATA.kx, DATA.ky); + vE = zeros(DATA.Ny,DATA.Nx,DATA.Nz,numel(FRAMES)); for it = 1:numel(FRAMES) for iz = 1:DATA.Nz - vE(:,:,iz,it) = real(ifft2(-1i*KX.*(DATA.PHI(:,:,iz,FRAMES(it))),DATA.Nx,DATA.Ny)); + vE(:,:,iz,it) = real(ifft2(-1i*KX.*(DATA.PHI(:,:,iz,FRAMES(it))),DATA.Ny,DATA.Nx)); end end if REALP % plot in real space for it = 1:numel(FRAMES) FIELD(:,:,it) = squeeze(compr(vE(:,:,:,it))); end else % Plot spectrum process = @(x) abs(fftshift(x,2)); - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(-1i*KX.*(DATA.PHI(:,:,iz,FRAMES(it))))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 'v_x' NAME = 'vx'; - [KY, ~] = meshgrid(DATA.ky, DATA.kx); - vE = zeros(DATA.Nx,DATA.Ny,DATA.Nz,numel(FRAMES)); + [~, KY] = meshgrid(DATA.kx, DATA.ky); + vE = zeros(DATA.Ny,DATA.Nx,DATA.Nz,numel(FRAMES)); for it = 1:numel(FRAMES) for iz = 1:DATA.Nz - vE(:,:,iz,it) = real(ifft2(-1i*KY.*(DATA.PHI(:,:,iz,FRAMES(it))),DATA.Nx,DATA.Ny)); + vE(:,:,iz,it) = real(ifourier_GENE(-1i*KY.*(DATA.PHI(:,:,iz,FRAMES(it))))); end end if REALP % plot in real space for it = 1:numel(FRAMES) FIELD(:,:,it) = squeeze(compr(vE(:,:,:,it))); end else % Plot spectrum process = @(x) abs(fftshift(x,2)); - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(-1i*KY.*(DATA.PHI(:,:,iz,FRAMES(it))))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case 's_y' NAME = 'sy'; [~, KX] = meshgrid(DATA.ky, DATA.kx); vE = zeros(DATA.Nx,DATA.Ny,DATA.Nz,numel(FRAMES)); for it = 1:numel(FRAMES) for iz = 1:DATA.Nz - vE(:,:,iz,it) = real(ifft2(KX.^2.*(DATA.PHI(:,:,iz,FRAMES(it))),DATA.Nx,DATA.Ny)); + vE(:,:,iz,it) = real(ifourier_GENE(KX.^2.*(DATA.PHI(:,:,iz,FRAMES(it))))); end end if REALP % plot in real space for it = 1:numel(FRAMES) FIELD(:,:,it) = squeeze(compr(vE(:,:,:,it))); end else % Plot spectrum process = @(x) abs(fftshift(x,2)); - tmp = zeros(DATA.Nkx,DATA.Nky,Nz); - for it = 1:numel(FRAMES) + tmp = zeros(DATA.Nky,DATA.Nkx,Nz); + for it = 1:FRAMES for iz = 1:numel(DATA.z) tmp(:,:,iz) = squeeze(process(KX.^2.*(DATA.PHI(:,:,iz,FRAMES(it))))); end FIELD(:,:,it) = squeeze(compr(tmp)); end end case '\Gamma_x' NAME = 'Gx'; - [KY, ~] = meshgrid(DATA.ky, DATA.kx); - Gx = zeros(DATA.Nx,DATA.Ny,DATA.Nz,numel(FRAMES)); + [~, KY] = meshgrid(DATA.kx, DATA.ky); + Gx = zeros(DATA.Ny,DATA.Nx,DATA.Nz,numel(FRAMES)); for it = 1:numel(FRAMES) for iz = 1:DATA.Nz - Gx(:,:,iz,it) = real((ifft2(-1i*KY.*(DATA.PHI(:,:,iz,FRAMES(it))),DATA.Nx,DATA.Ny)))... - .*real((ifft2(DATA.DENS_I(:,:,iz,FRAMES(it)),DATA.Nx,DATA.Ny))); + Gx(:,:,iz,it) = real((ifourier_GENE(-1i*KY.*(DATA.PHI(:,:,iz,FRAMES(it))))))... + .*real((ifourier_GENE(DATA.DENS_I(:,:,iz,FRAMES(it))))); end end if REALP % plot in real space for it = 1:numel(FRAMES) FIELD(:,:,it) = squeeze(compr(Gx(:,:,:,it))); end else % Plot spectrum process = @(x) abs(fftshift(x,2)); shift_x = @(x) fftshift(x,2); shift_y = @(x) fftshift(x,2); - tmp = zeros(DATA.Nx,DATA.Ny,Nz); + tmp = zeros(DATA.Ny,DATA.Nx,Nz); + for it = 1:numel(FRAMES) + for iz = 1:numel(DATA.z) + tmp(:,:,iz) = process(squeeze(fft2(Gx(:,:,iz,it),DATA.Ny,DATA.Nx))); + end + FIELD(:,:,it) = squeeze(compr(tmp(1:DATA.Nky,1:DATA.Nkx,:))); + end + end + case 'Q_x' + NAME = 'Qx'; + [~, KY] = meshgrid(DATA.kx, DATA.ky); + Qx = zeros(DATA.Ny,DATA.Nx,DATA.Nz,numel(FRAMES)); + for it = 1:numel(FRAMES) + for iz = 1:DATA.Nz + Qx(:,:,iz,it) = real(ifourier_GENE(-1i*KY.*(DATA.PHI(:,:,iz,FRAMES(it)))))... + .*real(ifourier_GENE(DATA.DENS_I(:,:,iz,FRAMES(it))))... + .*real(ifourier_GENE(DATA.TEMP_I(:,:,iz,FRAMES(it)))); + end + end + if REALP % plot in real space + for it = 1:numel(FRAMES) + FIELD(:,:,it) = squeeze(compr(Qx(:,:,:,it))); + end + else % Plot spectrum + process = @(x) abs(fftshift(x,2)); + shift_x = @(x) fftshift(x,2); + shift_y = @(x) fftshift(x,2); + tmp = zeros(DATA.Ny,DATA.Nx,Nz); for it = 1:numel(FRAMES) for iz = 1:numel(DATA.z) - tmp(:,:,iz) = process(squeeze(fft2(Gx(:,:,iz,it),DATA.Nx,DATA.Ny))); + tmp(:,:,iz) = process(squeeze(fft2(Qx(:,:,iz,it),DATA.Ny,DATA.Nx))); end - FIELD(:,:,it) = squeeze(compr(tmp(1:DATA.Nkx,1:DATA.Nky,:))); + FIELD(:,:,it) = squeeze(compr(tmp(1:DATA.Nky,1:DATA.Nkx,:))); end end case 'f_i' shift_x = @(x) x; shift_y = @(y) y; NAME = 'fi'; OPTIONS.SPECIE = 'i'; [~,it0_] =min(abs(OPTIONS.TIME(1)-DATA.Ts5D)); [~,it1_]=min(abs(OPTIONS.TIME(end)-DATA.Ts5D)); dit_ = 1;%ceil((it1_-it0_+1)/10); FRAMES = it0_:dit_:it1_; iz = 1; for it = 1:numel(FRAMES) OPTIONS.T = DATA.Ts5D(FRAMES(it)); [~,~,FIELD(:,:,it)] = compute_fa(DATA,OPTIONS); end case 'f_e' shift_x = @(x) x; shift_y = @(y) y; NAME = 'fe'; OPTIONS.SPECIE = 'e'; [~,it0_] =min(abs(OPTIONS.TIME(1)-DATA.Ts5D)); [~,it1_]=min(abs(OPTIONS.TIME(end)-DATA.Ts5D)); dit_ = 1;%ceil((it1_-it0_+1)/10); FRAMES = it0_:dit_:it1_; iz = 1; for it = 1:numel(FRAMES) OPTIONS.T = DATA.Ts5D(FRAMES(it)); [~,~,FIELD(:,:,it)] = compute_fa(DATA,OPTIONS); end end TOPLOT.FIELD = FIELD; TOPLOT.FRAMES = FRAMES; TOPLOT.X = shift_x(X); TOPLOT.Y = shift_y(Y); TOPLOT.FIELDNAME = FIELDNAME; TOPLOT.XNAME = XNAME; TOPLOT.YNAME = YNAME; TOPLOT.FILENAME = [NAME,'_',OPTIONS.PLAN,'_',COMPNAME,'_',POLARNAME]; TOPLOT.DIMENSIONS= DIMENSIONS; TOPLOT.ASPECT = ASPECT; TOPLOT.FRAMES = FRAMES; TOPLOT.INTERP = INTERP; end diff --git a/src/grid_mod.F90 b/src/grid_mod.F90 index 50b9e5c..36585c3 100644 --- a/src/grid_mod.F90 +++ b/src/grid_mod.F90 @@ -1,525 +1,525 @@ MODULE grid ! Grid module for spatial discretization USE prec_const USE basic IMPLICIT NONE PRIVATE ! GRID Namelist INTEGER, PUBLIC, PROTECTED :: pmaxe = 1 ! The maximal electron Hermite-moment computed INTEGER, PUBLIC, PROTECTED :: jmaxe = 1 ! The maximal electron Laguerre-moment computed INTEGER, PUBLIC, PROTECTED :: pmaxi = 1 ! The maximal ion Hermite-moment computed INTEGER, PUBLIC, PROTECTED :: jmaxi = 1 ! The maximal ion Laguerre-moment computed INTEGER, PUBLIC, PROTECTED :: maxj = 1 ! The maximal Laguerre-moment INTEGER, PUBLIC, PROTECTED :: dmaxe = 1 ! The maximal full GF set of e-moments v^dmax INTEGER, PUBLIC, PROTECTED :: dmaxi = 1 ! The maximal full GF set of i-moments v^dmax INTEGER, PUBLIC, PROTECTED :: Nx = 16 ! Number of total internal grid points in x REAL(dp), PUBLIC, PROTECTED :: Lx = 1._dp ! horizontal length of the spatial box INTEGER, PUBLIC, PROTECTED :: Ny = 16 ! Number of total internal grid points in y REAL(dp), PUBLIC, PROTECTED :: Ly = 1._dp ! vertical length of the spatial box INTEGER, PUBLIC, PROTECTED :: Nz = 1 ! Number of total perpendicular planes REAL(dp), PUBLIC, PROTECTED :: Npol = 1._dp ! number of poloidal turns INTEGER, PUBLIC, PROTECTED :: Odz = 4 ! order of z interp and derivative schemes INTEGER, PUBLIC, PROTECTED :: Nkx = 8 ! Number of total internal grid points in kx REAL(dp), PUBLIC, PROTECTED :: Lkx = 1._dp ! horizontal length of the fourier box INTEGER, PUBLIC, PROTECTED :: Nky = 16 ! Number of total internal grid points in ky REAL(dp), PUBLIC, PROTECTED :: Lky = 1._dp ! vertical length of the fourier box REAL(dp), PUBLIC, PROTECTED :: kpar = 0_dp ! parallel wave vector component ! For Orszag filter REAL(dp), PUBLIC, PROTECTED :: two_third_kxmax REAL(dp), PUBLIC, PROTECTED :: two_third_kymax REAL(dp), PUBLIC :: two_third_kpmax ! 1D Antialiasing arrays (2/3 rule) REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: AA_x REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: AA_y ! Grids containing position in physical space REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: xarray REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: yarray ! Local and global z grids, 2D since it has to store odd and even grids REAL(dp), DIMENSION(:,:), ALLOCATABLE, PUBLIC :: zarray REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: zarray_full ! local z weights for computing simpson rule INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: zweights_SR REAL(dp), PUBLIC, PROTECTED :: deltax, deltay, deltaz, inv_deltaz, diff_dz_coeff INTEGER, PUBLIC, PROTECTED :: ixs, ixe, iys, iye, izs, ize INTEGER, PUBLIC, PROTECTED :: izgs, izge ! ghosts LOGICAL, PUBLIC, PROTECTED :: SG = .true.! shifted grid flag INTEGER, PUBLIC :: ir,iz ! counters ! Data about parallel distribution for kx integer(C_INTPTR_T), PUBLIC :: local_nkx, local_nky integer(C_INTPTR_T), PUBLIC :: local_nkx_offset, local_nky_offset INTEGER, PUBLIC :: local_nkp ! "" for p INTEGER, PUBLIC :: local_np_e, local_np_i INTEGER, PUBLIC :: total_np_e, total_np_i integer(C_INTPTR_T), PUBLIC :: local_np_e_offset, local_np_i_offset INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: counts_np_e, counts_np_i INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: displs_np_e, displs_np_i ! "" for z INTEGER, PUBLIC :: local_nz INTEGER, PUBLIC :: total_nz integer(C_INTPTR_T), PUBLIC :: local_nz_offset INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: counts_nz INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: displs_nz ! "" for j (not parallelized) INTEGER, PUBLIC :: local_nj_e, local_nj_i ! Grids containing position in fourier space REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: kxarray, kxarray_full REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: kyarray, kyarray_full ! Kperp array depends on kx, ky, z (geometry), eo (even or odd zgrid) REAL(dp), DIMENSION(:,:,:,:), ALLOCATABLE, PUBLIC :: kparray REAL(dp), PUBLIC, PROTECTED :: deltakx, deltaky, kx_max, ky_max, kx_min, ky_min!, kp_max REAL(dp), PUBLIC, PROTECTED :: local_kxmax, local_kymax INTEGER, PUBLIC, PROTECTED :: ikxs, ikxe, ikys, ikye!, ikps, ikpe - INTEGER, PUBLIC, PROTECTED :: ikx_0, iky_0, ikx_max, iky_max ! Indices of k-grid origin and max - INTEGER, PUBLIC :: ikx, iky, ip, ij, ikp, pp2, eo ! counters - LOGICAL, PUBLIC, PROTECTED :: contains_kx0 = .false. ! flag if the proc contains kx=0 index - LOGICAL, PUBLIC, PROTECTED :: contains_ky0 = .false. ! flag if the proc contains ky=0 index - LOGICAL, PUBLIC, PROTECTED :: contains_kymax = .false. ! flag if the proc contains kx=kxmax index + INTEGER, PUBLIC, PROTECTED :: ikx_0, iky_0, ikx_max, iky_max ! Indices of k-grid origin and max + INTEGER, PUBLIC :: ikx, iky, ip, ij, ikp, pp2, eo ! counters + LOGICAL, PUBLIC, PROTECTED :: contains_kx0 = .false. ! flag if the proc contains kx=0 index + LOGICAL, PUBLIC, PROTECTED :: contains_ky0 = .false. ! flag if the proc contains ky=0 index + LOGICAL, PUBLIC, PROTECTED :: contains_kymax = .false. ! flag if the proc contains kx=kxmax index ! Grid containing the polynomials degrees INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: parray_e, parray_e_full INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: parray_i, parray_i_full INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: jarray_e, jarray_e_full INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: jarray_i, jarray_i_full INTEGER, PUBLIC, PROTECTED :: ips_e,ipe_e, ijs_e,ije_e ! Start and end indices for pol. deg. INTEGER, PUBLIC, PROTECTED :: ips_i,ipe_i, ijs_i,ije_i INTEGER, PUBLIC, PROTECTED :: ipgs_e,ipge_e, ijgs_e,ijge_e ! Ghosts start and end indices INTEGER, PUBLIC, PROTECTED :: ipgs_i,ipge_i, ijgs_i,ijge_i INTEGER, PUBLIC, PROTECTED :: deltape, ip0_e, ip1_e, ip2_e ! Pgrid spacing and moment 0,1,2 index INTEGER, PUBLIC, PROTECTED :: deltapi, ip0_i, ip1_i, ip2_i LOGICAL, PUBLIC, PROTECTED :: CONTAINS_ip0_e, CONTAINS_ip0_i LOGICAL, PUBLIC, PROTECTED :: CONTAINS_ip1_e, CONTAINS_ip1_i LOGICAL, PUBLIC, PROTECTED :: CONTAINS_ip2_e, CONTAINS_ip2_i ! Usefull inverse numbers REAL(dp), PUBLIC, PROTECTED :: inv_Nx, inv_Ny, inv_Nz ! Public Functions PUBLIC :: init_1Dgrid_distr PUBLIC :: set_pgrid, set_jgrid PUBLIC :: set_kxgrid, set_kygrid, set_zgrid PUBLIC :: grid_readinputs, grid_outputinputs PUBLIC :: bare, bari ! Precomputations real(dp), PUBLIC, PROTECTED :: pmaxe_dp, pmaxi_dp, jmaxe_dp,jmaxi_dp CONTAINS SUBROUTINE grid_readinputs ! Read the input parameters USE prec_const IMPLICIT NONE INTEGER :: lu_in = 90 ! File duplicated from STDIN NAMELIST /GRID/ pmaxe, jmaxe, pmaxi, jmaxi, & Nx, Lx, Ny, Ly, Nz, Npol, SG READ(lu_in,grid) !! Compute the maximal degree of full GF moments set ! i.e. : all moments N_a^pj s.t. p+2j<=d are simulated (see GF closure) dmaxe = min(pmaxe,2*jmaxe+1) dmaxi = min(pmaxi,2*jmaxi+1) ! If no parallel dim (Nz=1), the moment hierarchy is separable between odds and even P !! and since the energy is injected in P=0 and P=2 for density/temperature gradients !! there is no need of simulating the odd p which will only be damped. !! We define in this case a grid Parray = 0,2,4,...,Pmax i.e. deltap = 2 instead of 1 !! to spare computation IF(Nz .EQ. 1) THEN deltape = 2; deltapi = 2; pp2 = 1; ! index p+2 is ip+1 SG = .FALSE. ELSE deltape = 1; deltapi = 1; pp2 = 2; ! index p+2 is ip+1 ENDIF ! Usefull precomputations inv_Nx = 1._dp/REAL(Nx,dp) inv_Ny = 1._dp/REAL(Ny,dp) END SUBROUTINE grid_readinputs SUBROUTINE init_1Dgrid_distr ! write(*,*) Nx local_nky = (Ny/2+1)/num_procs_ky ! write(*,*) local_nkx local_nky_offset = rank_ky*local_nky if (rank_ky .EQ. num_procs_ky-1) local_nky = (Ny/2+1)-local_nky_offset END SUBROUTINE init_1Dgrid_distr SUBROUTINE set_pgrid USE prec_const IMPLICIT NONE INTEGER :: ip, istart, iend, in ! Total number of Hermite polynomials we will evolve total_np_e = (Pmaxe/deltape) + 1 total_np_i = (Pmaxi/deltapi) + 1 ! Build the full grids on process 0 to diagnose it without comm ALLOCATE(parray_e_full(1:total_np_e)) ALLOCATE(parray_i_full(1:total_np_i)) ! P DO ip = 1,total_np_e; parray_e_full(ip) = (ip-1)*deltape; END DO DO ip = 1,total_np_i; parray_i_full(ip) = (ip-1)*deltapi; END DO !! Parallel data distribution ! Local data distribution CALL decomp1D(total_np_e, num_procs_p, rank_p, ips_e, ipe_e) CALL decomp1D(total_np_i, num_procs_p, rank_p, ips_i, ipe_i) local_np_e = ipe_e - ips_e + 1 local_np_i = ipe_i - ips_i + 1 ! Ghosts boundaries ipgs_e = ips_e - 2/deltape; ipge_e = ipe_e + 2/deltape; ipgs_i = ips_i - 2/deltapi; ipge_i = ipe_i + 2/deltapi; ! List of shift and local numbers between the different processes (used in scatterv and gatherv) ALLOCATE(counts_np_e (1:num_procs_p)) ALLOCATE(counts_np_i (1:num_procs_p)) ALLOCATE(displs_np_e (1:num_procs_p)) ALLOCATE(displs_np_i (1:num_procs_p)) DO in = 0,num_procs_p-1 CALL decomp1D(total_np_e, num_procs_p, in, istart, iend) counts_np_e(in+1) = iend-istart+1 displs_np_e(in+1) = istart-1 CALL decomp1D(total_np_i, num_procs_p, in, istart, iend) counts_np_i(in+1) = iend-istart+1 displs_np_i(in+1) = istart-1 ENDDO ! local grid computation CONTAINS_ip0_e = .FALSE. CONTAINS_ip1_e = .FALSE. CONTAINS_ip2_e = .FALSE. CONTAINS_ip0_i = .FALSE. CONTAINS_ip1_i = .FALSE. CONTAINS_ip2_i = .FALSE. ALLOCATE(parray_e(ipgs_e:ipge_e)) ALLOCATE(parray_i(ipgs_i:ipge_i)) DO ip = ipgs_e,ipge_e parray_e(ip) = (ip-1)*deltape ! Storing indices of particular degrees for fluid moments computations IF(parray_e(ip) .EQ. 0) THEN ip0_e = ip CONTAINS_ip0_e = .TRUE. ENDIF IF(parray_e(ip) .EQ. 1) THEN ip1_e = ip CONTAINS_ip1_e = .TRUE. ENDIF IF(parray_e(ip) .EQ. 2) THEN ip2_e = ip CONTAINS_ip2_e = .TRUE. ENDIF END DO DO ip = ipgs_i,ipge_i parray_i(ip) = (ip-1)*deltapi ! Storing indices of particular degrees for fluid moments computations IF(parray_i(ip) .EQ. 0) THEN ip0_i = ip CONTAINS_ip0_i = .TRUE. ENDIF IF(parray_i(ip) .EQ. 1) THEN ip1_i = ip CONTAINS_ip1_i = .TRUE. ENDIF IF(parray_i(ip) .EQ. 2) THEN ip2_i = ip CONTAINS_ip2_i = .TRUE. ENDIF END DO !DGGK operator uses moments at index p=2 (ip=3) for the p=0 term so the ! process that contains ip=1 MUST contain ip=3 as well for both e and i. IF(((ips_e .EQ. ip0_e) .OR. (ips_i .EQ. ip0_e)) .AND. ((ipe_e .LT. ip2_e) .OR. (ipe_i .LT. ip2_i)))& WRITE(*,*) "Warning : distribution along p may not work with DGGK" ! Precomputations pmaxe_dp = real(pmaxe,dp) pmaxi_dp = real(pmaxi,dp) END SUBROUTINE set_pgrid SUBROUTINE set_jgrid USE prec_const IMPLICIT NONE INTEGER :: ij ! Build the full grids on process 0 to diagnose it without comm ALLOCATE(jarray_e_full(1:jmaxe+1)) ALLOCATE(jarray_i_full(1:jmaxi+1)) ! J DO ij = 1,jmaxe+1; jarray_e_full(ij) = (ij-1); END DO DO ij = 1,jmaxi+1; jarray_i_full(ij) = (ij-1); END DO ! Local data ijs_e = 1; ije_e = jmaxe + 1 ijs_i = 1; ije_i = jmaxi + 1 ! Ghosts boundaries ijgs_e = ijs_e - 1; ijge_e = ije_e + 1; ijgs_i = ijs_i - 1; ijge_i = ije_i + 1; ! Local number of J local_nj_e = ijge_e - ijgs_e + 1 local_nj_i = ijge_i - ijgs_i + 1 ALLOCATE(jarray_e(ijgs_e:ijge_e)) ALLOCATE(jarray_i(ijgs_i:ijge_i)) DO ij = ijgs_e,ijge_e; jarray_e(ij) = ij-1; END DO DO ij = ijgs_i,ijge_i; jarray_i(ij) = ij-1; END DO ! Precomputations maxj = MAX(jmaxi, jmaxe) jmaxe_dp = real(jmaxe,dp) jmaxi_dp = real(jmaxi,dp) END SUBROUTINE set_jgrid SUBROUTINE set_kygrid USE prec_const USE model, ONLY: LINEARITY IMPLICIT NONE INTEGER :: i_ Nky = Ny/2+1 ! Defined only on positive kx since fields are real ! Grid spacings IF (Ny .EQ. 1) THEN deltaky = 0._dp ky_max = 0._dp ky_min = 0._dp ELSE deltaky = 2._dp*PI/Ly ky_max = Nky*deltaky ky_min = deltaky ENDIF ! Build the full grids on process 0 to diagnose it without comm ALLOCATE(kyarray_full(1:Nky)) DO iky = 1,Nky kyarray_full(iky) = REAL(iky-1,dp) * deltaky END DO !! Parallel distribution ikys = local_nky_offset + 1 ikye = ikys + local_nky - 1 ALLOCATE(kyarray(ikys:ikye)) local_kymax = 0._dp ! Creating a grid ordered as dk*(0 1 2 3) DO iky = ikys,ikye kyarray(iky) = REAL(iky-1,dp) * deltaky ! Finding kx=0 IF (kyarray(iky) .EQ. 0) THEN iky_0 = iky contains_ky0 = .true. ENDIF ! Finding local kxmax value IF (ABS(kyarray(iky)) .GT. local_kymax) THEN local_kymax = ABS(kyarray(iky)) ENDIF ! Finding kxmax idx IF (kyarray(iky) .EQ. ky_max) THEN iky_max = iky contains_kymax = .true. ENDIF END DO ! Orszag 2/3 filter two_third_kymax = 2._dp/3._dp*deltaky*(Nky-1) ALLOCATE(AA_y(ikys:ikye)) DO iky = ikys,ikye IF ( (kyarray(iky) .LT. two_third_kymax) .OR. (LINEARITY .EQ. 'linear')) THEN AA_y(iky) = 1._dp; ELSE AA_y(iky) = 0._dp; ENDIF END DO END SUBROUTINE set_kygrid SUBROUTINE set_kxgrid USE prec_const USE model, ONLY: LINEARITY IMPLICIT NONE INTEGER :: i_, counter Nkx = Nx; ! Local data ! Start and END indices of grid ikxs = 1 ikxe = Nkx local_nkx = ikxe - ikxs + 1 ALLOCATE(kxarray(ikxs:ikxe)) ALLOCATE(kxarray_full(1:Nkx)) IF (Nx .EQ. 1) THEN ! "cancel" y dimension deltakx = 1._dp kxarray(1) = 0._dp ikx_0 = 1 contains_kx0 = .true. kx_max = 0._dp ikx_max = 1 kx_min = 0._dp kxarray_full(1) = 0._dp local_kxmax = 0._dp ELSE ! Build apprpopriate grid deltakx = 2._dp*PI/Lx kx_max = (Ny/2)*deltakx kx_min = deltakx ! Creating a grid ordered as dk*(0 1 2 3 -2 -1) local_kxmax = 0._dp DO ikx = ikxs,ikxe kxarray(ikx) = deltakx*(MODULO(ikx-1,Nkx/2)-Nkx/2*FLOOR(2.*real(ikx-1)/real(Nkx))) if (ikx .EQ. Nx/2+1) kxarray(ikx) = -kxarray(ikx) ! Finding kx=0 IF (kxarray(ikx) .EQ. 0) THEN ikx_0 = ikx contains_kx0 = .true. ENDIF ! Finding local kxmax IF (ABS(kxarray(ikx)) .GT. local_kxmax) THEN local_kxmax = ABS(kxarray(ikx)) ENDIF ! Finding kxmax IF (kxarray(ikx) .EQ. kx_max) ikx_max = ikx END DO ! Build the full grids on process 0 to diagnose it without comm ! kx DO ikx = 1,Nkx kxarray_full(ikx) = deltakx*(MODULO(ikx-1,Nkx/2)-Nkx/2*FLOOR(2.*real(ikx-1)/real(Nkx))) IF (ikx .EQ. Nx/2+1) kxarray_full(ikx) = -kxarray_full(ikx) END DO ENDIF ! Orszag 2/3 filter two_third_kxmax = 2._dp/3._dp*deltakx*(Nkx/2-1); ALLOCATE(AA_x(ikxs:ikxe)) DO ikx = ikxs,ikxe IF ( ((kxarray(ikx) .GT. -two_third_kxmax) .AND. & (kxarray(ikx) .LT. two_third_kxmax)) .OR. (LINEARITY .EQ. 'linear')) THEN AA_x(ikx) = 1._dp; ELSE AA_x(ikx) = 0._dp; ENDIF END DO END SUBROUTINE set_kxgrid SUBROUTINE set_zgrid USE prec_const IMPLICIT NONE INTEGER :: i_, fid REAL :: grid_shift, Lz INTEGER :: ip, istart, iend, in total_nz = Nz ! Length of the flux tube (in ballooning angle) Lz = 2_dp*pi*Npol ! Z stepping (#interval = #points since periodic) deltaz = Lz/REAL(Nz,dp) inv_deltaz = 1._dp/deltaz diff_dz_coeff = (deltaz/2._dp)**2 IF (SG) THEN grid_shift = deltaz/2._dp ELSE grid_shift = 0._dp ENDIF ! Build the full grids on process 0 to diagnose it without comm ALLOCATE(zarray_full(1:Nz)) IF (Nz .EQ. 1) Npol = 0 DO iz = 1,total_nz zarray_full(iz) = REAL(iz-1,dp)*deltaz - PI*REAL(Npol,dp) END DO !! Parallel data distribution ! Local data distribution CALL decomp1D(total_nz, num_procs_z, rank_z, izs, ize) local_nz = ize - izs + 1 ! Ghosts boundaries (depend on the order of z operators) IF(Nz .EQ. 1) THEN izgs = izs; izge = ize; ELSEIF(Nz .GE. 4) THEN izgs = izs - 2; izge = ize + 2; ELSE ERROR STOP 'Error stop: Nz is not appropriate!!' ENDIF ! List of shift and local numbers between the different processes (used in scatterv and gatherv) ALLOCATE(counts_nz (1:num_procs_z)) ALLOCATE(displs_nz (1:num_procs_z)) DO in = 0,num_procs_z-1 CALL decomp1D(total_nz, num_procs_z, in, istart, iend) counts_nz(in+1) = iend-istart+1 displs_nz(in+1) = istart-1 ENDDO ! Local z array ALLOCATE(zarray(izgs:izge,0:1)) DO iz = izgs,izge IF(iz .EQ. 0) THEN zarray(iz,0) = zarray_full(total_nz) zarray(iz,1) = zarray_full(total_nz) + grid_shift ELSEIF(iz .EQ. -1) THEN zarray(iz,0) = zarray_full(total_nz-1) zarray(iz,1) = zarray_full(total_nz-1) + grid_shift ELSEIF(iz .EQ. total_nz + 1) THEN zarray(iz,0) = zarray_full(1) zarray(iz,1) = zarray_full(1) + grid_shift ELSEIF(iz .EQ. total_nz + 2) THEN zarray(iz,0) = zarray_full(2) zarray(iz,1) = zarray_full(2) + grid_shift ELSE zarray(iz,0) = zarray_full(iz) zarray(iz,1) = zarray_full(iz) + grid_shift ENDIF ENDDO ! Weitghs for Simpson rule ALLOCATE(zweights_SR(izs:ize)) DO iz = izs,ize IF((iz .EQ. 1) .OR. (iz .EQ. Nz)) THEN zweights_SR(iz) = 1._dp ELSEIF(MODULO(iz-1,2)) THEN zweights_SR(iz) = 4._dp ELSE zweights_SR(iz) = 2._dp ENDIF ENDDO END SUBROUTINE set_zgrid SUBROUTINE grid_outputinputs(fidres, str) ! Write the input parameters to the results_xx.h5 file USE futils, ONLY: attach USE prec_const IMPLICIT NONE INTEGER, INTENT(in) :: fidres CHARACTER(len=256), INTENT(in) :: str CALL attach(fidres, TRIM(str), "pmaxe", pmaxe) CALL attach(fidres, TRIM(str), "jmaxe", jmaxe) CALL attach(fidres, TRIM(str), "pmaxi", pmaxi) CALL attach(fidres, TRIM(str), "jmaxi", jmaxi) CALL attach(fidres, TRIM(str), "Nx", Nx) CALL attach(fidres, TRIM(str), "Lx", Lx) CALL attach(fidres, TRIM(str), "Ny", Ny) CALL attach(fidres, TRIM(str), "Ly", Ly) CALL attach(fidres, TRIM(str), "Nz", Nz) CALL attach(fidres, TRIM(str), "Nkx", Nkx) CALL attach(fidres, TRIM(str), "Lkx", Lkx) CALL attach(fidres, TRIM(str), "Nky", Nky) CALL attach(fidres, TRIM(str), "Lky", Lky) CALL attach(fidres, TRIM(str), "SG", SG) END SUBROUTINE grid_outputinputs FUNCTION bare(p_,j_) IMPLICIT NONE INTEGER :: bare, p_, j_ bare = (jmaxe+1)*p_ + j_ + 1 END FUNCTION FUNCTION bari(p_,j_) IMPLICIT NONE INTEGER :: bari, p_, j_ bari = (jmaxi+1)*p_ + j_ + 1 END FUNCTION SUBROUTINE decomp1D( n, numprocs, myid, s, e ) INTEGER :: n, numprocs, myid, s, e INTEGER :: nlocal INTEGER :: deficit nlocal = n / numprocs s = myid * nlocal + 1 deficit = MOD(n,numprocs) s = s + MIN(myid,deficit) IF (myid .LT. deficit) nlocal = nlocal + 1 e = s + nlocal - 1 IF (e .GT. n .OR. myid .EQ. numprocs-1) e = n END SUBROUTINE decomp1D END MODULE grid diff --git a/wk/analysis_3D.m b/wk/analysis_3D.m index eba8d51..2add3a7 100644 --- a/wk/analysis_3D.m +++ b/wk/analysis_3D.m @@ -1,192 +1,194 @@ addpath(genpath([helazdir,'matlab'])) % ... add addpath(genpath([helazdir,'matlab/plot'])) % ... add addpath(genpath([helazdir,'matlab/compute'])) % ... add addpath(genpath([helazdir,'matlab/load'])) % ... add %% Load the results LOCALDIR = [helazdir,'results/',outfile,'/']; MISCDIR = ['/misc/HeLaZ_outputs/results/',outfile,'/']; system(['mkdir -p ',MISCDIR]); CMD = ['rsync ', LOCALDIR,'outputs* ',MISCDIR]; disp(CMD); system(CMD); % Load outputs from jobnummin up to jobnummax JOBNUMMIN = 00; JOBNUMMAX = 10; data = compile_results(MISCDIR,JOBNUMMIN,JOBNUMMAX); %Compile the results from first output found to JOBNUMMAX if existing %% PLOTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% default_plots_options disp('Plots') FMT = '.fig'; if 1 %% Space time diagramm (fig 11 Ivanov 2020) -TAVG_0 = 0.8*data.Ts3D(end); TAVG_1 = data.Ts3D(end); % Averaging times duration -compz = 'avg'; -% chose your field to plot in spacetime diag (uzf,szf,Gx) -fig = plot_radial_transport_and_spacetime(data,TAVG_0,TAVG_1,'phi',1,compz); +options.TAVG_0 = 0.8*data.Ts3D(end); +options.TAVG_1 = data.Ts3D(end); % Averaging times duration +options.NMVA = 1; % Moving average for time traces +options.ST_FIELD = '\Gamma_x'; % chose your field to plot in spacetime diag (e.g \phi,v_x,G_x) +options.INTERP = 1; +fig = plot_radial_transport_and_spacetime(data,options); save_figure(data,fig) end if 0 %% statistical transport averaging options.T = [16000 17000]; fig = statistical_transport_averaging(data,options); end if 0 %% MOVIES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Options options.INTERP = 1; options.POLARPLOT = 0; -options.NAME = '\phi'; +% options.NAME = '\phi'; % options.NAME = 'N_i^{00}'; % options.NAME = 'v_y'; % options.NAME = 'n_i^{NZ}'; -% options.NAME = '\Gamma_x'; +options.NAME = '\Gamma_x'; % options.NAME = 'n_i'; -options.PLAN = 'xy'; +options.PLAN = 'kxky'; % options.NAME = 'f_e'; % options.PLAN = 'sx'; options.COMP = 'avg'; % options.TIME = dat.Ts5D; -options.TIME = 100:1:200; +options.TIME = 00:1:200; data.EPS = 0.1; data.a = data.EPS * 2000; create_film(data,options,'.gif') end if 0 %% 2D snapshots % Options options.INTERP = 0; options.POLARPLOT = 0; options.AXISEQUAL = 1; options.NAME = '\phi'; % options.NAME = 'n_i'; % options.NAME = 'N_i^{00}'; % options.NAME = 'T_i'; % options.NAME = '\Gamma_x'; % options.NAME = 'k^2n_e'; -options.PLAN = 'kxky'; +options.PLAN = 'xy'; % options.NAME = 'f_e'; % options.PLAN = 'sx'; options.COMP = 1; -options.TIME = [1]; +options.TIME = [150]; data.a = data.EPS * 1000; fig = photomaton(data,options); save_figure(data,fig) end if 0 %% 3D plot on the geometry options.INTERP = 1; options.NAME = 'n_i'; -options.PLANES = 1:3:15; -options.TIME = [100]; +options.PLANES = 1; +options.TIME = [100 200]; options.PLT_MTOPO = 1; data.rho_o_R = 2e-3; % Sound larmor radius over Machine size ratio fig = show_geometry(data,options); save_figure(data,fig) end if 0 %% Kinetic distribution function sqrt(<f_a^2>xy) (GENE vsp) options.SPAR = linspace(-3,3,64)+(6/127/2); options.XPERP = linspace( 0,6,64); % options.SPAR = vp'; % options.XPERP = mu'; options.Z = 1; options.T = 5500; options.CTR = 1; options.ONED = 0; fig = plot_fa(data,options); save_figure(data,fig) end if 0 %% Hermite-Laguerre spectrum % options.TIME = 'avg'; options.P2J = 0; options.ST = 0; options.NORMALIZED = 0; fig = show_moments_spectrum(data,options); save_figure(data,fig) end if 0 %% Time averaged spectrum options.TIME = 1000:5000; options.NORM = 0; options.NAME = '\phi'; options.NAME = 'n_i'; options.NAME ='\Gamma_x'; options.PLAN = 'kxky'; options.COMPZ = 'avg'; options.OK = 0; options.COMPXY = 0; options.COMPT = 'avg'; options.PLOT = 'semilogy'; fig = spectrum_1D(data,options); % save_figure(data,fig) end if 0 %% 1D real plot -options.TIME = 20; +options.TIME = [50 100 200]; options.NORM = 0; options.NAME = '\phi'; % options.NAME = 'n_i'; % options.NAME ='\Gamma_x'; % options.NAME ='s_y'; -options.COMPX = 1; -options.COMPY = 1; +options.COMPX = 'avg'; +options.COMPY = 'avg'; options.COMPZ = 1; -options.COMPT = 'avg'; +options.COMPT = 1; options.MOVMT = 1; fig = real_plot_1D(data,options); % save_figure(data,fig) end if 0 %% Mode evolution options.NORMALIZED = 1; options.K2PLOT = 1; options.TIME = 5:1:15; options.NMA = 1; options.NMODES = 5; options.iz = 1; fig = mode_growth_meter(data,options); save_figure(data,fig) end if 0 %% ZF caracteristics (space time diagrams) TAVG_0 = 200; TAVG_1 = 3000; % Averaging times duration % chose your field to plot in spacetime diag (uzf,szf,Gx) fig = ZF_spacetime(data,TAVG_0,TAVG_1); save_figure(data,fig) end if 0 %% Metric infos fig = plot_metric(data); end if 0 %% linear growth rate for 3D fluxtube trange = [0 100]; nplots = 1; lg = compute_fluxtube_growth_rate(data,trange,nplots); end if 0 %% linear growth rate for 3D Zpinch trange = [5 15]; options.keq0 = 1; % chose to plot planes at k=0 or max options.kxky = 1; options.kzkx = 0; options.kzky = 1; [lg, fig] = compute_3D_zpinch_growth_rate(data,trange,options); save_figure(data,fig) end diff --git a/wk/analysis_header.m b/wk/analysis_header.m index 3970fcc..b3cf14f 100644 --- a/wk/analysis_header.m +++ b/wk/analysis_header.m @@ -1,12 +1,12 @@ % Directory of the code "mypathtoHeLaZ/HeLaZ/" helazdir = '/home/ahoffman/HeLaZ/'; % Directory of the simulation (from results) % if 1% Local results outfile =''; -outfile ='quick_run/64x64_5x3_L_120_kN_2.0_kT_0.5_nu_1e-01_SGGK'; +% outfile ='quick_run/CLOS_1_64x64_5x3_L_120_kN_2.0_kT_0.5_nu_1e-01_SGGK'; % outfile ='pedestal/64x64x16x2x1_L_300_LnT_20_nu_0.1'; % outfile ='quick_run/32x32x16_5x3_L_300_q0_2.5_e_0.18_kN_20_kT_20_nu_1e-01_DGGK'; -% outfile ='shearless_cyclone/128x128x16x4x2_L_120_CTC_1.0/'; +outfile ='shearless_cyclone/128x128x16x8x4_L_120_CTC_1.0/'; % outfile ='shearless_cyclone/180x180x20x4x2_L_120_CBC_0.8_to_1.0/'; % outfile ='pedestal/128x128x16x4x2_L_120_LnT_40_nuDG_0.1'; run analysis_3D diff --git a/wk/gene_analysis_3D.m b/wk/gene_analysis_3D.m index 700916a..6a08d4a 100644 --- a/wk/gene_analysis_3D.m +++ b/wk/gene_analysis_3D.m @@ -1,86 +1,87 @@ % folder = '/misc/gene_results/shearless_cyclone/miller_output_1.0/'; % folder = '/misc/gene_results/shearless_cyclone/miller_output_0.8/'; -folder = '/misc/gene_results/shearless_cyclone/s_alpha_output_1.0/'; +folder = '/misc/gene_results/shearless_cyclone/s_alpha_output_1.2/'; % folder = '/misc/gene_results/shearless_cyclone/s_alpha_output_0.5/'; % folder = '/misc/gene_results/shearless_cyclone/LD_s_alpha_output_1.0/'; % folder = '/misc/gene_results/shearless_cyclone/LD_s_alpha_output_0.8/'; % folder = '/misc/gene_results/HP_fig_2b_mu_5e-2/'; % folder = '/misc/gene_results/HP_fig_2c_mu_5e-2/'; gene_data = load_gene_data(folder); -gene_data = rotate_c_plane_nxnky_to_nkxny(gene_data); +% gene_data = rotate_c_plane_nxnky_to_nkxny(gene_data); +gene_data = invert_kxky_to_kykx_gene_results(gene_data); if 1 %% Space time diagramm (fig 11 Ivanov 2020) -TAVG_0 = 500; TAVG_1 = 700; % Averaging times duration -% chose your field to plot in spacetime diag (uzf,szf,Gx) -field = 'phi'; -compz = 'avg'; -nmvm = 1; -fig = plot_radial_transport_and_spacetime(gene_data,TAVG_0,TAVG_1,field,nmvm,compz); +options.TAVG_0 = 0.8*gene_data.Ts3D(end); +options.TAVG_1 = gene_data.Ts3D(end); % Averaging times duration +options.NMVA = 1; % Moving average for time traces +options.ST_FIELD = '\phi'; % chose your field to plot in spacetime diag (e.g \phi,v_x,G_x, Q_x) +options.INTERP = 1; +fig = plot_radial_transport_and_spacetime(gene_data,options); % save_figure(data,fig) end if 0 %% 2D snapshots % Options options.INTERP = 1; options.POLARPLOT = 0; options.AXISEQUAL = 1; options.NAME = '\phi'; % options.NAME = 'n_i'; % options.NAME = 'T_i'; % options.NAME = '\Gamma_x'; % options.NAME = 'k^2n_e'; options.PLAN = 'xz'; % options.NAME ='f_e'; % options.PLAN = 'sx'; options.COMP = 'avg'; options.TIME = [100 300 900]; gene_data.a = data.EPS * 2000; fig = photomaton(gene_data,options); save_figure(gene_data,fig) end if 0 %% MOVIES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Options options.INTERP = 0; options.POLARPLOT = 0; options.NAME = '\phi'; % options.NAME = 'v_y'; % options.NAME = 'n_i^{NZ}'; % options.NAME = '\Gamma_x'; % options.NAME = 'n_i'; -options.PLAN = 'xz'; +options.PLAN = 'xy'; % options.NAME = 'f_e'; % options.PLAN = 'sx'; options.COMP = 'avg'; -options.TIME = 400:700; +options.TIME = 000:200; gene_data.a = data.EPS * 2000; create_film(gene_data,options,'.gif') end if 0 %% Geometry names = {'$g^{xx}$','$g^{xy}$','$g^{xz}$','$g^{yy}$','$g^{yz}$','$g^{zz}$',... '$B_0$','$\partial_x B_0$','$\partial_y B_0$','$\partial_z B_0$',... '$J$','$R$','$\phi$','$Z$','$\partial_R x$','$\partial_Z x$'}; figure; subplot(311) for i = 1:6 plot(gene_data.z, gene_data.geo_arrays(:,i),'DisplayName',names{i}); hold on; end xlim([min(gene_data.z),max(gene_data.z)]); legend('show'); title('GENE geometry'); subplot(312) for i = 7:10 plot(gene_data.z, gene_data.geo_arrays(:,i),'DisplayName',names{i}); hold on; end xlim([min(gene_data.z),max(gene_data.z)]); legend('show'); subplot(313) for i = 11:16 plot(gene_data.z, gene_data.geo_arrays(:,i),'DisplayName',names{i}); hold on; end xlim([min(gene_data.z),max(gene_data.z)]); legend('show'); end