diff --git a/src/cosolver_interface_mod.F90 b/src/cosolver_interface_mod.F90 index a96bceaf804cf47d47b88fceb92a29f952107251..888c722ef140c6ccd6f2cfd7eedb097ccf9a7ad3 100644 --- a/src/cosolver_interface_mod.F90 +++ b/src/cosolver_interface_mod.F90 @@ -13,9 +13,8 @@ CONTAINS USE parallel, ONLY: num_procs_p, comm_p,dsp_p,rcv_p USE grid, ONLY: & local_na, & - local_np, total_np, parray, ngp,& - total_nj,jarray, ngj,& - local_nkx, local_nky, local_nz, ngz, bar + local_np, total_np, total_nj,& + local_nkx, local_nky, local_nz, bar USE array, ONLY: Capj USE MPI IMPLICIT NONE @@ -24,19 +23,13 @@ CONTAINS COMPLEX(dp), DIMENSION(local_np) :: TColl_distr COMPLEX(dp) :: Tmp_ INTEGER :: iz,ikx,iky,ij,ip,ia,ikx_C,iky_C,iz_C - INTEGER :: p_int,j_int, ierr - INTEGER :: ipi, iji, izi + INTEGER :: ierr z:DO iz = 1,local_nz - izi = iz+ngz/2 x:DO ikx = 1,local_nkx y:DO iky = 1,local_nky a:DO ia = 1,local_na j:DO ij = 1,total_nj - iji = ij+ngj/2 - j_int = jarray(iji) p:DO ip = 1,total_np - ipi = ip + ngp/2 - p_int = parray(ipi) !! Take GK or DK limit IF (GK_CO) THEN ! GK operator (k-dependant) ikx_C = ikx; iky_C = iky; iz_C = iz; @@ -75,8 +68,8 @@ CONTAINS SUBROUTINE apply_cosolver_mat(ia,ip,ij,iky,ikx,iz,ikx_C,iky_C,iz_C,local_sum) USE grid, ONLY: & local_na, & - local_np, parray, ngp,& - total_nj, jarray, dmax, ngj, bar, ngz + local_np, parray,parray_full, ngp,& + total_nj, jarray,jarray_full, dmax, ngj, bar, ngz USE array, ONLY: Caa, Cab_T, Cab_F, nadiab_moments USE model, ONLY: CLOS USE species, ONLY: nu_ab @@ -85,12 +78,10 @@ CONTAINS COMPLEX(dp), INTENT(OUT) :: local_sum INTEGER :: ib,iq,il INTEGER :: p_int,q_int,j_int,l_int - INTEGER :: ipi, iji, izi, iqi, ili + INTEGER :: izi, iqi, ili izi = iz+ngz/2 - iji = ij+ngj/2 - j_int = jarray(iji) - ipi = ip + ngp/2 - p_int = parray(ipi) + p_int = parray_full(ip) + j_int = jarray_full(ij) !! Apply the cosolver collision matrix local_sum = 0._dp ! Initialization q:DO iq = 1,local_np diff --git a/src/ghosts_mod.F90 b/src/ghosts_mod.F90 index ab4c2515bbecad9048a352939fdebecd507ef7a3..c9861d1c4788cb6eb756a3a8359282b501676a32 100644 --- a/src/ghosts_mod.F90 +++ b/src/ghosts_mod.F90 @@ -63,16 +63,16 @@ SUBROUTINE update_ghosts_p_mom USE grid, ONLY: local_na,local_np,local_nj,local_nky,local_nkx,local_nz,& ngp,ngj,ngz IMPLICIT NONE - COMPLEX(dp), DIMENSION(local_np+ngp) :: slice_z + COMPLEX(dp), DIMENSION(local_np+ngp) :: slice_p INTEGER :: ia,iz,ij,iy,ix - DO iz = 1,local_nz + DO iz = 1+ngz/2,local_nz+ngz/2 DO ix = 1,local_nkx DO iy = 1,local_nky - DO ij = 1,local_nj + DO ij = 1+ngj/2,local_nj+ngj/2 DO ia = 1,local_na - slice_z = moments(ia,:,ij,iy,ix,iz,updatetlevel) - CALL exchange_ghosts_1D(slice_z,nbr_L,nbr_R,local_np,ngp) - moments(ia,:,ij,iy,ix,iz,updatetlevel) = slice_z + slice_p = moments(ia,:,ij,iy,ix,iz,updatetlevel) + CALL exchange_ghosts_1D(slice_p,nbr_L,nbr_R,local_np,ngp) + moments(ia,:,ij,iy,ix,iz,updatetlevel) = slice_p ENDDO ENDDO ENDDO @@ -210,7 +210,7 @@ SUBROUTINE update_ghosts_z_3D(field) DO iky = 1,local_nky DO ikx = 1,local_nkx ikxBC_L = ikx_zBC_L(iky,ikx); - IF (ikxBC_L .GT. 0) THEN ! Exchanging the modes that have a periodic pair (a) + IF (ikxBC_L .NE. -99) THEN ! Exchanging the modes that have a periodic pair (a) DO ig = 1,ngz/2 field(iky,ikx,first-ig) = pb_phase_L(iky)*buff_xy_zBC(iky,ikxBC_L,-ig) ENDDO @@ -220,7 +220,7 @@ SUBROUTINE update_ghosts_z_3D(field) ENDDO ENDIF ikxBC_R = ikx_zBC_R(iky,ikx); - IF (ikxBC_R .GT. 0) THEN ! Exchanging the modes that have a periodic pair (a) + IF (ikxBC_R .NE. -99) THEN ! Exchanging the modes that have a periodic pair (a) ! last+1 gets first DO ig = 1,ngz/2 field(iky,ikx,last+ig) = pb_phase_R(iky)*buff_xy_zBC(iky,ikxBC_R,ig) diff --git a/src/moments_eq_rhs_mod.F90 b/src/moments_eq_rhs_mod.F90 index f24ed835477543ec4b48467f19d787a3bf4a46e9..74d1615b26e922471e225ce385481f095445d5fc 100644 --- a/src/moments_eq_rhs_mod.F90 +++ b/src/moments_eq_rhs_mod.F90 @@ -123,15 +123,15 @@ SUBROUTINE compute_moments_eq_rhs RHS = RHS - mu_p*diff_p_coeff*p_int**6*Napj IF (j_int .GT. 1) & RHS = RHS - mu_j*diff_j_coeff*j_int**6*Napj - ! CASE('dvpar4') - ! ! fourth order numerical diffusion in vpar - ! IF(p_int .GE. 4) & - ! ! Numerical parallel velocity hyperdiffusion "+ dvpar4 g_a" see Pueschel 2010 (eq 33) - ! ! (not used often so not parallelized) - ! RHS = RHS + mu_p*dv4_Hp_coeff(p_int)*moments(ia,ipi-4,iji,iky,ikx,izi,updatetlevel) - ! ! + dummy Laguerre diff - ! IF (j_int .GE. 2) & - ! RHS = RHS - mu_j*diff_j_coeff*j_int**6*Napj + CASE('dvpar4') + ! fourth order numerical diffusion in vpar + IF(p_int .GE. 4) & + ! Numerical parallel velocity hyperdiffusion "+ dvpar4 g_a" see Pueschel 2010 (eq 33) + ! (not used often so not parallelized) + RHS = RHS + mu_p*dv4_Hp_coeff(p_int)*moments(ia,ipi-4,iji,iky,ikx,izi,updatetlevel) + ! + dummy Laguerre diff + IF (j_int .GE. 2) & + RHS = RHS - mu_j*diff_j_coeff*j_int**6*Napj CASE DEFAULT END SELECT ELSE @@ -163,8 +163,6 @@ SUBROUTINE compute_moments_eq_rhs print*,'sumreal Capj ', SUM(REAL(Capj(1,:,:,:,:,:))) print*,'---' IF(updatetlevel .EQ. 4) stop - ! print*, xnapjp1(2,:) - ! print*, pp2 stop END SUBROUTINE compute_moments_eq_rhs diff --git a/src/numerics_mod.F90 b/src/numerics_mod.F90 index e8f3aac55d2e94731f4e5e5d10e83fdba5de7af1..e37be6cad785028aee2aebddf34240d4f1785b40 100644 --- a/src/numerics_mod.F90 +++ b/src/numerics_mod.F90 @@ -137,9 +137,9 @@ SUBROUTINE evaluate_poisson_op USE model, ONLY : ADIAB_E, tau_e USE prec_const, ONLY: dp IMPLICIT NONE - REAL(dp) :: pol_ion, pol_tot, operator, operator_ion ! (Z^2/tau (1-sum_n kernel_na^2)) + REAL(dp) :: pol_tot, operator, operator_ion ! (Z^2/tau (1-sum_n kernel_na^2)) INTEGER :: in,ikx,iky,iz,ia - REAL(dp) :: pol_i, pol_e, sumker, spol ! (Z_a^2/tau_a (1-sum_n kernel_na^2)) + REAL(dp) :: sumker ! (Z_a^2/tau_a (1-sum_n kernel_na^2)) ! This term has no staggered grid dependence. It is evalued for the ! even z grid since poisson uses p=0 moments and phi only. @@ -180,37 +180,37 @@ END SUBROUTINE evaluate_poisson_op SUBROUTINE evaluate_ampere_op USE prec_const, ONLY : dp USE array, ONLY : kernel, inv_ampere_op - USE grid, ONLY : local_na, local_nkx, local_nky, local_nz, ngz, & - jmax, kparray, kxarray, kyarray, SOLVE_AMPERE, iodd + USE grid, ONLY : local_na, local_nkx, local_nky, local_nz, ngz, total_nj, ngj,& + kparray, kxarray, kyarray, SOLVE_AMPERE, iodd USE model, ONLY : beta USE species, ONLY : q, sigma USE geometry, ONLY : hatB USE prec_const, ONLY: dp IMPLICIT NONE - REAL(dp) :: pol_tot, kperp2 ! (Z^2/tau (1-sum_n kernel_na^2)) + REAL(dp) :: sum_jpol, kperp2, operator ! (Z^2/tau (1-sum_n kernel_na^2)) INTEGER :: in,ikx,iky,iz,ia ! We do not solve Ampere if beta = 0 to spare waste of ressources IF(SOLVE_AMPERE) THEN - DO ikx = 1,local_nkx - DO iky = 1,local_nky - DO iz = 1,local_nz - kperp2 = kparray(iky,ikx,iz,1)**2 + x:DO ikx = 1,local_nkx + y:DO iky = 1,local_nky + z:DO iz = 1,local_nz + kperp2 = kparray(iky,ikx,iz+ngz/2,iodd)**2 IF( (kxarray(ikx).EQ.0._dp) .AND. (kyarray(iky).EQ.0._dp) ) THEN inv_ampere_op(iky, ikx, iz) = 0._dp ELSE - !!!!!!!!!!!!!!!!! Ion contribution - pol_tot = 0._dp - DO ia = 1,local_na + sum_jpol = 0._dp + a:DO ia = 1,local_na ! loop over n only up to the max polynomial degree - DO in=1,jmax+1 - pol_tot = pol_tot + q(ia)**2/(sigma(ia)**2)*kernel(ia,in,iky,ikx,iz,1)**2 ! ... sum recursively ... - END DO - END DO - inv_ampere_op(iky, ikx, iz) = 1._dp/(2._dp*kperp2*hatB(iz+ngz/2,iodd)**2 + beta*pol_tot) + j:DO in=1,total_nj + sum_jpol = sum_jpol + q(ia)**2/(sigma(ia)**2)*kernel(ia,in+ngj/2,iky,ikx,iz+ngz/2,iodd)**2 ! ... sum recursively ... + END DO j + END DO a + operator = 2._dp*kperp2*hatB(iz+ngz/2,iodd)**2 + beta*sum_jpol + inv_ampere_op(iky, ikx, iz) = 1._dp/operator ENDIF - END DO - END DO - END DO + END DO z + END DO y + END DO x ENDIF END SUBROUTINE evaluate_ampere_op !******************************************************************************! diff --git a/src/processing_mod.F90 b/src/processing_mod.F90 index 5cc934350aed6dbc2bee9adfb18b5c5e48e731e9..b38d9cd13ef5d4ed18e9e73e64c09c95c917c488 100644 --- a/src/processing_mod.F90 +++ b/src/processing_mod.F90 @@ -84,10 +84,9 @@ CONTAINS call simpson_rule_z(local_nz,deltaz,integrant,integral) ! Get process local gyrocenter flux with a factor two to account for the negative ky modes gflux_local = 2._dp*integral*iInt_Jacobian - ! - integrant = 0._dp ! reset auxiliary variable !!---------- Particle flux (gyrokinetic) ------------ + integrant = 0._dp ! reset auxiliary variable ! Electrostatic part IF(CONTAINSp0) THEN DO iz = 1,local_nz ! we take interior points only @@ -121,14 +120,9 @@ CONTAINS ENDDO ENDIF ! Integrate over z - ! print*, integrant call simpson_rule_z(local_nz,deltaz,integrant,integral) - ! print*, integral - ! stop ! Get process local particle flux with a factor two to account for the negative ky modes pflux_local = 2._dp*integral*iInt_Jacobian - print*,REAL(pflux_local,dp) - !!!!---------- Sum over all processes ---------- buffer(1) = REAL(gflux_local,dp) buffer(2) = REAL(pflux_local,dp) @@ -196,7 +190,7 @@ CONTAINS DO iky = 1,local_nky DO in = 1, local_nj ini = in + ngj/2 !interior index for ghosted arrays - n_dp = jarray(in) + n_dp = jarray(ini) integrant(iz) = integrant(iz) & +Jacobian(izi,iodd)*tau(ia)*sqrt_tau_o_sigma(ia)*imagu*kyarray(iky)*CONJG(psi(iky,ikx,izi))& *kernel(ia,ini,iky,ikx,izi,iodd)*(& diff --git a/src/solve_EM_fields.F90 b/src/solve_EM_fields.F90 index 8f2120a3b0f2518c3c489230e6142e74c20e22d1..db3b3dd453c5bd3fe6479d2a90a3c44833df16eb 100644 --- a/src/solve_EM_fields.F90 +++ b/src/solve_EM_fields.F90 @@ -107,25 +107,27 @@ CONTAINS use species, ONLY: sqrt_tau_o_sigma, q use model, ONLY: beta IMPLICIT NONE - COMPLEX(dp) :: iota ! current density - INTEGER :: in, ia, ikx, iky, iz + COMPLEX(dp) :: j_a ! current density + INTEGER :: in, ia, ikx, iky, iz, ini, izi ! Execution time start CALL cpu_time(t0_poisson) !! Ampere can be solved only with beta > 0 and for process containng p=1 moments IF ( SOLVE_AMPERE ) THEN z:DO iz = 1,local_nz - x:DO ikx = 1,local_nky - y:DO iky = 1,local_nkx - !!!!!!!!!!!!!!! compute current density contribution "iota = q_a u_a" for each species - iota = 0._dp + izi = iz+ngz/2 + x:DO ikx = 1,local_nkx + y:DO iky = 1,local_nky + !!!!!!!!!!!!!!! compute current density contribution "j_a = q_a u_a" for each species + j_a = 0._dp n:DO in=1,total_nj + ini = in+ngj/2 a:DO ia = 1,local_na - iota = iota & - +q(ia)*sqrt_tau_o_sigma(ia)*kernel(ia,in+ngj/2,iky,ikx,iz+ngz/2,iodd)*moments(ia,ip1,in,iky,ikx,iz+ngz/2,updatetlevel) + j_a = j_a & + +q(ia)*sqrt_tau_o_sigma(ia)*kernel(ia,ini,iky,ikx,izi,iodd)*moments(ia,ip1,ini,iky,ikx,izi,updatetlevel) ENDDO a ENDDO n !!!!!!!!!!!!!!! Inverting the Ampere equation - psi(iky,ikx,iz+ngz/2) = beta*inv_ampere_op(iky,ikx,iz)*iota + psi(iky,ikx,iz+ngz/2) = beta*inv_ampere_op(iky,ikx,iz)*j_a ENDDO y ENDDO x ENDDO z diff --git a/testcases/smallest_problem/fort.90 b/testcases/smallest_problem/fort.90 index 9437edb8162bb303f50c00acf4eb2ef4f8459119..f6a8807c823adec78718240e0ca647988b504acd 100644 --- a/testcases/smallest_problem/fort.90 +++ b/testcases/smallest_problem/fort.90 @@ -1,5 +1,5 @@ &BASIC - nrun = 1 + nrun = 99999999 dt = 0.01 tmax = 5 maxruntime = 356400 @@ -8,9 +8,9 @@ &GRID pmax = 4 jmax = 1 - Nx = 4 + Nx = 2 Lx = 200 - Ny = 2 + Ny = 4 Ly = 60 Nz = 6 SG = .f. @@ -31,11 +31,11 @@ shift_y= 0.0 / &OUTPUT_PAR - dtsave_0d = 0.01 + dtsave_0d = 0.5 dtsave_1d = -1 dtsave_2d = -1 - dtsave_3d = 0.01 - dtsave_5d = 0.01 + dtsave_3d = 1 + dtsave_5d = 5 write_doubleprecision = .f. write_gamma = .t. write_hf = .t. @@ -58,9 +58,9 @@ mu_z = 0.6 HYP_V = 'hypcoll' mu_p = 0.1 - mu_j = 0. + mu_j = 0.5 nu = 1.0 - beta = 0 + beta = 0.1 ADIAB_E = .f. tau_e = 1.0 / @@ -77,14 +77,14 @@ ! electrons name_ = 'electrons' tau_ = 1.0 - sigma_= 1!0.023338 - q_ = 1!-1.0 + sigma_= 0.023338 + q_ = -1.0 k_N_ = 1.0!2.22 k_T_ = 2.0!6.96 / &COLLISION_PAR - collision_model = 'SG' !DG/SG/PA/LD (dougherty, sugama, pitch angle, landau) + collision_model = 'DG' !DG/SG/PA/LD (dougherty, sugama, pitch angle, landau) GK_CO = .t. INTERSPECIES = .true. mat_file = 'gk_sugama_P_20_J_10_N_150_kpm_8.0.h5' diff --git a/testcases/smallest_problem/fort_00.90 b/testcases/smallest_problem/fort_00.90 index 1b515d515953d085d3ba50570066b8d215dccd06..d4f127f005d537334dcb0124ec23614f0fc78dba 100644 --- a/testcases/smallest_problem/fort_00.90 +++ b/testcases/smallest_problem/fort_00.90 @@ -1,5 +1,5 @@ &BASIC - nrun = 1 + nrun = 99999999 dt = 0.01 tmax = 5 maxruntime = 356400 @@ -9,9 +9,9 @@ jmaxe = 1 pmaxi = 4 jmaxi = 1 - Nx = 4 + Nx = 2 Lx = 200 - Ny = 2 + Ny = 4 Ly = 60 Nz = 6 SG = .f. @@ -24,11 +24,11 @@ parallel_bc = 'dirichlet' / &OUTPUT_PAR - nsave_0d = 1 + nsave_0d = 50 nsave_1d = -1 nsave_2d = -1 - nsave_3d = 1 - nsave_5d = 1 + nsave_3d = 100 + nsave_5d = 500 write_doubleprecision = .f. write_gamma = .t. write_hf = .t. @@ -51,22 +51,22 @@ mu_z = 0.6 HYP_V = 'hypcoll' mu_p = 0.1 - mu_j = 0. + mu_j = 0.5 nu = 1.0 tau_e = 1 tau_i = 1 - sigma_e = 1!0.023338 + sigma_e = 0.023338 sigma_i = 1 - q_e = 1!-1 + q_e = -1 q_i = 1 K_Ne = 1!6.96 K_Te = 2!2.22 K_Ni = 3!6.96 K_Ti = 4!2.22 - beta = 0 + beta = 0.1 / &COLLISION_PAR - collision_model = 'SG' !DG/SG/PA/LD (dougherty, sugama, pitch angle, landau) + collision_model = 'DG' !DG/SG/PA/LD (dougherty, sugama, pitch angle, landau) gyrokin_CO = .t. interspecies = .true. mat_file = 'gk_sugama_P_20_J_10_N_150_kpm_8.0.h5'