diff --git a/Makefile b/Makefile index 8d514dcc7d7318e0c35b61d39927c75427eb40af..c405b8e434025e986bb7984516a8f806f072c3d7 100644 --- a/Makefile +++ b/Makefile @@ -114,7 +114,7 @@ $(OBJDIR)/utility_mod.o $(OBJDIR)/initial_par_mod.o : src/initial_par_mod.F90 $(OBJDIR)/basic_mod.o $(OBJDIR)/prec_const_mod.o $(F90) -c $(F90FLAGS) $(FPPFLAGS) $(EXTMOD) $(EXTINC) src/initial_par_mod.F90 -o $@ - $(OBJDIR)/geometry_mod.o : src/geometry_mod.F90 $(OBJDIR)/array_mod.o $(OBJDIR)/grid_mod.o $(OBJDIR)/model_mod.o $(OBJDIR)/prec_const_mod.o + $(OBJDIR)/geometry_mod.o : src/geometry_mod.F90 $(OBJDIR)/array_mod.o $(OBJDIR)/grid_mod.o $(OBJDIR)/model_mod.o $(OBJDIR)/prec_const_mod.o $(OBJDIR)/utility_mod.o $(F90) -c $(F90FLAGS) $(FPPFLAGS) $(EXTMOD) $(EXTINC) src/geometry_mod.F90 -o $@ $(OBJDIR)/main.o : src/main.F90 $(OBJDIR)/prec_const_mod.o diff --git a/matlab/extract_fig_data.m b/matlab/extract_fig_data.m index 65b13c91548e2b648e6f6c5281d70b7765f53ce8..32ac436755659dbdcee89b79ab50d3d9f5e3612d 100644 --- a/matlab/extract_fig_data.m +++ b/matlab/extract_fig_data.m @@ -7,4 +7,4 @@ Y_ = dataObjs(1).YData; figure; plot(X_,Y_); -plot(X_(9000:12000)-X_(8000),Y_(9000:12000)); \ No newline at end of file +plot(X_-X_(1),Y_); \ No newline at end of file diff --git a/matlab/load_params.m b/matlab/load_params.m index 1b0abf43828ebee86a1e80bd1bcf018a78873712..fe3e99259d224c5807cdfee2d41bc30c2e199d84 100644 --- a/matlab/load_params.m +++ b/matlab/load_params.m @@ -1,9 +1,12 @@ CO = h5readatt(filename,'/data/input','CO'); % K_N = h5readatt(filename,'/data/input','eta_n'); % K_T = h5readatt(filename,'/data/input','eta_T'); -K_N = h5readatt(filename,'/data/input','K_n'); -K_T = h5readatt(filename,'/data/input','K_T'); -K_E = h5readatt(filename,'/data/input','K_E'); +K_N = h5readatt(filename,'/data/input','K_n'); +K_T = h5readatt(filename,'/data/input','K_T'); +K_E = h5readatt(filename,'/data/input','K_E'); +Q0 = h5readatt(filename,'/data/input','q0'); +SHEAR = h5readatt(filename,'/data/input','shear'); +EPS = h5readatt(filename,'/data/input','eps'); PMAXI = h5readatt(filename,'/data/input','pmaxi'); JMAXI = h5readatt(filename,'/data/input','jmaxi'); PMAXE = h5readatt(filename,'/data/input','pmaxe'); diff --git a/matlab/load_results.m b/matlab/load_results.m index 81bac625891aec776f3deb0eb56b96651937bc16..ad16253186baa5d97f83f08c35f7b7f72b5911c2 100644 --- a/matlab/load_results.m +++ b/matlab/load_results.m @@ -14,6 +14,8 @@ W_NAPJ = strcmp(h5readatt(filename,'/data/input','write_Napj' ),'y'); W_SAPJ = strcmp(h5readatt(filename,'/data/input','write_Sapj' ),'y'); W_DENS = strcmp(h5readatt(filename,'/data/input','write_dens' ),'y'); W_TEMP = strcmp(h5readatt(filename,'/data/input','write_temp' ),'y'); +% KIN_E = strcmp(h5readatt(filename,'/data/input', 'KIN_E' ),'y'); +KIN_E = 1; if W_GAMMA @@ -31,26 +33,36 @@ end if W_NA00 [Ni00, Ts3D, dt3D] = load_3D_data(filename, 'Ni00'); + if(KIN_E) Ne00 = load_3D_data(filename, 'Ne00'); + end end if W_NAPJ [Nipj, Ts5D, dt5D] = load_5D_data(filename, 'moments_i'); + if(KIN_E) [Nepj ] = load_5D_data(filename, 'moments_e'); + end end if W_SAPJ [Sipj, Ts5D, dt5D] = load_5D_data(filename, 'Sipj'); + if(KIN_E) Sepj = load_5D_data(filename, 'Sepj'); + end end if W_DENS + if(KIN_E) [DENS_E, Ts3D, dt3D] = load_3D_data(filename, 'dens_e'); + end [DENS_I, Ts3D, dt3D] = load_3D_data(filename, 'dens_i'); end if W_TEMP + if(KIN_E) [TEMP_E, Ts3D, dt3D] = load_3D_data(filename, 'temp_e'); + end [TEMP_I, Ts3D, dt3D] = load_3D_data(filename, 'temp_i'); end \ No newline at end of file diff --git a/matlab/post_processing.m b/matlab/post_processing.m index 434be93a4d18a9086d2fb1990652a50c414e89dc..1cccc49ff54b7d090c4c3ab127f40c78b5b99927 100644 --- a/matlab/post_processing.m +++ b/matlab/post_processing.m @@ -23,7 +23,6 @@ Lx = 2*pi/dkx; Ly = 2*pi/dky; dx = Lx/Nx; dy = Ly/Ny; dz = 2*pi/Nz; x = dx*(-Nx/2:(Nx/2-1)); Lx = max(x)-min(x); y = dy*(-Ny/2:(Ny/2-1)); Ly = max(y)-min(y); -z = dz * (1:Nz); [Y_XY,X_XY] = meshgrid(y,x); [Z_XZ,X_XZ] = meshgrid(z,x); [Z_YZ,Y_YZ] = meshgrid(z,y); @@ -153,45 +152,45 @@ for it = 1:numel(Ts5D) % Loop over 5D aX_XYays end %% Compute primary instability growth rate -disp('- growth rate') -% Find max value of transport (end of linear mode) -[tmp,tmax] = max(GGAMMA_RI*(2*pi/Nx/Ny)^2); -[~,itmax] = min(abs(Ts3D-tmax)); -tstart = 0.1 * Ts3D(itmax); tend = 0.5 * Ts3D(itmax); -[~,its3D_lin] = min(abs(Ts3D-tstart)); -[~,ite3D_lin] = min(abs(Ts3D-tend)); - -g_I = zeros(Nkx,Nky,Nz); -for ikx = 1:Nkx - for iky = 1:Nky - for iz = 1:Nz - [g_I(ikx,iky,iz), ~] = LinearFit_s(Ts3D(its3D_lin:ite3D_lin)',squeeze(abs(Ni00(ikx,iky,iz,its3D_lin:ite3D_lin)))); - end - end -end -[gmax_I,ikmax_I] = max(max(g_I(1,:,:),[],2),[],3); -kmax_I = abs(ky(ikmax_I)); -Bohm_transport = K_N*gmax_I/kmax_I^2; +% disp('- growth rate') +% % Find max value of transport (end of linear mode) +% [tmp,tmax] = max(GGAMMA_RI*(2*pi/Nx/Ny)^2); +% [~,itmax] = min(abs(Ts3D-tmax)); +% tstart = 0.1 * Ts3D(itmax); tend = 0.5 * Ts3D(itmax); +% [~,its3D_lin] = min(abs(Ts3D-tstart)); +% [~,ite3D_lin] = min(abs(Ts3D-tend)); +% +% g_I = zeros(Nkx,Nky,Nz); +% for ikx = 1:Nkx +% for iky = 1:Nky +% for iz = 1:Nz +% [g_I(ikx,iky,iz), ~] = LinearFit_s(Ts3D(its3D_lin:ite3D_lin)',squeeze(abs(Ni00(ikx,iky,iz,its3D_lin:ite3D_lin)))); +% end +% end +% end +% [gmax_I,ikmax_I] = max(max(g_I(1,:,:),[],2),[],3); +% kmax_I = abs(ky(ikmax_I)); +% Bohm_transport = K_N*gmax_I/kmax_I^2; %% Compute secondary instability growth rate -disp('- growth rate') -% Find max value of transport (end of linear mode) -% [tmp,tmax] = max(GGAMMA_RI*(2*pi/Nx/Ny)^2); -% [~,itmax] = min(abs(Ts2D-tmax)); -% tstart = Ts2D(itmax); tend = 1.5*Ts2D(itmax); -[~,its3D_lin] = min(abs(Ts3D-tstart)); -[~,ite3D_lin] = min(abs(Ts3D-tend)); - -g_II = zeros(Nkx,Nky); -for ikx = 1:Nkx - for iky = 1 - for iz = 1:Nz - [g_II(ikx,iky,iz), ~] = LinearFit_s(Ts3D(its3D_lin:ite3D_lin)',squeeze(abs(Ni00(ikx,iky,iz,its3D_lin:ite3D_lin)))); - end - end -end -[gmax_II,ikmax_II] = max(max(g_II(1,:,:),[],2),[],3); -kmax_II = abs(kx(ikmax_II)); +% disp('- growth rate') +% % Find max value of transport (end of linear mode) +% % [tmp,tmax] = max(GGAMMA_RI*(2*pi/Nx/Ny)^2); +% % [~,itmax] = min(abs(Ts2D-tmax)); +% % tstart = Ts2D(itmax); tend = 1.5*Ts2D(itmax); +% [~,its3D_lin] = min(abs(Ts3D-tstart)); +% [~,ite3D_lin] = min(abs(Ts3D-tend)); +% +% g_II = zeros(Nkx,Nky); +% for ikx = 1:Nkx +% for iky = 1 +% for iz = 1:Nz +% [g_II(ikx,iky,iz), ~] = LinearFit_s(Ts3D(its3D_lin:ite3D_lin)',squeeze(abs(Ni00(ikx,iky,iz,its3D_lin:ite3D_lin)))); +% end +% end +% end +% [gmax_II,ikmax_II] = max(max(g_II(1,:,:),[],2),[],3); +% kmax_II = abs(kx(ikmax_II)); %% zonal vs nonzonal energies for phi(t) Ephi_Z = zeros(1,Ns3D); @@ -210,7 +209,7 @@ for it = 1:numel(Ts3D) % Ephi_Z(it) = kx(ikzf)^2*abs(PHI(ikzf,1,1,it)).^2; Ephi_Z(it) = squeeze(sum(sum(((KX~=0).*(KY==0).*(KX.^2).*abs(PHI(:,:,1,it)).^2)))); % Ephi_NZ(it) = sum(sum(((KX.^2+KY.^2).*abs(PHI(:,:,1,it)).^2)))-Ephi_Z(it); - high_k_phi(it) = squeeze(abs(PHI(18,18,1,it)).^2); % kperp sqrt(2) +% high_k_phi(it) = squeeze(abs(PHI(18,18,1,it)).^2); % kperp sqrt(2) % high_k_phi(it) = abs(PHI(40,40,1,it)).^2;% kperp 3.5 end diff --git a/matlab/setup.m b/matlab/setup.m index e272a4f33cd119fc90ebf712e7033925291f8434..a9a1f15ba5d1f0e8f5468264b2ea9bf42c07db47 100644 --- a/matlab/setup.m +++ b/matlab/setup.m @@ -5,20 +5,22 @@ GRID.pmaxe = PMAXE; % Electron Hermite moments GRID.jmaxe = JMAXE; % Electron Laguerre moments GRID.pmaxi = PMAXI; % Ion Hermite moments GRID.jmaxi = JMAXI; % Ion Laguerre moments -GRID.Nx = Nx; % x grid resolution -GRID.Lx = Lx; % x length -GRID.Ny = Ny; % y '' -GRID.Ly = Ly; % y '' -GRID.Nz = Nz; % z resolution -GRID.q0 = q0; % q factor -GRID.shear = shear; % shear -GRID.eps = eps; % inverse aspect ratio +GRID.Nx = NX; % x grid resolution +GRID.Lx = LX; % x length +GRID.Ny = NY; % y '' +GRID.Ly = LY; % y '' +GRID.Nz = NZ; % z resolution +GRID.q0 = Q0; % q factor +GRID.shear = SHEAR; % shear +GRID.eps = EPS; % inverse aspect ratio % Model parameters MODEL.CO = CO; % Collision operator (0 : L.Bernstein, -1 : Full Coulomb, -2 : Dougherty) MODEL.CLOS = CLOS; MODEL.NL_CLOS = NL_CLOS; if NON_LIN; MODEL.NON_LIN = '.true.'; else; MODEL.NON_LIN = '.false.';end; +MODEL.KIN_E = KIN_E; +if KIN_E; MODEL.KIN_E = '.true.'; else; MODEL.KIN_E = '.false.';end; MODEL.mu = MU; MODEL.mu_p = MU_P; MODEL.mu_j = MU_J; @@ -98,28 +100,30 @@ coll_ = sprintf(coll_,NU); % nonlinear lin_ = []; if ~NON_LIN; lin_ = '_lin'; end +adiabe_ = []; +if ~KIN_E; adiabe_ = '_adiabe'; end % resolution and boxsize res_ = [num2str(GRID.Nx),'x',num2str(GRID.Ny)]; -if (Lx ~= Ly) - geo_ = ['_Lx_',num2str(Lx),'_Ly_',num2str(Ly)]; +if (LX ~= LY) + geo_ = ['_Lx_',num2str(LX),'_Ly_',num2str(LY)]; else - geo_ = ['_L_',num2str(Lx)]; + geo_ = ['_L_',num2str(LX)]; end -if (Nz > 1) %3D case - res_ = [res_,'x',num2str(GRID.Nz)]; - if abs(q0) > 0 - geo_ = [geo_,'_q0_',num2str(q0)]; +if (NZ > 1) %3D case + res_ = [res_,'x',num2str(NZ)]; + if abs(Q0) > 0 + geo_ = [geo_,'_q0_',num2str(Q0)]; end - if abs(eps) > 0 - geo_ = [geo_,'_e_',num2str(eps)]; + if abs(EPS) > 0 + geo_ = [geo_,'_e_',num2str(EPS)]; end - if abs(shear) > 0 - geo_ = [geo_,'_s_',num2str(shear)]; + if abs(SHEAR) > 0 + geo_ = [geo_,'_s_',num2str(SHEAR)]; end end % put everything together in the param character chain u_ = '_'; % underscore variable -PARAMS = [res_,HLdeg_,geo_,drives_,coll_,lin_]; +PARAMS = [res_,HLdeg_,geo_,drives_,coll_,lin_,adiabe_]; BASIC.RESDIR = [SIMDIR,PARAMS,'/']; BASIC.MISCDIR = ['/misc/HeLaZ_outputs/',SIMDIR(4:end),PARAMS,'/']; BASIC.PARAMS = PARAMS; diff --git a/matlab/write_fort90.m b/matlab/write_fort90.m index 57873487a7619ca979d19fb1059acbbb446f92cb..84259b0f77cca3641911abaf13592dc1cf25f820 100644 --- a/matlab/write_fort90.m +++ b/matlab/write_fort90.m @@ -49,6 +49,7 @@ fprintf(fid,[' CO = ', num2str(MODEL.CO),'\n']); fprintf(fid,[' CLOS = ', num2str(MODEL.CLOS),'\n']); fprintf(fid,[' NL_CLOS = ', num2str(MODEL.NL_CLOS),'\n']); fprintf(fid,[' NON_LIN = ', MODEL.NON_LIN,'\n']); +fprintf(fid,[' KIN_E = ', MODEL.KIN_E,'\n']); fprintf(fid,[' mu = ', num2str(MODEL.mu),'\n']); fprintf(fid,[' mu_p = ', num2str(MODEL.mu_p),'\n']); fprintf(fid,[' mu_j = ', num2str(MODEL.mu_j),'\n']); diff --git a/src/advance_field.F90 b/src/advance_field.F90 index 4f0aa5b9a94e7e8dfcdfed4c0df3e4a14871c5ee..5e8c87d622973eb76990cfba6658d4a3711d49c4 100644 --- a/src/advance_field.F90 +++ b/src/advance_field.F90 @@ -20,20 +20,22 @@ CONTAINS USE time_integration USE grid use prec_const - USE model, ONLY: CLOS + USE model, ONLY: CLOS, KIN_E use fields, ONLY: moments_e, moments_i use array, ONLY: moments_rhs_e, moments_rhs_i IMPLICIT NONE INTEGER :: p_int, j_int CALL cpu_time(t0_adv_field) - DO ip=ips_e,ipe_e - p_int = parray_e(ip) - DO ij=ijs_e,ije_e - IF((CLOS .NE. 1) .OR. (ip-1+2*(ij-1)+1 .LE. dmaxe))& - CALL advance_field(moments_e(ip,ij,:,:,:,:), moments_rhs_e(ip,ij,:,:,:,:)) + IF(KIN_E) THEN + DO ip=ips_e,ipe_e + p_int = parray_e(ip) + DO ij=ijs_e,ije_e + IF((CLOS .NE. 1) .OR. (ip-1+2*(ij-1)+1 .LE. dmaxe))& + CALL advance_field(moments_e(ip,ij,:,:,:,:), moments_rhs_e(ip,ij,:,:,:,:)) + ENDDO ENDDO - ENDDO + ENDIF DO ip=ips_i,ipe_i p_int = parray_i(ip) DO ij=ijs_i,ije_i diff --git a/src/array_mod.F90 b/src/array_mod.F90 index 9c14fcd3f0c40037c45549a3465b91b046eef58c..668a95bcca7c4fa0b3467c4496db5de57af75eb2 100644 --- a/src/array_mod.F90 +++ b/src/array_mod.F90 @@ -40,8 +40,6 @@ MODULE array ! Geoemtrical operators ! Curvature REAL(dp), DIMENSION(:,:,:), ALLOCATABLE :: Ckxky ! dimensions: kx, ky, z - ! kperp array - REAL(dp), DIMENSION(:,:,:), ALLOCATABLE, PUBLIC :: kparray ! dimensions: kx, ky, z ! Jacobian REAL(dp), DIMENSION(:), ALLOCATABLE :: Jacobian ! dimensions: z ! Metric @@ -62,6 +60,8 @@ MODULE array ! Kernel function evaluation (ij,ikx,iky,iz) REAL(dp), DIMENSION(:,:,:,:), ALLOCATABLE :: kernel_e REAL(dp), DIMENSION(:,:,:,:), ALLOCATABLE :: kernel_i + ! Poisson operator (ikx,iky,iz) + REAL(dp), DIMENSION(:,:,:), ALLOCATABLE :: inv_poisson_op !! Diagnostics ! Gyrocenter density for electron and ions (ikx,iky,iz) diff --git a/src/auxval.F90 b/src/auxval.F90 index ea051ab30482a2960c1baeb8a95b4d06e63a8b9a..8e642f6f8b7e744540429c938332ace97c5aedd3 100644 --- a/src/auxval.F90 +++ b/src/auxval.F90 @@ -21,7 +21,7 @@ subroutine auxval ENDIF ! Init the grids CALL set_pgrid ! parallel kin (MPI distributed) - + CALL set_jgrid ! perp kin CALL set_kxgrid ! radial modes (MPI distributed by FFTW) @@ -38,6 +38,8 @@ subroutine auxval CALL evaluate_kernels ! precompute the kernels + CALL evaluate_poisson_op ! precompute the kernels + IF ( NON_LIN ) THEN; CALL build_dnjs_table ! precompute the Laguerre nonlin product coeffs ENDIF diff --git a/src/closure_mod.F90 b/src/closure_mod.F90 index d3c48200e77ac6c39be794af4a903c5127e1c698..4b124fc32c7c2abfe9e397e69d27566bd26d9012 100644 --- a/src/closure_mod.F90 +++ b/src/closure_mod.F90 @@ -1,7 +1,7 @@ module closure ! Contains the routines to define closures USE basic -USE model, ONLY: CLOS, tau_e, tau_i, q_e, q_i, nu +USE model, ONLY: CLOS, tau_e, tau_i, q_e, q_i, nu, KIN_E USE grid USE array, ONLY: kernel_e, kernel_i USE fields, ONLY: moments_e, moments_i @@ -31,12 +31,14 @@ SUBROUTINE apply_closure_model DO ikx = ikxs,ikxe DO iky = ikys,ikye DO iz = izs,ize + IF(KIN_E) THEN DO ip = ipsg_e,ipeg_e DO ij = ijsg_e,ijeg_e IF ( parray_e(ip)+2*jarray_e(ip) .GT. dmaxe) & moments_e(ip,ij,ikx,iky,iz,updatetlevel) = 0._dp ENDDO ENDDO + ENDIF DO ip = ipsg_i,ipeg_i DO ij = ijsg_i,ijeg_i IF ( parray_i(ip)+2*jarray_i(ip) .GT. dmaxi) & @@ -65,6 +67,7 @@ SUBROUTINE ghosts_truncation DO ikx = ikxs,ikxe DO iky = ikys,ikye DO iz = izs,ize + IF(KIN_E) THEN DO ip = ipsg_e,ipeg_e moments_e(ip,ijsg_e,ikx,iky,iz,updatetlevel) = 0._dp moments_e(ip,ijeg_e,ikx,iky,iz,updatetlevel) = 0._dp @@ -79,7 +82,7 @@ SUBROUTINE ghosts_truncation ENDDO kernel_e(ijsg_e,ikx,iky,iz) = 0._dp kernel_e(ijeg_e,ikx,iky,iz) = 0._dp - + ENDIF DO ip = ipsg_i,ipeg_i moments_i(ip,ijsg_i,ikx,iky,iz,updatetlevel) = 0._dp moments_i(ip,ijeg_i,ikx,iky,iz,updatetlevel) = 0._dp diff --git a/src/collision_mod.F90 b/src/collision_mod.F90 index 4a0a291113656f220d4d5be7e36e5549222a8b12..3d2bd674d1358deaf2d320569451d7bfa0430364 100644 --- a/src/collision_mod.F90 +++ b/src/collision_mod.F90 @@ -67,8 +67,8 @@ CONTAINS !******************************************************************************! SUBROUTINE DoughertyGK_e(ip_,ij_,ikx_,iky_,iz_,TColl_) USE fields, ONLY: moments_e, phi - USE grid, ONLY: parray_e, jarray_e, kxarray, kyarray, Jmaxe, ip0_e, ip1_e, ip2_e - USE array, ONLY: kernel_e, kparray + USE grid, ONLY: parray_e, jarray_e, kxarray, kyarray, kparray, Jmaxe, ip0_e, ip1_e, ip2_e + USE array, ONLY: kernel_e USE basic USE model, ONLY: sigmae2_taue_o2, qe_taue, nu_ee, sqrt_sigmae2_taue_o2 USE time_integration, ONLY : updatetlevel @@ -173,8 +173,8 @@ CONTAINS !******************************************************************************! SUBROUTINE DoughertyGK_i(ip_,ij_,ikx_,iky_,iz_,TColl_) USE fields, ONLY: moments_i, phi - USE grid, ONLY: parray_i, jarray_i, kxarray, kyarray, Jmaxi, ip0_i, ip1_i, ip2_i - USE array, ONLY: kernel_i, kparray + USE grid, ONLY: parray_i, jarray_i, kxarray, kyarray, kparray, Jmaxi, ip0_i, ip1_i, ip2_i + USE array, ONLY: kernel_i USE basic USE model, ONLY: sigmai2_taui_o2, qi_taui, nu_i, sqrt_sigmai2_taui_o2 USE time_integration, ONLY : updatetlevel @@ -303,6 +303,7 @@ CONTAINS DO ikx = ikxs,ikxe DO iky = ikys,ikye DO iz = izs,ize + IF(KIN_E) THEN ! Electrons DO ij = 1,Jmaxe+1 ! Loop over all p to compute sub collision term @@ -325,6 +326,7 @@ CONTAINS TColl_e(ip,ij,ikx,iky,iz) = TColl_distr_e(ip) ENDDO ENDDO + ENDIF ! Ions DO ij = 1,Jmaxi+1 DO ip = 1,total_np_i @@ -419,7 +421,7 @@ CONTAINS USE basic USE time_integration, ONLY : updatetlevel USE utility - USE model, ONLY: CO, nu_i, nu_ie, CLOS + USE model, ONLY: CO, nu_i, nu_ie, CLOS, KIN_E IMPLICIT NONE INTEGER, INTENT(IN) :: ip_, ij_ ,ikx_, iky_, iz_ COMPLEX(dp), INTENT(OUT) :: TColl_ @@ -440,12 +442,16 @@ CONTAINS jloopii: DO ij2 = ijs_i,ije_i j2_int = jarray_i(ij2) IF((CLOS .NE. 1) .OR. (p2_int+2*j2_int .LE. dmaxi))& + ! Ion-ion collision TColl_ = TColl_ + moments_i(ip2,ij2,ikx_,iky_,iz_,updatetlevel) & - *( nu_ie * CiepjT(bari(p_int,j_int), bari(p2_int,j2_int), ikx_C, iky_C) & - +nu_i * Ciipj (bari(p_int,j_int), bari(p2_int,j2_int), ikx_C, iky_C)) + * nu_i * Ciipj (bari(p_int,j_int), bari(p2_int,j2_int), ikx_C, iky_C) + IF(KIN_E) & ! Ion-electron collision test + TColl_ = TColl_ + moments_i(ip2,ij2,ikx_,iky_,iz_,updatetlevel) & + * nu_ie * CiepjT(bari(p_int,j_int), bari(p2_int,j2_int), ikx_C, iky_C) ENDDO jloopii ENDDO ploopii + IF(KIN_E) THEN ! Ion-electron collision field ploopie: DO ip2 = ips_e,ipe_e ! sum the ion-electron field terms p2_int = parray_e(ip2) jloopie: DO ij2 = ijs_e,ije_e @@ -455,6 +461,7 @@ CONTAINS *(nu_ie * CiepjF(bari(p_int,j_int), bare(p2_int,j2_int), ikx_C, iky_C)) ENDDO jloopie ENDDO ploopie + ENDIF END SUBROUTINE apply_COSOlver_mat_i diff --git a/src/compute_Sapj.F90 b/src/compute_Sapj.F90 index 967e1039db9e1f93187521bd8857382a73b38297..bfc834960b7c5604d0729a9a6df3e0c3e20ca0e7 100644 --- a/src/compute_Sapj.F90 +++ b/src/compute_Sapj.F90 @@ -25,8 +25,9 @@ SUBROUTINE compute_Sapj ! Execution time start CALL cpu_time(t0_Sapj) -zloop: DO iz = izs,ize !!!!!!!!!!!!!!!!!!!! ELECTRON non linear term computation (Sepj)!!!!!!!!!! + IF(KIN_E) THEN + zloope: DO iz = izs,ize ploope: DO ip = ips_e,ipe_e ! Loop over Hermite moments p_int = parray_e(ip) jloope: DO ij = ijs_e, ije_e ! Loop over Laguerre moments @@ -118,9 +119,12 @@ zloop: DO iz = izs,ize ENDIF GF_CLOSURE_e ENDDO jloope ENDDO ploope +ENDDO zloope +ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!! ION non linear term computation (Sipj)!!!!!!!!!! +zloopi: DO iz = izs,ize ploopi: DO ip = ips_i,ipe_i ! Loop over Hermite moments ! we check if poly degree is even (eq to index is odd) to spare computation @@ -214,11 +218,10 @@ zloop: DO iz = izs,ize ENDIF GF_CLOSURE_i ENDDO jloopi ENDDO ploopi +ENDDO zloopi !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! Execution time END CALL cpu_time(t1_Sapj) tc_Sapj = tc_Sapj + (t1_Sapj - t0_Sapj) - -ENDDO zloop END SUBROUTINE compute_Sapj diff --git a/src/diagnose.F90 b/src/diagnose.F90 index 4ab9b96142955695cff335cbf24cdcff602cc44a..1ba38d81a0e333fa1b5757ea43fc87411a70157b 100644 --- a/src/diagnose.F90 +++ b/src/diagnose.F90 @@ -109,16 +109,19 @@ SUBROUTINE diagnose(kstep) IF (write_phi) CALL creatg(fidres, "/data/var3d/phi", "phi") IF (write_Na00) THEN + IF(KIN_E)& CALL creatg(fidres, "/data/var3d/Ne00", "Ne00") CALL creatg(fidres, "/data/var3d/Ni00", "Ni00") ENDIF IF (write_dens) THEN + IF(KIN_E)& CALL creatg(fidres, "/data/var3d/dens_e", "dens_e") CALL creatg(fidres, "/data/var3d/dens_i", "dens_i") ENDIF IF (write_temp) THEN + IF(KIN_E)& CALL creatg(fidres, "/data/var3d/temp_e", "temp_e") CALL creatg(fidres, "/data/var3d/temp_i", "temp_i") ENDIF @@ -136,11 +139,13 @@ SUBROUTINE diagnose(kstep) CALL creatd(fidres, rank, dims, "/data/var5d/cstep", "iteration number") IF (write_Napj) THEN + IF(KIN_E)& CALL creatg(fidres, "/data/var5d/moments_e", "moments_e") CALL creatg(fidres, "/data/var5d/moments_i", "moments_i") ENDIF IF (write_Sapj) THEN + IF(KIN_E)& CALL creatg(fidres, "/data/var5d/moments_e", "Sipj") CALL creatg(fidres, "/data/var5d/moments_i", "Sepj") ENDIF @@ -291,6 +296,7 @@ SUBROUTINE diagnose_0d USE diagnostics_par USE prec_const USE processing + USE model, ONLY: KIN_E IMPLICIT NONE ! Time measurement data @@ -335,6 +341,7 @@ SUBROUTINE diagnose_2d USE diagnostics_par USE prec_const USE processing + USE model, ONLY: KIN_E IMPLICIT NONE @@ -389,6 +396,7 @@ SUBROUTINE diagnose_3d USE diagnostics_par USE prec_const USE processing + USE model, ONLY: KIN_E IMPLICIT NONE @@ -403,26 +411,30 @@ SUBROUTINE diagnose_3d IF (write_phi) CALL write_field3d(phi (:,:,:), 'phi') IF (write_Na00) THEN - IF ( (ips_e .EQ. 1) .AND. (ips_i .EQ. 1) ) THEN + IF(KIN_E)THEN + IF (ips_e .EQ. 1) THEN Ne00(ikxs:ikxe,ikys:ikye,izs:ize) = moments_e(ips_e,1,ikxs:ikxe,ikys:ikye,izs:ize,updatetlevel) - Ni00(ikxs:ikxe,ikys:ikye,izs:ize) = moments_i(ips_e,1,ikxs:ikxe,ikys:ikye,izs:ize,updatetlevel) ENDIF - CALL manual_3D_bcast(Ne00(ikxs:ikxe,ikys:ikye,izs:ize)) CALL write_field3d(Ne00(ikxs:ikxe,ikys:ikye,izs:ize), 'Ne00') - + ENDIF + IF (ips_i .EQ. 1) THEN + Ni00(ikxs:ikxe,ikys:ikye,izs:ize) = moments_i(ips_e,1,ikxs:ikxe,ikys:ikye,izs:ize,updatetlevel) + ENDIF CALL manual_3D_bcast(Ni00(ikxs:ikxe,ikys:ikye,izs:ize)) CALL write_field3d(Ni00(ikxs:ikxe,ikys:ikye,izs:ize), 'Ni00') ENDIF IF (write_dens) THEN CALL compute_density + IF(KIN_E)& CALL write_field3d(dens_e(ikxs:ikxe,ikys:ikye,izs:ize), 'dens_e') CALL write_field3d(dens_i(ikxs:ikxe,ikys:ikye,izs:ize), 'dens_i') ENDIF IF (write_temp) THEN CALL compute_temperature + IF(KIN_E)& CALL write_field3d(temp_e(ikxs:ikxe,ikys:ikye,izs:ize), 'temp_e') CALL write_field3d(temp_i(ikxs:ikxe,ikys:ikye,izs:ize), 'temp_i') ENDIF @@ -463,6 +475,7 @@ SUBROUTINE diagnose_5d USE time_integration USE diagnostics_par USE prec_const + USE model, ONLY: KIN_E IMPLICIT NONE CALL append(fidres, "/data/var5d/time", time,ionode=0) @@ -472,11 +485,13 @@ SUBROUTINE diagnose_5d CALL attach(fidres,"/data/var5d/" , "frames", iframe5d) IF (write_Napj) THEN + IF(KIN_E)& CALL write_field5d_e(moments_e(ips_e:ipe_e,ijs_e:ije_e,:,:,:,updatetlevel), 'moments_e') CALL write_field5d_i(moments_i(ips_i:ipe_i,ijs_i:ije_i,:,:,:,updatetlevel), 'moments_i') ENDIF IF (write_Sapj) THEN + IF(KIN_E)& CALL write_field5d_e(Sepj(ips_e:ipe_e,ijs_e:ije_e,:,:,:), 'Sepj') CALL write_field5d_i(Sipj(ips_i:ipe_i,ijs_i:ije_i,:,:,:), 'Sipj') ENDIF diff --git a/src/geometry_mod.F90 b/src/geometry_mod.F90 index be73c0a59664258d56062cb0ffb0a20b566b18be..2ef6d63d89deb20184000084cd792aa9a8d09b75 100644 --- a/src/geometry_mod.F90 +++ b/src/geometry_mod.F90 @@ -8,9 +8,11 @@ module geometry use array use fields use basic + use utility, ONLY: simpson_rule_z implicit none public + COMPLEX(dp), PROTECTED :: iInt_Jacobian contains @@ -18,6 +20,7 @@ contains ! evalute metrix, elements, jacobian and gradient implicit none REAL(dp) :: kx,ky + COMPLEX(dp), DIMENSION(izs:ize) :: integrant ! IF( (Ny .EQ. 1) .AND. (Nz .EQ. 1)) THEN !1D perp linear run IF( my_id .eq. 0 ) WRITE(*,*) '1D perpendicular geometry' @@ -41,6 +44,11 @@ contains ENDDO ENDDO ENDDO + ! + ! Compute the inverse z integrated Jacobian (useful for flux averaging) + integrant = Jacobian ! Convert into complex array + CALL simpson_rule_z(integrant,iInt_Jacobian) + iInt_Jacobian = 1._dp/iInt_Jacobian ! reverse it END SUBROUTINE eval_magnetic_geometry ! !-------------------------------------------------------------------------------- diff --git a/src/ghosts_mod.F90 b/src/ghosts_mod.F90 index c3a4e82d92f404b8b1980a4e18ab23b1a9f56c50..fa0757f9b15a1a7b26d92027bbd3934aeee189e8 100644 --- a/src/ghosts_mod.F90 +++ b/src/ghosts_mod.F90 @@ -3,6 +3,7 @@ USE basic USE fields, ONLY : moments_e, moments_i USE grid USE time_integration +USE model, ONLY : KIN_E IMPLICIT NONE @@ -17,7 +18,7 @@ SUBROUTINE update_ghosts IF (num_procs_p .GT. 1) THEN ! Do it only if we share the p CALL MPI_BARRIER(MPI_COMM_WORLD,ierr) - CALL update_ghosts_p_e + IF(KIN_E) CALL update_ghosts_p_e CALL MPI_BARRIER(MPI_COMM_WORLD,ierr) CALL update_ghosts_p_i diff --git a/src/grid_mod.F90 b/src/grid_mod.F90 index 9a6d695b3bea3117884ab29b2f7fe56fa4de04f1..a2736db8c102e24b5204804c3cd7216f61cc8157 100644 --- a/src/grid_mod.F90 +++ b/src/grid_mod.F90 @@ -57,6 +57,7 @@ MODULE grid ! Grids containing position in fourier space REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: kxarray, kxarray_full REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: kyarray, kyarray_full + REAL(dp), DIMENSION(:,:,:), ALLOCATABLE, PUBLIC :: kparray REAL(dp), PUBLIC, PROTECTED :: deltakx, deltaky, kx_max, ky_max!, kp_max REAL(dp), PUBLIC, PROTECTED :: local_kxmax, local_kymax INTEGER, PUBLIC, PROTECTED :: ikxs, ikxe, ikys, ikye!, ikps, ikpe diff --git a/src/inital.F90 b/src/inital.F90 index 3bac2e8902e2a8751451f18e28b653d796089603..0627b10e52124356cc6bf32e09299a9548ddd6b7 100644 --- a/src/inital.F90 +++ b/src/inital.F90 @@ -274,7 +274,7 @@ SUBROUTINE init_phi IMPLICIT NONE REAL(dp) :: noise - REAL(dp) :: kx, ky, sigma, gain, ky_shift + REAL(dp) :: kx, ky, kp, sigma, gain, ky_shift INTEGER, DIMENSION(12) :: iseedarr ! Seed random number generator @@ -286,8 +286,9 @@ SUBROUTINE init_phi DO ikx=ikxs,ikxe DO iky=ikys,ikye DO iz=izs,ize + kp = kparray(ikx,iky,iz) CALL RANDOM_NUMBER(noise) - phi(ikx,iky,iz) = (init_background + init_noiselvl*(noise-0.5_dp))!*AA_x(ikx)*AA_y(iky) + phi(ikx,iky,iz) = (init_background + init_noiselvl*(noise-0.5_dp))*EXP(-0.1*kp**2)!*AA_x(ikx)*AA_y(iky) ENDDO END DO END DO diff --git a/src/memory.F90 b/src/memory.F90 index e6dc6a2abb935e9721364d5c2e9247b384d6722e..0cfc3203f5d87ed3d4fc474e0ca2afd8a09509d9 100644 --- a/src/memory.F90 +++ b/src/memory.F90 @@ -6,70 +6,52 @@ SUBROUTINE memory USE fields USE grid USE time_integration - USE model, ONLY: CO, NON_LIN + USE model, ONLY: CO, NON_LIN, KIN_E USE prec_const IMPLICIT NONE - !___________________ 2D ARRAYS __________________________ + ! Electrostatic potential CALL allocate_array(phi, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array(inv_poisson_op, ikxs,ikxe, ikys,ikye, izs,ize) + + !Electrons arrays + IF(KIN_E) THEN + CALL allocate_array( Ne00, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( dens_e, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( temp_e, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( Kernel_e, ijsg_e,ijeg_e, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( moments_e, ipsg_e,ipeg_e, ijsg_e,ijeg_e, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) + CALL allocate_array( moments_rhs_e, ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) + CALL allocate_array( nadiab_moments_e, ipsg_e,ipeg_e, ijsg_e,ijeg_e, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( TColl_e, ips_e,ipe_e, ijs_e,ije_e , ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( Sepj, ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( xnepj, ips_e,ipe_e, ijs_e,ije_e) + CALL allocate_array( xnepp2j, ips_e,ipe_e) + CALL allocate_array( xnepp1j, ips_e,ipe_e) + CALL allocate_array( xnepm1j, ips_e,ipe_e) + CALL allocate_array( xnepm2j, ips_e,ipe_e) + CALL allocate_array( xnepjp1, ijs_e,ije_e) + CALL allocate_array( xnepjm1, ijs_e,ije_e) + CALL allocate_array( ynepp1j, ips_e,ipe_e, ijs_e,ije_e) + CALL allocate_array( ynepm1j, ips_e,ipe_e, ijs_e,ije_e) + CALL allocate_array( ynepp1jm1, ips_e,ipe_e, ijs_e,ije_e) + CALL allocate_array( ynepm1jm1, ips_e,ipe_e, ijs_e,ije_e) + CALL allocate_array( zNepm1j, ips_e,ipe_e, ijs_e,ije_e) + CALL allocate_array( zNepm1jp1, ips_e,ipe_e, ijs_e,ije_e) + CALL allocate_array( zNepm1jm1, ips_e,ipe_e, ijs_e,ije_e) + ENDIF - !! Diagnostics arrays - ! Gyrocenter density *for 2D output* - CALL allocate_array(Ne00, ikxs,ikxe, ikys,ikye, izs,ize) + !Ions arrays CALL allocate_array(Ni00, ikxs,ikxe, ikys,ikye, izs,ize) - ! particle density *for 2D output* - CALL allocate_array(dens_e, ikxs,ikxe, ikys,ikye, izs,ize) CALL allocate_array(dens_i, ikxs,ikxe, ikys,ikye, izs,ize) - ! particle temperature *for 2D output* - CALL allocate_array(temp_e, ikxs,ikxe, ikys,ikye, izs,ize) CALL allocate_array(temp_i, ikxs,ikxe, ikys,ikye, izs,ize) - - !___________________ 4D ARRAYS __________________________ - !! FLR kernels functions - ! Kernel evaluation from j= -1 to jmax+1 for truncation - CALL allocate_array(Kernel_e, ijsg_e,ijeg_e, ikxs,ikxe, ikys,ikye, izs,ize) - CALL allocate_array(Kernel_i, ijsg_i,ijeg_i, ikxs,ikxe, ikys,ikye, izs,ize) - - !___________________ 5D ARRAYS __________________________ - ! Moments with ghost degrees for p+2 p-2, j+1, j-1 truncations - CALL allocate_array( moments_e, ipsg_e,ipeg_e, ijsg_e,ijeg_e, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) - CALL allocate_array( moments_i, ipsg_i,ipeg_i, ijsg_i,ijeg_i, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) - - ! Moments right-hand-side (contains linear part of hierarchy) - CALL allocate_array( moments_rhs_e, ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) - CALL allocate_array( moments_rhs_i, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) - - ! Non linear terms and dnjs table - CALL allocate_array( nadiab_moments_e, ipsg_e,ipeg_e, ijsg_e,ijeg_e, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( Kernel_i, ijsg_i,ijeg_i, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( moments_i, ipsg_i,ipeg_i, ijsg_i,ijeg_i, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) + CALL allocate_array( moments_rhs_i, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) CALL allocate_array( nadiab_moments_i, ipsg_i,ipeg_i, ijsg_i,ijeg_i, ikxs,ikxe, ikys,ikye, izs,ize) - - ! Collision term - CALL allocate_array( TColl_e, ips_e,ipe_e, ijs_e,ije_e , ikxs,ikxe, ikys,ikye, izs,ize) - CALL allocate_array( TColl_i, ips_i,ipe_i, ijs_i,ije_i , ikxs,ikxe, ikys,ikye, izs,ize) - - ! Non linear terms and dnjs table - CALL allocate_array( Sepj, ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize) - CALL allocate_array( Sipj, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize) - CALL allocate_array( dnjs, 1,maxj+1, 1,maxj+1, 1,maxj+1) - - ! Linear coeff for moments rhs - ! electrons - CALL allocate_array( xnepj, ips_e,ipe_e, ijs_e,ije_e) - CALL allocate_array( xnepp2j, ips_e,ipe_e) - CALL allocate_array( xnepp1j, ips_e,ipe_e) - CALL allocate_array( xnepm1j, ips_e,ipe_e) - CALL allocate_array( xnepm2j, ips_e,ipe_e) - CALL allocate_array( xnepjp1, ijs_e,ije_e) - CALL allocate_array( xnepjm1, ijs_e,ije_e) - CALL allocate_array( ynepp1j, ips_e,ipe_e, ijs_e,ije_e) - CALL allocate_array( ynepm1j, ips_e,ipe_e, ijs_e,ije_e) - CALL allocate_array( ynepp1jm1, ips_e,ipe_e, ijs_e,ije_e) - CALL allocate_array( ynepm1jm1, ips_e,ipe_e, ijs_e,ije_e) - CALL allocate_array( zNepm1j, ips_e,ipe_e, ijs_e,ije_e) - CALL allocate_array( zNepm1jp1, ips_e,ipe_e, ijs_e,ije_e) - CALL allocate_array( zNepm1jm1, ips_e,ipe_e, ijs_e,ije_e) - ! ions + CALL allocate_array( TColl_i, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( Sipj, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize) CALL allocate_array( xnipj, ips_i,ipe_i, ijs_i,ije_i) CALL allocate_array( xnipp2j, ips_i,ipe_i) CALL allocate_array( xnipp1j, ips_i,ipe_i) @@ -84,7 +66,11 @@ SUBROUTINE memory CALL allocate_array( zNipm1j, ips_i,ipe_i, ijs_i,ije_i) CALL allocate_array( zNipm1jp1, ips_i,ipe_i, ijs_i,ije_i) CALL allocate_array( zNipm1jm1, ips_i,ipe_i, ijs_i,ije_i) - ! elect. pot. + + ! Non linear terms and dnjs table + CALL allocate_array( dnjs, 1,maxj+1, 1,maxj+1, 1,maxj+1) + + ! elect. pot. linear terms CALL allocate_array( xphij, ips_i,ipe_i, ijs_i,ije_i) CALL allocate_array( xphijp1, ips_i,ipe_i, ijs_i,ije_i) CALL allocate_array( xphijm1, ips_i,ipe_i, ijs_i,ije_i) @@ -110,19 +96,23 @@ SUBROUTINE memory !___________________ 2x5D ARRAYS __________________________ !! Collision matrices IF (CO .LT. -1) THEN !DK collision matrix (same for every k) + IF (KIN_E) THEN CALL allocate_array( Ceepj, 1,(pmaxe+1)*(jmaxe+1), 1,(pmaxe+1)*(jmaxe+1), 1,1, 1,1) CALL allocate_array( CeipjT, 1,(pmaxe+1)*(jmaxe+1), 1,(pmaxe+1)*(jmaxe+1), 1,1, 1,1) CALL allocate_array( CeipjF, 1,(pmaxe+1)*(jmaxe+1), 1,(pmaxi+1)*(jmaxi+1), 1,1, 1,1) - CALL allocate_array( Ciipj, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxi+1)*(jmaxi+1), 1,1, 1,1) CALL allocate_array( CiepjT, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxi+1)*(jmaxi+1), 1,1, 1,1) CALL allocate_array( CiepjF, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxe+1)*(jmaxe+1), 1,1, 1,1) + ENDIF + CALL allocate_array( Ciipj, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxi+1)*(jmaxi+1), 1,1, 1,1) ELSEIF (CO .GT. 1) THEN !GK collision matrices (one for each kperp) + IF (KIN_E) THEN CALL allocate_array( Ceepj, 1,(pmaxe+1)*(jmaxe+1), 1,(pmaxe+1)*(jmaxe+1), ikxs,ikxe, ikys,ikye) CALL allocate_array( CeipjT, 1,(pmaxe+1)*(jmaxe+1), 1,(pmaxe+1)*(jmaxe+1), ikxs,ikxe, ikys,ikye) CALL allocate_array( CeipjF, 1,(pmaxe+1)*(jmaxe+1), 1,(pmaxi+1)*(jmaxi+1), ikxs,ikxe, ikys,ikye) - CALL allocate_array( Ciipj, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxi+1)*(jmaxi+1), ikxs,ikxe, ikys,ikye) CALL allocate_array( CiepjT, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxi+1)*(jmaxi+1), ikxs,ikxe, ikys,ikye) CALL allocate_array( CiepjF, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxe+1)*(jmaxe+1), ikxs,ikxe, ikys,ikye) + ENDIF + CALL allocate_array( Ciipj, 1,(pmaxi+1)*(jmaxi+1), 1,(pmaxi+1)*(jmaxi+1), ikxs,ikxe, ikys,ikye) ENDIF END SUBROUTINE memory diff --git a/src/model_mod.F90 b/src/model_mod.F90 index 10bde0bbd344f6c0aec6e96aad3f33127118385b..dac8b664894f6833d129a574e4401b9f91389abd 100644 --- a/src/model_mod.F90 +++ b/src/model_mod.F90 @@ -10,6 +10,7 @@ MODULE model INTEGER, PUBLIC, PROTECTED :: NL_CLOS = 0 ! nonlinear truncation method INTEGER, PUBLIC, PROTECTED :: KERN = 0 ! Kernel model LOGICAL, PUBLIC, PROTECTED :: NON_LIN = .true. ! To turn on non linear bracket term + LOGICAL, PUBLIC, PROTECTED :: KIN_E = .true. ! Simulate kinetic electron (adiabatic otherwise) REAL(dp), PUBLIC, PROTECTED :: mu = 0._dp ! spatial Hyperdiffusivity coefficient (for num. stability) REAL(dp), PUBLIC, PROTECTED :: mu_p = 0._dp ! kinetic para hyperdiffusivity coefficient (for num. stability) REAL(dp), PUBLIC, PROTECTED :: mu_j = 0._dp ! kinetic perp hyperdiffusivity coefficient (for num. stability) @@ -38,7 +39,7 @@ MODULE model REAL(dp), PUBLIC, PROTECTED :: sigmae2_taue_o2 ! factor of the Kernel argument REAL(dp), PUBLIC, PROTECTED :: sigmai2_taui_o2 ! REAL(dp), PUBLIC, PROTECTED :: sqrt_sigmae2_taue_o2 ! factor of the Kernel argument - REAL(dp), PUBLIC, PROTECTED :: sqrt_sigmai2_taui_o2 + REAL(dp), PUBLIC, PROTECTED :: sqrt_sigmai2_taui_o2 REAL(dp), PUBLIC, PROTECTED :: nu_e, nu_i ! electron-ion, ion-ion collision frequency REAL(dp), PUBLIC, PROTECTED :: nu_ee, nu_ie ! e-e, i-e coll. frequ. REAL(dp), PUBLIC, PROTECTED :: qe2_taue, qi2_taui ! factor of the gammaD sum @@ -53,7 +54,7 @@ CONTAINS USE prec_const IMPLICIT NONE - NAMELIST /MODEL_PAR/ CO, CLOS, NL_CLOS, KERN, NON_LIN, mu, mu_p, mu_j, nu, tau_e, tau_i, sigma_e, sigma_i, & + NAMELIST /MODEL_PAR/ CO, CLOS, NL_CLOS, KERN, NON_LIN, KIN_E, mu, mu_p, mu_j, nu, tau_e, tau_i, sigma_e, sigma_i, & q_e, q_i, K_n, K_T, K_E, GradB, CurvB, lambdaD READ(lu_in,model_par) @@ -102,6 +103,7 @@ CONTAINS CALL attach(fidres, TRIM(str), "CLOS", CLOS) CALL attach(fidres, TRIM(str), "KERN", KERN) CALL attach(fidres, TRIM(str), "NON_LIN", NON_LIN) + CALL attach(fidres, TRIM(str), "KIN_E", KIN_E) CALL attach(fidres, TRIM(str), "nu", nu) CALL attach(fidres, TRIM(str), "mu", mu) CALL attach(fidres, TRIM(str), "tau_e", tau_e) @@ -110,9 +112,9 @@ CONTAINS CALL attach(fidres, TRIM(str), "sigma_i", sigma_i) CALL attach(fidres, TRIM(str), "q_e", q_e) CALL attach(fidres, TRIM(str), "q_i", q_i) - CALL attach(fidres, TRIM(str), "K_n", K_n) - CALL attach(fidres, TRIM(str), "K_T", K_T) - CALL attach(fidres, TRIM(str), "K_E", K_E) + CALL attach(fidres, TRIM(str), "K_n", K_n) + CALL attach(fidres, TRIM(str), "K_T", K_T) + CALL attach(fidres, TRIM(str), "K_E", K_E) CALL attach(fidres, TRIM(str), "lambdaD", lambdaD) END SUBROUTINE model_outputinputs diff --git a/src/moments_eq_rhs.F90 b/src/moments_eq_rhs.F90 index 1660a18484201e08ca799f119ba0456d3f7b17b8..34a424de5adbfc3776ac3d27693d5de0888c58c1 100644 --- a/src/moments_eq_rhs.F90 +++ b/src/moments_eq_rhs.F90 @@ -68,6 +68,8 @@ SUBROUTINE moments_eq_rhs_e ! term propto n_e^{p,j-1} Tnepjm1 = xnepjm1(ij) * nadiab_moments_e(ip,ij-1,ikx,iky,iz) ! Parallel dynamic + Tpare = 0._dp; Tmir = 0._dp + IF(Nz .GT. 1) THEN ! ddz derivative for Landau damping term Tpare = xnepp1j(ip) * & ( onetwelfth*nadiab_moments_e(ip+1,ij,ikx,iky,izm2)& @@ -90,7 +92,7 @@ SUBROUTINE moments_eq_rhs_e UNepm1jm1 = zNepm1jm1(ip,ij) * nadiab_moments_e(ip-1,ij-1,ikx,iky,iz) Tmir = Tnepp1j + Tnepp1jm1 + Tnepm1j + Tnepm1jm1 + UNepm1j + UNepm1jp1 + UNepm1jm1 - + ENDIF !! Electrical potential term IF ( p_int .LE. 2 ) THEN ! kronecker p0 p1 p2 Tphi = phi(ikx,iky,iz) * (xphij(ip,ij)*kernel_e(ij,ikx,iky,iz) & @@ -213,6 +215,8 @@ SUBROUTINE moments_eq_rhs_i ! term propto n_e^{p,j-1} Tnipjm1 = xnipjm1(ij) * nadiab_moments_i(ip,ij-1,ikx,iky,iz) ! Parallel dynamic + Tpari = 0._dp; Tmir = 0._dp + IF(Nz .GT. 1) THEN ! term propto N_i^{p,j+1}, centered FDF Tpari = xnipp1j(ip) * & ( onetwelfth*nadiab_moments_i(ip+1,ij,ikx,iky,izm2)& @@ -235,7 +239,7 @@ SUBROUTINE moments_eq_rhs_i Unipm1jm1 = znipm1jm1(ip,ij) * nadiab_moments_i(ip-1,ij-1,ikx,iky,iz) Tmir = Tnipp1j + Tnipp1jm1 + Tnipm1j + Tnipm1jm1 + UNipm1j + UNipm1jp1 + UNipm1jm1 - + ENDIF !! Electrical potential term IF ( p_int .LE. 2 ) THEN ! kronecker p0 p1 p2 Tphi = phi(ikx,iky,iz) * (xphij(ip,ij)*kernel_i(ij,ikx,iky,iz) & diff --git a/src/numerics_mod.F90 b/src/numerics_mod.F90 index edd297b22578b08c921d1cbd39c9f77efcd1b944..06235c2fae37f67ebcef16cc6af8f5708e6655f0 100644 --- a/src/numerics_mod.F90 +++ b/src/numerics_mod.F90 @@ -6,16 +6,11 @@ MODULE numerics USE coeff implicit none - PUBLIC :: compute_derivatives, build_dnjs_table, evaluate_kernels, compute_lin_coeff + PUBLIC :: build_dnjs_table, evaluate_kernels, evaluate_poisson_op, compute_lin_coeff PUBLIC :: wipe_turbulence, wipe_zonalflow CONTAINS -! Compute the 2D particle temperature for electron and ions (sum over Laguerre) -SUBROUTINE compute_derivatives - -END SUBROUTINE compute_derivatives - !******************************************************************************! !!!!!!! Build the Laguerre-Laguerre coupling coefficient table for nonlin !******************************************************************************! @@ -54,9 +49,10 @@ END SUBROUTINE build_dnjs_table !******************************************************************************! SUBROUTINE evaluate_kernels USE basic - USE array, Only : kernel_e, kernel_i, kparray + USE array, Only : kernel_e, kernel_i USE grid - USE model, ONLY : tau_e, tau_i, sigma_e, sigma_i, q_e, q_i, lambdaD, CLOS, sigmae2_taue_o2, sigmai2_taui_o2 + USE model, ONLY : tau_e, tau_i, sigma_e, sigma_i, q_e, q_i, & + lambdaD, CLOS, sigmae2_taue_o2, sigmai2_taui_o2, KIN_E IMPLICIT NONE INTEGER :: j_int REAL(dp) :: j_dp, y_, kp2_, kx_, ky_ @@ -65,12 +61,14 @@ DO ikx = ikxs,ikxe DO iky = ikys,ikye DO iz = izs,ize !!!!! Electron kernels !!!!! + IF(KIN_E) THEN DO ij = ijsg_e, ijeg_e j_int = jarray_e(ij) j_dp = REAL(j_int,dp) y_ = sigmae2_taue_o2 * kparray(ikx,iky,iz)**2 kernel_e(ij,ikx,iky,iz) = y_**j_int*EXP(-y_)/GAMMA(j_dp+1._dp)!factj ENDDO + ENDIF !!!!! Ion kernels !!!!! DO ij = ijsg_i, ijeg_i j_int = jarray_i(ij) @@ -85,10 +83,55 @@ ENDDO END SUBROUTINE evaluate_kernels !******************************************************************************! +!******************************************************************************! +!!!!!!! Evaluate polarisation operator for Poisson equation +!******************************************************************************! +SUBROUTINE evaluate_poisson_op + USE basic + USE array, Only : kernel_e, kernel_i, inv_poisson_op + USE grid + USE model, ONLY : tau_e, tau_i, q_e, q_i, KIN_E + IMPLICIT NONE + REAL(dp) :: pol_i, pol_e ! (Z_a^2/tau_a (1-sum_n kernel_na^2)) + INTEGER :: ini,ine + + kxloop: DO ikx = ikxs,ikxe + kyloop: DO iky = ikys,ikye + zloop: DO iz = izs,ize + IF( (kxarray(ikx).EQ.0._dp) .AND. (kyarray(iky).EQ.0._dp) ) THEN + inv_poisson_op(ikx, iky, iz) = 0._dp + ELSE + !!!!!!!!!!!!!!!!! Ion contribution + ! loop over n only if the max polynomial degree + pol_i = 0._dp + DO ini=1,jmaxi+1 + pol_i = pol_i + qi2_taui*kernel_i(ini,ikx,iky,iz)**2 ! ... sum recursively ... + END DO + !!!!!!!!!!!!! Electron contribution\ + pol_e = 0._dp + ! Kinetic model + IF (KIN_E) THEN + ! loop over n only if the max polynomial degree + DO ine=1,jmaxe+1 ! ine = n+1 + pol_e = pol_e + qe2_taue*kernel_e(ine,ikx,iky,iz)**2 ! ... sum recursively ... + END DO + ! Adiabatic model + ELSE + pol_e = 1._dp - qe2_taue + ENDIF + inv_poisson_op(ikx, iky, iz) = 1._dp/(qe2_taue + qi2_taui - pol_i - pol_e) + ENDIF + END DO zloop + END DO kyloop + END DO kxloop + +END SUBROUTINE evaluate_poisson_op +!******************************************************************************! + SUBROUTINE compute_lin_coeff USE array USE model, ONLY: taue_qe, taui_qi, sqrtTaue_qe, sqrtTaui_qi, & - K_T, K_n, CurvB, GradB + K_T, K_n, CurvB, GradB, KIN_E USE prec_const USE grid, ONLY: parray_e, parray_i, jarray_e, jarray_i, & ip,ij, ips_e,ipe_e, ips_i,ipe_i, ijs_e,ije_e, ijs_i,ije_i @@ -97,6 +140,7 @@ SUBROUTINE compute_lin_coeff REAL(dp) :: p_dp, j_dp REAL(dp) :: kx, ky, z !! Electrons linear coefficients for moment RHS !!!!!!!!!! + IF(KIN_E)THEN DO ip = ips_e, ipe_e p_int= parray_e(ip) ! Hermite degree p_dp = REAL(p_int,dp) ! REAL of Hermite degree @@ -133,6 +177,7 @@ SUBROUTINE compute_lin_coeff xnepjp1(ij) = -taue_qe * GradB * (j_dp + 1._dp) xnepjm1(ij) = -taue_qe * GradB * j_dp ENDDO + ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! Ions linear coefficients for moment RHS !!!!!!!!!! DO ip = ips_i, ipe_i diff --git a/src/poisson.F90 b/src/poisson.F90 index 486dc0cfda9f11ec3510a115615c0400a5da289d..8cc242ca37e3e6b4d6f0bc2bf650436554b0bb81 100644 --- a/src/poisson.F90 +++ b/src/poisson.F90 @@ -7,57 +7,61 @@ SUBROUTINE poisson USE fields USE grid USE utility - use model, ONLY : qe2_taue, qi2_taui, q_e, q_i, lambdaD - + use model, ONLY : qe2_taue, qi2_taui, q_e, q_i, lambdaD, KIN_E + USE processing, ONLY : compute_density USE prec_const + USE geometry, ONLY : iInt_Jacobian, Jacobian IMPLICIT NONE INTEGER :: ini,ine, i_, root_bcast - REAL(dp) :: Kne, Kni ! sub kernel factor for recursive build - REAL(dp) :: polarisation ! sum_a(Z_a^2/tau_a (1-sum_n kernel_na^2)) - COMPLEX(dp) :: q_density ! charge density sum_a q_a n_a - REAL(dp) :: gammaD - COMPLEX(dp) :: gammaD_phi + COMPLEX(dp) :: fa_phi, intf_ ! current flux averaged phi INTEGER :: count !! mpi integer to broadcast the electric potential at the end COMPLEX(dp) :: buffer(ikxs:ikxe,ikys:ikye) + COMPLEX(dp), DIMENSION(izs:ize) :: rho_i, rho_e ! charge density q_a n_a + COMPLEX(dp), DIMENSION(izs:ize) :: integrant ! charge density q_a n_a !! Poisson can be solved only for process containing ip=1 IF ( (ips_e .EQ. ip0_e) .AND. (ips_i .EQ. ip0_i) ) THEN - ! Execution time start CALL cpu_time(t0_poisson) kxloop: DO ikx = ikxs,ikxe kyloop: DO iky = ikys,ikye - zloop: DO iz = izs,ize + !!!! Compute ion gyro charge density + rho_i = 0._dp + DO ini=1,jmaxi+1 + rho_i = rho_i & + +q_i*kernel_i(ini,ikx,iky,:)*moments_i(ip0_i,ini,ikx,iky,:,updatetlevel) + END DO - q_density = 0._dp - polarisation = 0._dp - !!!!!!!!!!!!! Electron contribution - ! loop over n only if the max polynomial degree - DO ine=1,jmaxe+1 ! ine = n+1 - Kne = kernel_e(ine,ikx,iky,iz) - q_density = q_density + q_e*Kne*moments_e(ip0_e, ine, ikx, iky, iz, updatetlevel) - polarisation = polarisation + qe2_taue*Kne**2 ! ... sum recursively ... + !!!! Compute electron gyro charge density + rho_e = 0._dp + IF (KIN_E) THEN ! Kinetic electrons + DO ine=1,jmaxe+1 + rho_e = rho_e & + +q_e*kernel_e(ine,ikx,iky,:)*moments_e(ip0_e,ine, ikx,iky,:,updatetlevel) END DO + ELSE ! Adiabatic electrons + ! Adiabatic charge density (linked to flux averaged phi) + fa_phi = 0._dp + IF(kyarray(iky).EQ.0._dp) THEN + DO ini=1,jmaxi+1 + rho_e(:) = Jacobian(:)*moments_i(ip0_i,ini,ikx,iky,:,updatetlevel)& + *kernel_i(ini,ikx,iky,:)*(inv_poisson_op(ikx,iky,:)-1._dp) + call simpson_rule_z(rho_e,intf_) + fa_phi = fa_phi + intf_ + ENDDO + rho_e = fa_phi*iInt_Jacobian !Normalize by 1/int(Jxyz)dz + ENDIF + ENDIF - !!!!!!!!!!!!!!!!! Ions contribution - ! loop over n only if the max polynomial degree - DO ini=1,jmaxi+1 - Kni = kernel_i(ini,ikx,iky,iz) - q_density = q_density + q_i*Kni*moments_i(ip0_i, ini, ikx, iky, iz, updatetlevel) - polarisation = polarisation + qi2_taui*Kni**2 ! ... sum recursively ... - END DO - - !!!!!!!!!!!!!!! Assembling the poisson equation !!!!!!!!!!!!!!!!!!!!!!!!!! - phi(ikx, iky, iz) = q_density/(qe2_taue + qi2_taui - polarisation) - - END DO zloop + !!!!!!!!!!!!!!! Inverting the poisson equation !!!!!!!!!!!!!!!!!!!!!!!!!! + phi(ikx, iky, :) = (rho_e + rho_i)*inv_poisson_op(ikx,iky,:) END DO kyloop END DO kxloop ! Cancel origin singularity - IF (contains_kx0 .AND. contains_ky0) phi(ikx_0,iky_0,izs:ize) = 0._dp + IF (contains_kx0 .AND. contains_ky0) phi(ikx_0,iky_0,:) = 0._dp ENDIF diff --git a/src/processing_mod.F90 b/src/processing_mod.F90 index 768cc94315754a43bec2948f330672168099dcfe..2866a44d0fad2ba3d056b1c836f2e59fa223a0b6 100644 --- a/src/processing_mod.F90 +++ b/src/processing_mod.F90 @@ -71,7 +71,7 @@ SUBROUTINE compute_radial_heatflux USE fields, ONLY : moments_i, moments_e, phi USE array, ONLY : dens_e, dens_i, kernel_e, kernel_i USE time_integration, ONLY : updatetlevel - USE model, ONLY : q_e, q_i, tau_e, tau_i + USE model, ONLY : q_e, q_i, tau_e, tau_i, KIN_E IMPLICIT NONE COMPLEX(dp) :: hflux_local REAL(dp) :: ky_, buffer(1:2), j_dp @@ -91,6 +91,7 @@ SUBROUTINE compute_radial_heatflux * (moments_i(ip0_i,ij,ikx,iky,iz,updatetlevel)+q_i/tau_i*kernel_i(ij,ikx,iky,iz)*phi(ikx,iky,iz)) & + SQRT2/3._dp * kernel_i(ij,ikx,iky,iz) * moments_i(ip2_i,ij,ikx,iky,iz,updatetlevel)) ENDDO + IF(KIN_E) THEN DO ij = ijs_e, ije_e j_dp = REAL(ij-1,dp) hflux_local = hflux_local - imagu*ky_*CONJG(phi(ikx,iky,iz))& @@ -101,6 +102,7 @@ SUBROUTINE compute_radial_heatflux +q_e/tau_e * kernel_e( ij,ikx,iky,iz) * phi(ikx,iky,iz)) & +SQRT2/3._dp * kernel_e(ij,ikx,iky,iz) * moments_e(ip2_e,ij,ikx,iky,iz,updatetlevel)) ENDDO + ENDIF ENDDO ENDDO ENDDO @@ -134,10 +136,11 @@ SUBROUTINE compute_nadiab_moments USE fields, ONLY : moments_i, moments_e, phi USE array, ONLY : kernel_e, kernel_i, nadiab_moments_e, nadiab_moments_i USE time_integration, ONLY : updatetlevel - USE model, ONLY : qe_taue, qi_taui + USE model, ONLY : qe_taue, qi_taui, KIN_E implicit none ! Add non-adiabatique term + IF(KIN_E) THEN DO ip=ipsg_e,ipeg_e IF(parray_e(ip) .EQ. 0) THEN DO ij=ijsg_e,ijeg_e @@ -150,6 +153,7 @@ SUBROUTINE compute_nadiab_moments = moments_e(ip,ijsg_e:ijeg_e,ikxs:ikxe,ikys:ikye,izs:ize,updatetlevel) ENDIF ENDDO + ENDIF ! Add non-adiabatique term DO ip=ipsg_i,ipeg_i IF(parray_i(ip) .EQ. 0) THEN @@ -171,20 +175,22 @@ SUBROUTINE compute_density USE fields, ONLY : moments_i, moments_e, phi USE array, ONLY : dens_e, dens_i, kernel_e, kernel_i USE time_integration, ONLY : updatetlevel - USE model, ONLY : q_e, q_i, tau_e, tau_i + USE model, ONLY : q_e, q_i, tau_e, tau_i, KIN_E IMPLICIT NONE - IF( (ips_i .EQ. 1) .AND. (ips_e .EQ. 1) ) THEN + IF ( (ips_e .EQ. ip0_e) .AND. (ips_i .EQ. ip0_i) ) THEN ! Loop to compute dens_i = sum_j kernel_j Ni0j at each k DO iky = ikys,ikye DO ikx = ikxs,ikxe DO iz = izs,ize + IF(KIN_E) THEN ! electron density dens_e(ikx,iky,iz) = 0._dp DO ij = ijs_e, ije_e dens_e(ikx,iky,iz) = dens_e(ikx,iky,iz) + kernel_e(ij,ikx,iky,iz) * & (moments_e(ip0_e,ij,ikx,iky,iz,updatetlevel)+q_e/tau_e*kernel_e(ij,ikx,iky,iz)*phi(ikx,iky,iz)) ENDDO + ENDIF ! ion density dens_i(ikx,iky,iz) = 0._dp DO ij = ijs_i, ije_i @@ -195,6 +201,7 @@ SUBROUTINE compute_density ENDDO ENDDO ENDIF + IF(KIN_E)& CALL manual_3D_bcast(dens_e(ikxs:ikxe,ikys:ikye,izs:ize)) CALL manual_3D_bcast(dens_i(ikxs:ikxe,ikys:ikye,izs:ize)) END SUBROUTINE compute_density @@ -204,7 +211,7 @@ SUBROUTINE compute_temperature USE fields, ONLY : moments_i, moments_e, phi USE array, ONLY : temp_e, temp_i, kernel_e, kernel_i USE time_integration, ONLY : updatetlevel - USE model, ONLY : q_e, q_i, tau_e, tau_i + USE model, ONLY : q_e, q_i, tau_e, tau_i, KIN_E IMPLICIT NONE REAL(dp) :: j_dp COMPLEX(dp) :: Tperp, Tpar @@ -215,6 +222,7 @@ SUBROUTINE compute_temperature DO ikx = ikxs,ikxe DO iz = izs,ize ! electron temperature + IF(KIN_E) THEN temp_e(ikx,iky,iz) = 0._dp DO ij = ijs_e, ije_e j_dp = REAL(ij-1,dp) @@ -223,7 +231,7 @@ SUBROUTINE compute_temperature * (moments_e(ip0_e,ij,ikx,iky,iz,updatetlevel)+q_e/tau_e*kernel_e(ij,ikx,iky,iz)*phi(ikx,iky,iz)) & + SQRT2/3._dp * kernel_e(ij,ikx,iky,iz) * moments_e(ip2_e,ij,ikx,iky,iz,updatetlevel) ENDDO - + ENDIF ! ion temperature temp_i(ikx,iky,iz) = 0._dp DO ij = ijs_i, ije_i @@ -237,6 +245,7 @@ SUBROUTINE compute_temperature ENDDO ENDDO ENDIF + IF(KIN_E)& CALL manual_3D_bcast(temp_e(ikxs:ikxe,ikys:ikye,izs:ize)) CALL manual_3D_bcast(temp_i(ikxs:ikxe,ikys:ikye,izs:ize)) END SUBROUTINE compute_temperature diff --git a/src/srcinfo.h b/src/srcinfo.h index be0f13ec768c2ec4de3124f8bd979d5d0d90988b..85bcb0f4f0277904b7ad93de01a72c066912e435 100644 --- a/src/srcinfo.h +++ b/src/srcinfo.h @@ -3,8 +3,8 @@ character(len=40) BRANCH character(len=20) AUTHOR character(len=40) EXECDATE character(len=40) HOST -parameter (VERSION='59f9a2d-dirty') +parameter (VERSION='d29af00-dirty') parameter (BRANCH='master') parameter (AUTHOR='ahoffman') -parameter (EXECDATE='Wed Oct 27 15:24:35 CEST 2021') +parameter (EXECDATE='Fri Oct 29 18:03:02 CEST 2021') parameter (HOST ='spcpc606') diff --git a/src/srcinfo/srcinfo.h b/src/srcinfo/srcinfo.h index be0f13ec768c2ec4de3124f8bd979d5d0d90988b..85bcb0f4f0277904b7ad93de01a72c066912e435 100644 --- a/src/srcinfo/srcinfo.h +++ b/src/srcinfo/srcinfo.h @@ -3,8 +3,8 @@ character(len=40) BRANCH character(len=20) AUTHOR character(len=40) EXECDATE character(len=40) HOST -parameter (VERSION='59f9a2d-dirty') +parameter (VERSION='d29af00-dirty') parameter (BRANCH='master') parameter (AUTHOR='ahoffman') -parameter (EXECDATE='Wed Oct 27 15:24:35 CEST 2021') +parameter (EXECDATE='Fri Oct 29 18:03:02 CEST 2021') parameter (HOST ='spcpc606') diff --git a/src/stepon.F90 b/src/stepon.F90 index 26b3df805abeca601bc861086f29fd7cb3953ace..a5b65bb5efa875033fd36651faf561057e5cba21 100644 --- a/src/stepon.F90 +++ b/src/stepon.F90 @@ -9,7 +9,7 @@ SUBROUTINE stepon USE initial_par, ONLY: WIPE_ZF, WIPE_TURB USE ghosts USE grid - USE model + USE model, ONLY : NON_LIN, KIN_E use prec_const USE time_integration USE numerics, ONLY: wipe_zonalflow, wipe_turbulence @@ -25,7 +25,7 @@ SUBROUTINE stepon !----- BEFORE: All fields are updated for step = n ! Compute right hand side from current fields ! N_rhs(N_n, nadia_n, phi_n, S_n, Tcoll_n) - CALL moments_eq_rhs_e + IF(KIN_E) CALL moments_eq_rhs_e CALL moments_eq_rhs_i ! ---- step n -> n+1 transition ! Advance from updatetlevel to updatetlevel+1 (according to num. scheme) @@ -69,11 +69,13 @@ SUBROUTINE stepon mlend=.FALSE. IF(.NOT.nlend) THEN mlend=mlend .or. checkfield(phi,' phi') + IF(KIN_E) THEN DO ip=ips_e,ipe_e DO ij=ijs_e,ije_e mlend=mlend .or. checkfield(moments_e(ip,ij,:,:,:,updatetlevel),' moments_e') ENDDO ENDDO + ENDIF DO ip=ips_i,ipe_i DO ij=ijs_i,ije_i mlend=mlend .or. checkfield(moments_i(ip,ij,:,:,:,updatetlevel),' moments_i') @@ -88,6 +90,7 @@ SUBROUTINE stepon END SUBROUTINE checkfield_all SUBROUTINE anti_aliasing + IF(KIN_E)THEN DO ip=ips_e,ipe_e DO ij=ijs_e,ije_e DO ikx=ikxs,ikxe @@ -99,6 +102,7 @@ SUBROUTINE stepon END DO END DO END DO + ENDIF DO ip=ips_i,ipe_i DO ij=ijs_i,ije_i DO ikx=ikxs,ikxe @@ -115,6 +119,7 @@ SUBROUTINE stepon SUBROUTINE enforce_symmetry ! Force X(k) = X(N-k)* complex conjugate symmetry IF ( contains_kx0 ) THEN ! Electron moments + IF(KIN_E) THEN DO ip=ips_e,ipe_e DO ij=ijs_e,ije_e DO iz=izs,ize @@ -126,6 +131,7 @@ SUBROUTINE stepon END DO END DO END DO + ENDIF ! Ion moments DO ip=ips_i,ipe_i DO ij=ijs_i,ije_i diff --git a/src/utility_mod.F90 b/src/utility_mod.F90 index a295575e5464fdf0efdf415e2f9f08f84fd7dc0c..556ed5c21220a822da087c70aa4bed14d051f5f9 100644 --- a/src/utility_mod.F90 +++ b/src/utility_mod.F90 @@ -4,7 +4,8 @@ MODULE utility use prec_const IMPLICIT NONE - PUBLIC :: manual_2D_bcast, manual_3D_bcast + PUBLIC :: manual_2D_bcast, manual_3D_bcast,& + simpson_rule_z, o2e_z, e2o_z CONTAINS @@ -149,4 +150,74 @@ SUBROUTINE manual_3D_bcast(field_) ENDIF END SUBROUTINE manual_3D_bcast +SUBROUTINE simpson_rule_z(f,intf) + ! integrate f(z) over z using the simpon's rule. Assume periodic boundary conditions (f(ize+1) = f(izs)) + !from molix BJ Frei + use prec_const + use grid + ! + implicit none + ! + complex(dp),dimension(izs:ize), intent(in) :: f + COMPLEX(dp), intent(out) :: intf + ! + COMPLEX(dp) :: buff_ + ! + IF(Nz .GT. 1) THEN + IF(mod(Nz,2) .ne. 0 ) THEN + ERROR STOP 'Simpson rule: Nz must be an even number !!!!' + ENDIF + ! + buff_ = 0._dp + ! + DO iz = izs, Nz/2 + IF(iz .eq. Nz/2) THEN ! ... iz = ize + buff_ = buff_ + (f(izs) + 4._dp*f(ize) + f(ize-1 )) + ELSE + buff_ = buff_ + (f(2*iz+1) + 4._dp*f(2*iz) + f(2*iz-1 )) + ENDIF + ENDDO + ! + ! + intf = buff_*deltaz/3._dp + ! + ELSE + intf = f(izs) + ENDIF +END SUBROUTINE simpson_rule_z + +SUBROUTINE o2e_z(fo,fe) + ! gives the value of a field from the odd grid to the even one + use prec_const + use grid + ! + implicit none + ! + COMPLEX(dp),dimension(1:Nz), intent(in) :: fo + COMPLEX(dp),dimension(1:Nz), intent(out) :: fe ! + ! + DO iz = 2,Nz + fe(iz) = 0.5_dp*(fo(iz)+fo(iz-1)) + ENDDO + ! Periodic boundary conditions + fe(1) = 0.5_dp*(fo(1) + fo(Nz)) +END SUBROUTINE o2e_z + +SUBROUTINE e2o_z(fe,fo) + ! gives the value of a field from the even grid to the odd one + use prec_const + use grid + ! + implicit none + ! + COMPLEX(dp),dimension(1:Nz), intent(in) :: fe + COMPLEX(dp),dimension(1:Nz), intent(out) :: fo + ! + DO iz = 1,Nz-1 + fo(iz) = 0.5_dp*(fe(iz+1)+fe(iz)) + ENDDO + ! Periodic boundary conditions + fo(Nz) = 0.5_dp*(fe(1) + fe(Nz)) +END SUBROUTINE e2o_z + END MODULE utility diff --git a/wk/analysis_3D.m b/wk/analysis_3D.m index cf0111b17a3296d86ad545a3480f962f04ed9258..eff2e01673390d6acd0e33b22cbfbb27d21e645c 100644 --- a/wk/analysis_3D.m +++ b/wk/analysis_3D.m @@ -4,7 +4,10 @@ outfile =''; %% Directory of the simulation if 1% Local results outfile =''; -outfile ='simulation_A/1024x256_3x2_L_120_kN_1.6667_nu_1e-01_DGGK'; +outfile =''; +outfile ='fluxtube_salphaB_s0/50x100x20_5x3_L_300_q0_2.7_e_0.18_kN_2.22_kT_6_nu_1e-01_DGGK_lin'; +% outfile ='fluxtube_salphaB_s0/64x64x16_5x3_L_200_q0_2.7_e_0.18_kN_2.22_kT_6_nu_1e-01_DGGK'; +% outfile ='simulation_A/1024x256_3x2_L_120_kN_1.6667_nu_1e-01_DGGK'; % outfile ='Linear_Device/64x64x20_5x2_Lx_20_Ly_150_q0_25_kN_0.24_kT_0.03_nu_1e-02_DGGK'; BASIC.RESDIR = ['../results/',outfile,'/']; BASIC.MISCDIR = ['/misc/HeLaZ_outputs/results/',outfile,'/']; @@ -12,7 +15,7 @@ outfile ='simulation_A/1024x256_3x2_L_120_kN_1.6667_nu_1e-01_DGGK'; CMD = ['cp ', BASIC.RESDIR,'outputs* ',BASIC.MISCDIR]; disp(CMD); system(CMD); else% Marconi results -outfile ='/marconi_scratch/userexternal/ahoffman/HeLaZ/results/simulation_A/300x150_L_120_P_8_J_4_eta_0.6_nu_1e-01_PAGK_mu_0e+00/out.txt'; +outfile ='/marconi_scratch/userexternal/ahoffman/HeLaZ/results/simulation_A/300x300_L_120_P_8_J_4_eta_0.6_nu_1e-01_PAGK_mu_0e+00/out.txt'; % outfile ='/marconi_scratch/userexternal/ahoffman/HeLaZ/results/simulation_B/300x150_L_120_P_8_J_4_eta_0.6_nu_5e-01_SGGK_mu_0e+00/out.txt'; % outfile ='/marconi_scratch/userexternal/ahoffman/HeLaZ/results/simulation_A/500x500_L_120_P_4_J_2_eta_0.6_nu_1e-01_DGGK_mu_0e+00/out.txt'; BASIC.RESDIR = ['../',outfile(46:end-8),'/']; @@ -21,7 +24,7 @@ end %% Load the results % Load outputs from jobnummin up to jobnummax -JOBNUMMIN = 03; JOBNUMMAX = 03; +JOBNUMMIN = 00; JOBNUMMAX = 20; % JOBNUMMIN = 07; JOBNUMMAX = 20; % For CO damping sim A compile_results %Compile the results from first output found to JOBNUMMAX if existing @@ -33,42 +36,17 @@ default_plots_options disp('Plots') FMT = '.fig'; -if 0 -%% Time evolutions and growth rate -plot_time_evolution_and_gr -end - if 1 %% Space time diagramm (fig 11 Ivanov 2020) TAVG_0 = 1500; TAVG_1 = 4000; % Averaging times duration plot_radial_transport_and_shear end -if 0 -%% Space time diagramms -cmax = 0.00001 % max of the colorbar for transport -tstart = 0; tend = Ts3D(end); % time window -plot_space_time_diagrams -end - -if 0 -%% |phi_k|^2 spectra (Kobayashi 2015 fig 3) -% tstart = 0.8*Ts3D(end); tend = Ts3D(end); % Time window -tstart = 1000; tend = 4000; -% tstart = 10000; tend = 12000; -% Chose the field to plot -% FIELD = Ni00; FNAME = 'Ni00'; FIELDLTX = 'N_i^{00}'; -% FIELD = Ne00; FNAME = 'Ne00'; FIELDLTX = 'N_e^{00}' -FIELD = PHI; FNAME = 'PHI'; FIELDLTX = '\tilde\phi'; -% FIELD_ = fft2(Gamma_x); FIELD = FIELD_(1:76,:,:,:); FNAME = 'Gamma_x'; FIELDLTX = '\tilde\Gamma_x'; -LOGSCALE = 1; TRENDS = 1; NORMALIZED = 0; -plot_kperp_spectrum -end if 0 %% MOVIES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Options -t0 =000; iz = 1; ix = 1; iy = 1; +t0 =000; iz = 2; ix = 1; iy = 1; skip_ =1; FPS = 30; DELAY = 1/FPS; [~, it03D] = min(abs(Ts3D-t0)); FRAMES_3D = it03D:skip_:numel(Ts3D); [~, it05D] = min(abs(Ts5D-t0)); FRAMES_5D = it05D:skip_:numel(Ts5D); @@ -80,15 +58,15 @@ INTERP = 0; NORMALIZED = 1; CONST_CMAP = 0; BWR =1;% Gif options % FIELD = temp_i; NAME = 'Ti'; FIELDNAME = 'n_i'; % FIELD = temp_i-Z_T_i; NAME = 'Ti_NZ';FIELDNAME = 'T_i^{NZ}'; % FIELD = ne00; NAME = 'ne00'; FIELDNAME = 'n_e^{00}'; -FIELD = ni00; NAME = 'ni00'; FIELDNAME = 'n_i^{00}'; -% FIELD = phi; NAME = 'phi'; FIELDNAME = '\phi'; +% FIELD = ni00; NAME = 'ni00'; FIELDNAME = 'n_i^{00}'; +FIELD = phi; NAME = 'phi'; FIELDNAME = '\phi'; % FIELD = phi-Z_phi; NAME = 'NZphi'; FIELDNAME = '\phi_{NZ}'; % FIELD = Gamma_x; NAME = 'Gamma_x'; FIELDNAME = '\Gamma_x'; % Sliced -% plt = @(x) real(x(ix, :, :,:)); X = Y_YZ; Y = Z_YZ; XNAME = 'y'; YNAME = 'z'; +plt = @(x) real(x(ix, :, :,:)); X = Y_YZ; Y = Z_YZ; XNAME = 'y'; YNAME = 'z'; % plt = @(x) real(x( :,iy, :,:)); X = X_XZ; Y = Z_XZ; XNAME = 'x'; YNAME = 'z'; -plt = @(x) real(x( :, :,iz,:)); X = X_XY; Y = Y_XY; XNAME = 'x'; YNAME = 'y'; +% plt = @(x) real(x( :, :,iz,:)); X = X_XY; Y = Y_XY; XNAME = 'x'; YNAME = 'y'; % K-space % FIELD = PHI; NAME = 'PHI'; FIELDNAME = '\tilde \phi'; @@ -112,11 +90,11 @@ create_gif end if 0 -%% Photomaton : real space +%% 2D plot : real space % Chose the field to plot % FIELD = ni00; FNAME = 'ni00'; FIELDLTX = 'n_i^{00}'; -FIELD = ne00; FNAME = 'ne00'; FIELDLTX = 'n_e^{00}' +% FIELD = ne00; FNAME = 'ne00'; FIELDLTX = 'n_e^{00}' % FIELD = dens_i; FNAME = 'ni'; FIELDLTX = 'n_i'; % FIELD = dens_e; FNAME = 'ne'; FIELDLTX = 'n_e'; % FIELD = dens_e-Z_n_e; FNAME = 'ne_NZ'; FIELDLTX = 'n_e^{NZ}'; @@ -124,16 +102,17 @@ FIELD = ne00; FNAME = 'ne00'; FIELDLTX = 'n_e^{00}' % FIELD = temp_i; FNAME = 'Ti'; FIELDLTX = 'T_i'; % FIELD = temp_e; FNAME = 'Te'; FIELDLTX = 'T_e'; % FIELD = phi; FNAME = 'phi'; FIELDLTX = '\phi'; -% FIELD = Z_phi-phi; FNAME = 'phi_NZ'; FIELDLTX = '\phi^{NZ}'; +FIELD = Z_phi-phi; FNAME = 'phi_NZ'; FIELDLTX = '\phi^{NZ}'; % FIELD = Z_phi; FNAME = 'phi_Z'; FIELDLTX = '\phi^{Z}'; % FIELD = Gamma_x; FNAME = 'Gamma_x'; FIELDLTX = '\Gamma_x'; % FIELD = dens_e-Z_n_e-(Z_phi-phi); FNAME = 'Non_adiab_part'; FIELDLTX = 'n_e^{NZ}-\phi^{NZ}'; % Chose when to plot it -tf = 1500:500:3000; +tf = [0 15 27 28 30]; -% Sliced -ix = 1; iy = 1; iz = 1; +% Planar plot: choose a plane to plot at x0/y0/z0 coordinates +x0 = 0.0; y0 = 0.0; z0 = 0.0; +[~,ix] = min(abs(x-x0)); [~,iy] = min(abs(y-y0)); [~,iz] = min(abs(z-z0)); % plt = @(x,it) real(x(ix, :, :,it)); X = Y_YZ; Y = Z_YZ; XNAME = 'y'; YNAME = 'z'; FIELDLTX = [FIELDLTX,'(x=',num2str(round(x(ix))),')'] % plt = @(x,it) real(x( :,iy, :,it)); X = X_XZ; Y = Z_XZ; XNAME = 'x'; YNAME = 'z'; FIELDLTX = [FIELDLTX,'(y=',num2str(round(y(iy))),')'] plt = @(x,it) real(x( :, :,iz,it)); X = X_XY; Y = Y_XY; XNAME = 'x'; YNAME = 'y'; FIELDLTX = [FIELDLTX,'(z=',num2str(round(z(iz)/pi)),'\pi)'] @@ -162,35 +141,44 @@ save_figure end if 0 -%% Photomaton : k space +%% 2D plot : k space % Chose the field to plot % FIELD = Ni00; FNAME = 'Ni00'; FIELDLTX = 'N_i^{00}'; -FIELD = Ne00; FNAME = 'Ne00'; FIELDLTX = 'N_e^{00}' -% FIELD = PHI; FNAME = 'PHI'; FIELDLTX = '\tilde\phi'; +% FIELD = Ne00; FNAME = 'Ne00'; FIELDLTX = 'N_e^{00}' +FIELD = PHI; FNAME = 'PHI'; FIELDLTX = '\tilde\phi'; % FIELD_ = fft2(Gamma_x); FIELD = FIELD_(1:Nx/2+1,:,:,:); FNAME = 'Gamma_x'; FIELDLTX = '\tilde\Gamma_x'; % FIELD_ = fft2(dens_e); FIELD = FIELD_(1:Nx/2+1,:,:,:); FNAME = 'FFT_Dens_e'; FIELDLTX = '\tilde n_e'; % Chose when to plot it -tf = 1500:500:3000; +tf = [0 15 27 28 30]; % tf = 8000; -% Sliced -ix = 1; iy = 1; iz = 1; +% Planar plot: choose a plane to plot at x0/y0/z0 coordinates +x0 = 0.0; y0 = 0.3; z0 = 0.5*pi; +[~,ix] = min(abs(x-x0)); [~,iy] = min(abs(y-y0)); [~,iz] = min(abs(z-z0)); % plt = @(x,it) abs(x(ix, :, :,it)); X = KY_YZ; Y = KZ_YZ; XNAME = 'k_y'; YNAME = 'z'; FIELDLTX = [FIELDLTX,'(k_x=',num2str(round(kx(ix))),')']; % plt = @(x,it) abs(x( :,iy, :,it)); X = KX_XZ; Y = KZ_XZ; XNAME = 'k_x'; YNAME = 'z'; FIELDLTX = [FIELDLTX,'(k_y=',num2str(round(ky(iy))),')']; -plt = @(x,it) abs(x( :, :,iz,it)); X = KX_XY; Y = KY_XY; XNAME = 'k_x'; YNAME = 'k_y'; FIELDLTX = [FIELDLTX,'(z=',num2str((z(iz)/pi)),'\pi)']; +% plt = @(x,it) abs(x( :, :,iz,it)); X = KX_XY; Y = KY_XY; XNAME = 'k_x'; YNAME = 'k_y'; FIELDLTX = [FIELDLTX,'(z=',num2str((z(iz)/pi)),'\pi)']; +% % +% plt_x = @(x) fftshift(x,1); plt_y = @(x) fftshift(x,1); plt_z = @(x) fftshift(x,1); plt = @(x,it) max(abs(x( :, :,:,it)),[],1); +% X = KY_YZ; Y = KZ_YZ; XNAME = 'k_y'; YNAME = 'z'; FIELDLTX = [FIELDLTX,'(\max_x)']; +% +% plt_x = @(x) fftshift(x,2); plt_y = @(x) fftshift(x,1); plt_z = @(x) fftshift(x,2); plt = @(x,it) max(abs(x( :, :,:,it)),[],2); +% X = KX_XZ; Y = KZ_XZ; XNAME = 'k_x'; YNAME = 'z'; FIELDLTX = [FIELDLTX,'(\max_y)']; + +plt_x = @(x) fftshift(x,2); plt_y = @(x) fftshift(x,2); plt_z = @(x) fftshift(x,2); plt = @(x,it) max(abs(x( :, :,:,it)),[],3); +X = KX_XY; Y = KY_XY; XNAME = 'k_x'; YNAME = 'k_y'; FIELDLTX = [FIELDLTX,'(\max_z)']; % TNAME = []; fig = figure; FIGNAME = [FNAME,TNAME,'_snaps','_',PARAMS]; set(gcf, 'Position', [100, 100, 300*numel(tf), 500]) -plt_2 = @(x) (fftshift(x,2)); for i_ = 1:numel(tf) [~,it] = min(abs(Ts3D-tf(i_))); TNAME = [TNAME,'_',num2str(Ts3D(it))]; subplot(1,numel(tf),i_) DATA = plt_2(squeeze(plt(FIELD,it))); - pclr = pcolor(fftshift(X,2),fftshift(Y,2),DATA); set(pclr, 'edgecolor','none');pbaspect([0.5 1 1]) - caxis([0 1]*5e3); + pclr = pcolor(plt_x(X),plt_y(Y),plt_z(DATA)); set(pclr, 'edgecolor','none');pbaspect([0.5 1 1]) +% caxis([0 1]*5e3); % caxis([-1 1]*5); xlabel(latexize(XNAME)); ylabel(latexize(YNAME)); if(i_ > 1); set(gca,'ytick',[]); end; @@ -227,7 +215,7 @@ xlim([min(x), max(x)]); ylim(1.2*[-1 1]*ymax); xlabel('$x/\rho_s$'); ylabel('$s_{E\times B,x}$'); grid on end -if 1 +if 0 %% zonal vs nonzonal energies for phi(t) it0 = 01; itend = Ns3D; trange = it0:itend; @@ -310,4 +298,54 @@ plt_2 = @(x) (fftshift(x,2)); end title(['$',FIELDLTX,'$ Zonal Spectrum']); legend('show'); save_figure +end + +if 0 +%% Time evolutions and growth rate +plot_time_evolution_and_gr +end + +if 0 +%% |phi_k|^2 spectra (Kobayashi 2015 fig 3) +% tstart = 0.8*Ts3D(end); tend = Ts3D(end); % Time window +tstart = 1000; tend = 4000; +% tstart = 10000; tend = 12000; +% Chose the field to plot +% FIELD = Ni00; FNAME = 'Ni00'; FIELDLTX = 'N_i^{00}'; +% FIELD = Ne00; FNAME = 'Ne00'; FIELDLTX = 'N_e^{00}' +FIELD = PHI; FNAME = 'PHI'; FIELDLTX = '\tilde\phi'; +% FIELD_ = fft2(Gamma_x); FIELD = FIELD_(1:76,:,:,:); FNAME = 'Gamma_x'; FIELDLTX = '\tilde\Gamma_x'; +LOGSCALE = 1; TRENDS = 1; NORMALIZED = 0; +plot_kperp_spectrum +end + +if 0 +%% Torus plot +aminor = EPS; % Torus minor radius +Rmajor = 1.; % Torus major radius +theta = linspace(-pi, pi, 30) ; % Poloidal angle +phi = linspace(0., 2.*pi, 30) ; % Toroidal angle +[t, p] = meshgrid(phi, theta); +x = (Rmajor + aminor.*cos(p)) .* cos(t); +y = (Rmajor + aminor.*cos(p)) .* sin(t); +z = aminor.*sin(p); +figure; +torus=surf(x, y, z); hold on;alpha 1.0;%light('Position',[-1 1 1],'Style','local') +set(torus,'edgecolor',[1 1 1]*0.8,'facecolor','none') +xlabel('X');ylabel('Y');zlabel('Z'); +% field line plot +Nturns = 1; +theta = linspace(-Nturns*pi, Nturns*pi, 512) ; % Poloidal angle +xFL = (Rmajor + aminor.*cos(theta)) .* cos(theta*Q0); +yFL = (Rmajor + aminor.*cos(theta)) .* sin(theta*Q0); +zFL = aminor.*sin(theta); +plot3(xFL,yFL,zFL,'r') +% Planes plot +theta = linspace(-pi, pi, Nz) ; % Poloidal angle +xFL = (Rmajor + aminor.*cos(theta)) .* cos(theta*Q0); +yFL = (Rmajor + aminor.*cos(theta)) .* sin(theta*Q0); +zFL = aminor.*sin(theta); +plot3(xFL,yFL,zFL,'sb') +axis equal + end \ No newline at end of file diff --git a/wk/linear_1D_entropy_mode.m b/wk/linear_1D_entropy_mode.m index e1cd8d836911bdd83e512743e6e74bc04a3c0d08..95365b4d7f0b5d162b03eeef37cd6a8802cd5d5f 100644 --- a/wk/linear_1D_entropy_mode.m +++ b/wk/linear_1D_entropy_mode.m @@ -13,14 +13,14 @@ K_T = 0.0; % Temperature ''' K_E = 0.0; % Electrostat ''' SIGMA_E = 0.0233380; % mass ratio sqrt(m_a/m_i) (correct = 0.0233380) %% GRID PARAMETERS -Nx = 100; % real space x-gridpoints -Ny = 1; % '' y-gridpoints -Lx = 150; % Size of the squared frequency domain -Ly = 1; % Size of the squared frequency domain -Nz = 1; % number of perpendicular planes (parallel grid) -q0 = 1.0; % safety factor -shear = 0.0; % magnetic shear -eps = 0.0; % inverse aspect ratio +NX = 100; % real space x-gridpoints +NY = 1; % '' y-gridpoints +LX = 150; % Size of the squared frequency domain +LY = 1; % Size of the squared frequency domain +NZ = 1; % number of perpendicular planes (parallel grid) +Q0 = 1.0; % safety factor +SHEAR = 0.0; % magnetic shear +EPS = 0.0; % inverse aspect ratio %% TIME PARMETERS TMAX = 100; % Maximal time unit DT = 1e-2; % Time step @@ -31,8 +31,9 @@ SPS5D = 1; % Sampling per time unit for 5D arrays SPSCP = 0; % Sampling per time unit for checkpoints JOB2LOAD= -1; %% OPTIONS -SIMID = 'test_4.1'; % Name of the simulation +SIMID = 'Linear_entropy_mode'; % Name of the simulation NON_LIN = 0; % activate non-linearity (is cancelled if KXEQ0 = 1) +KIN_E = 1; % Collision operator % (0:L.Bernstein, 1:Dougherty, 2:Sugama, 3:Pitch angle, 4:Full Couloumb ; +/- for GK/DK) CO = 2; @@ -51,7 +52,7 @@ W_NAPJ = 1; W_SAPJ = 0; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % unused HD_CO = 0.5; % Hyper diffusivity cutoff ratio -kmax = Nx*pi/Lx;% Highest fourier mode +kmax = NX*pi/LX;% Highest fourier mode NU_HYP = 0.0; % Hyperdiffusivity coefficient MU = NU_HYP/(HD_CO*kmax)^4; % Hyperdiffusivity coefficient INIT_BLOB = 0; WIPE_TURB = 0; WIPE_ZF = 0; @@ -76,9 +77,9 @@ mup_ = MU_P; muj_ = MU_J; Nparam = numel(PA); param_name = 'PJ'; -gamma_Ni00 = zeros(Nparam,floor(Nx/2)+1); -gamma_Nipj = zeros(Nparam,floor(Nx/2)+1); -gamma_phi = zeros(Nparam,floor(Nx/2)+1); +gamma_Ni00 = zeros(Nparam,floor(NX/2)+1); +gamma_Nipj = zeros(Nparam,floor(NX/2)+1); +gamma_phi = zeros(Nparam,floor(NX/2)+1); for i = 1:Nparam % Change scan parameter PMAXE = PA(i); PMAXI = PA(i); @@ -96,7 +97,7 @@ for i = 1:Nparam %% filename = ['../results/',SIMID,'/',PARAMS,'/outputs_00.h5']; load_results - for ikx = 1:Nx/2+1 + for ikx = 1:NX/2+1 tend = max(Ts3D(abs(Ni00(ikx,1,1,:))~=0)); tstart = 0.6*tend; [~,itstart] = min(abs(Ts3D-tstart)); @@ -138,10 +139,9 @@ plt = @(x) x; end grid on; xlabel('$k_y\rho_s^{R}$'); ylabel('$\gamma(\phi)L_\perp/c_s$'); xlim([0.0,max(kx)]); title(['$\kappa_N=',num2str(K_N),'$, $\nu_{',CONAME,'}=',num2str(NU),'$']) -% title(['$\nabla N = 0$', ', $\nu=',num2str(NU),'$']) legend('show'); %xlim([0.01,10]) -saveas(fig,[SIMDIR,'gamma_Ni_vs_',param_name,'_',PARAMS,'.fig']); -saveas(fig,[SIMDIR,'gamma_Ni_vs_',param_name,'_',PARAMS,'.png']); +saveas(fig,[SIMDIR,'/',PARAMS,'/gamma_vs_',param_name,'_',PARAMS,'.fig']); +saveas(fig,[SIMDIR,'/',PARAMS,'/gamma_vs_',param_name,'_',PARAMS,'.png']); end end if 0 diff --git a/wk/local_run.m b/wk/local_run.m index 0120ca24cf0adabcc1671a10acc075916c2d65bf..0ed013d84270b3b9311354d6fc521ad08bddf5d8 100644 --- a/wk/local_run.m +++ b/wk/local_run.m @@ -5,30 +5,32 @@ CLUSTER.TIME = '99:00:00'; % allocation time hh:mm:ss %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% PHYSICAL PARAMETERS NU = 0.1; % Collision frequency -K_N = 1/0.6; % Density gradient drive (R/Ln) -K_T = 0.00; % Temperature gradient -K_E = 0.00; % Electrostat gradient +K_N = 2.22; % Density gradient drive +K_T = 6.0; % Temperature ''' +K_E = 0.00; % Electrostat gradient +SIGMA_E = 0.05196; % mass ratio sqrt(m_a/m_i) (correct = 0.0233380) NU_HYP = 0.0; +KIN_E = 1; % Kinetic (1) or adiabatic (2) electron model %% GRID PARAMETERS -Nx = 1024; % Spatial radial resolution ( = 2x radial modes) -Lx = 120; % Radial window size -Ny = 256; % Spatial azimuthal resolution (= azim modes) -Ly = 120; % Azimuthal window size -Nz = 1; % number of perpendicular planes (parallel grid) -q0 = 1.0; % safety factor (Lz = 2*pi*q0) -P = 2; -J = 1; +NX = 50; % Spatial radial resolution ( = 2x radial modes) +LX = 300; % Radial window size +NY = 100; % Spatial azimuthal resolution (= azim modes) +LY = 300; % Azimuthal window size +NZ = 20; % number of perpendicular planes (parallel grid) +P = 4; +J = 2; %% GEOMETRY PARAMETERS -shear = 0.0; % magnetic shear -eps = 0.0; % inverse aspect ratio (controls parallel magnetic gradient) -gradB = 0.0; % Magnetic gradient -curvB = 0.0; % Magnetic curvature +Q0 = 2.7; % safety factor +SHEAR = 0.0; % magnetic shear +EPS = 0.18; % inverse aspect ratio +GRADB = 1.0; % Magnetic gradient +CURVB = 1.0; % Magnetic curvature %% TIME PARAMETERS -TMAX = 90; % Maximal time unit -DT = 2e-2; % Time step +TMAX = 10; % Maximal time unit +DT = 5e-3; % Time step SPS0D = 1; % Sampling per time unit for profiler SPS2D = 1; % Sampling per time unit for 2D arrays -SPS3D = 1/2; % Sampling per time unit for 3D arrays +SPS3D = 5; % Sampling per time unit for 3D arrays SPS5D = 1/200; % Sampling per time unit for 5D arrays SPSCP = 0; % Sampling per time unit for checkpoints/10 JOB2LOAD= -1; @@ -38,12 +40,13 @@ JOB2LOAD= -1; CO = 1; CLOS = 0; % Closure model (0: =0 truncation) NL_CLOS = 0; % nonlinear closure model (-2: nmax = jmax, -1: nmax = jmax-j, >=0 : nmax = NL_CLOS) -% SIMID = 'Linear_Device'; % Name of the simulation -SIMID = 'simulation_A'; % Name of the simulation +SIMID = 'fluxtube_salphaB_s0'; % Name of the simulation +% SIMID = 'simulation_A'; % Name of the simulation % SIMID = ['v3.0_P_',num2str(P),'_J_',num2str(J)]; % Name of the simulation -NON_LIN = 1; % activate non-linearity (is cancelled if KXEQ0 = 1) +NON_LIN = 0; % activate non-linearity (is cancelled if KXEQ0 = 1) % INIT options -INIT_ZF = 0; ZF_AMP = 0.0; +INIT_PHI= 1; % Start simulation with a noisy phi (0= noisy moments 00) +INIT_ZF = 0; ZF_AMP = 0.0; INIT_BLOB = 0; WIPE_TURB = 0; WIPE_ZF = 0; %% OUTPUTS W_DOUBLE = 1; @@ -62,13 +65,12 @@ KERN = 0; % Kernel model (0 : GK) KX0KH = 0; A0KH = 0; % Background phi mode to drive Ray-Tay inst. KPAR = 0.0; % Parellel wave vector component LAMBDAD = 0.0; -kmax = Nx*pi/L;% Highest fourier mode +kmax = NX*pi/LX;% Highest fourier mode HD_CO = 0.5; % Hyper diffusivity cutoff ratio MU = NU_HYP/(HD_CO*kmax)^4; % Hyperdiffusivity coefficient NOISE0 = 1.0e-5; BCKGD0 = 0.0; % Init background TAU = 1.0; % e/i temperature ratio -INIT_PHI= 1; % Start simulation with a noisy phi and moments MU_P = 0.0; % Hermite hyperdiffusivity -mu_p*(d/dvpar)^4 f MU_J = 0.0; % Laguerre hyperdiffusivity -mu_j*(d/dvperp)^4 f %% Setup and file management diff --git a/wk/plot_phi_ballooning.m b/wk/plot_phi_ballooning.m index 47bd05e8dd54710f288ef043796e77075d89e0d7..678cd3b9f891c3f53a5d9978a160ecc2ac3dc3db 100644 --- a/wk/plot_phi_ballooning.m +++ b/wk/plot_phi_ballooning.m @@ -4,14 +4,14 @@ phi_imag=(imag(PHI(:,:,:,it))); % Apply baollooning tranform for iky=2 dims = size(phi_real); - phib_real = zeros( dims(1)*Nz ,1); + phib_real = zeros( dims(1)*dims(3) ,1); phib_imag= phib_real; b_angle = phib_real; - midpoint = floor((dims(1)*Nz )/2)+1; + midpoint = floor((dims(1)*dims(3) )/2)+1; for ip =1: dims(1) - start_ = (ip -1)*Nz +1; - end_ = ip*Nz; + start_ = (ip -1)*dims(3) +1; + end_ = ip*dims(3); phib_real(start_:end_) = phi_real(ip,iky,:); phib_imag(start_:end_) = phi_imag(ip,iky, :); end @@ -20,8 +20,8 @@ for iky=2 Nkx = numel(kx)-1; coordz = z; idx = -Nkx:1:Nkx; for ip =1: dims(1) - for iz=1:Nz - ii = Nz*(ip -1) + iz; + for iz=1:dims(3) + ii = dims(3)*(ip -1) + iz; b_angle(ii) =coordz(iz) + 2*pi*idx(ip); end end @@ -30,9 +30,9 @@ for iky=2 [~,idxLFS] = min(abs(b_angle -0)); phib = phib_real(:) + 1i * phib_imag(:); % Normalize to the outermid plane - phib_norm = phib(:);% / phib( idxLFS) ; - phib_real_norm(:) = real( phib_norm);%phib_real(:)/phib_real(idxLFS); - phib_imag_norm(:) = imag( phib_norm);%phib_imag(:)/ phib_imag(idxLFS); + phib_norm = phib;% / phib( idxLFS) ; + phib_real_norm = real( phib_norm);%phib_real(:)/phib_real(idxLFS); + phib_imag_norm = imag( phib_norm);%phib_imag(:)/ phib_imag(idxLFS); figure; hold all; @@ -43,26 +43,4 @@ for iky=2 xlabel('$\chi / \pi$') ylabel('$\phi_B (\chi)$'); title(['HeLaZ(-) molix(o) benchmark, t=',num2str(Ts3D(it))]); -% title(['HeLaZ,$(P,J) =(',num2str(PMAXI),', ', num2str(JMAXI),'$), $\nu =',num2str(NU),... -% '$, $\epsilon = ',num2str(eps),'$, $k_y = ', num2str(ky( iky)),'$, $q =',num2str(q0),'$, $s = ', num2str(shear),'$, $R_N = ', ... -% num2str(K_N),'$, $R_{T_i} = ', num2str(K_T),'$, $N_z =',num2str(Nz),'$']); - %set(gca,'Yscale','log') - % - -% %Check symmetry of the mode at the outter mid plane -% figure; hold all; -% right = phib_real(midpoint+1:end); -% left = fliplr(phib_real(1:midpoint-1)'); -% up_down_symm = right(1:end) - left(1:end-1)'; -% %plot(b_angle(midpoint+1:end)/pi,phib_real(midpoint+1:end),'-xb'); -% plot(b_angle(midpoint+1:end)/pi,up_down_symm ,'-xb'); - %plot(abs(b_angle(1:midpoint-1))/pi,phib_real(1:midpoint-1),'-xb'); - % - % - % figure; hold all - % plot(b_angle/pi, phib_imag.^2 + phib_real.^2 ,'xk'); - % %set(gca,'Yscale','log') - % xlabel('$\chi / \pi$') - % ylabel('$\phi_B (\chi)$'); - % title(['$(P,J) =(',num2str(pmax),', ', num2str(jmax),'$), $\nu =',num2str(nu),'$, $\epsilon = ',num2str(epsilon),'$, $q =',num2str(safety_fac),'$, $s = ', num2str(shear),'$, $k_y =',num2str(ky),'$']); end diff --git a/wk/shearless_linear_fluxtube.m b/wk/shearless_linear_fluxtube.m index 4fa96d088e66daa73d613648ac11afefab9f8931..8700441432f73a1f6e4f8678eaa887ffc7a7184f 100644 --- a/wk/shearless_linear_fluxtube.m +++ b/wk/shearless_linear_fluxtube.m @@ -11,15 +11,16 @@ TAU = 1.0; % e/i temperature ratio K_N = 2.22; % Density gradient drive K_T = 6.0; % Temperature ''' SIGMA_E = 0.05196; % mass ratio sqrt(m_a/m_i) (correct = 0.0233380) +KIN_E = 1; % Kinetic (1) or adiabatic (0) electron model %% GRID PARAMETERS -Nx = 1; % real space x-gridpoints -Ny = 2; % '' y-gridpoints -Lx = 0; % Size of the squared frequency domain -Ly = 2*pi/0.25; % Size of the squared frequency domain -Nz = 24; % number of perpendicular planes (parallel grid) -q0 = 2.7; % safety factor -shear = 0.0; % magnetic shear -eps = 0.18; % inverse aspect ratio +NX = 1; % real space x-gridpoints +NY = 2; % '' y-gridpoints +LX = 0; % Size of the squared frequency domain +LY = 2*pi/0.25; % Size of the squared frequency domain +NZ = 24; % number of perpendicular planes (parallel grid) +Q0 = 2.7; % safety factor +SHEAR = 0.0; % magnetic shear +EPS = 0.18; % inverse aspect ratio %% TIME PARMETERS TMAX = 10; % Maximal time unit DT = 1e-3; % Time step @@ -90,7 +91,7 @@ for i = 1:Nparam % system(['rm fort*.90']); % Run linear simulation if RUN - system(['cd ../results/',SIMID,'/',PARAMS,'/; ./../../../bin/helaz 0 > out.txt; cd ../../../wk']) + system(['cd ../results/',SIMID,'/',PARAMS,'/; ./../../../bin/helaz 0; cd ../../../wk']) end % Load and process results %%