diff --git a/src/grid_mod.F90 b/src/grid_mod.F90 index 0445ae1bee607b7306c2752f9cf0499495be1f3d..ed45fad1e2b78eec06e42b199050e7c32547daf4 100644 --- a/src/grid_mod.F90 +++ b/src/grid_mod.F90 @@ -280,7 +280,7 @@ CONTAINS SUBROUTINE set_kygrid USE prec_const - USE model, ONLY: LINEARITY + USE model, ONLY: LINEARITY, N_HD IMPLICIT NONE INTEGER :: i_, in, istart, iend Nky = Ny/2+1 ! Defined only on positive kx since fields are real @@ -293,7 +293,7 @@ CONTAINS deltaky = 2._dp*PI/Ly ky_max = Nky*deltaky ky_min = deltaky - diff_ky_coeff= (1._dp/ky_max)**4 + diff_ky_coeff= (1._dp/ky_max)**N_HD ENDIF ! Build the full grids on process 0 to diagnose it without comm ALLOCATE(kyarray_full(1:Nky)) @@ -345,7 +345,7 @@ CONTAINS SUBROUTINE set_kxgrid(shear) USE prec_const - USE model, ONLY: LINEARITY + USE model, ONLY: LINEARITY, N_HD IMPLICIT NONE REAL(dp), INTENT(IN) :: shear INTEGER :: i_, counter @@ -375,7 +375,7 @@ CONTAINS deltakx = 2._dp*PI/Lx kx_max = (Nkx/2)*deltakx kx_min = deltakx - diff_kx_coeff= (1._dp/kx_max)**4 + diff_kx_coeff= (1._dp/kx_max)**N_HD ! Creating a grid ordered as dk*(0 1 2 3 -2 -1) local_kxmax = 0._dp DO ikx = ikxs,ikxe diff --git a/src/model_mod.F90 b/src/model_mod.F90 index 2e1f4d9d055da973e9dd5476fb7bb10b3f5b4e8a..043c5b02da8ce832b9e45381678865884a8d453f 100644 --- a/src/model_mod.F90 +++ b/src/model_mod.F90 @@ -16,10 +16,11 @@ MODULE model REAL(dp), PUBLIC, PROTECTED :: mu_z = 0._dp ! spatial z-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) - REAL(dp), PUBLIC, PROTECTED :: nu = 1._dp ! Collision frequency + INTEGER, PUBLIC, PROTECTED :: N_HD = 4 ! order of numerical spatial diffusion + REAL(dp), PUBLIC, PROTECTED :: nu = 0._dp ! Collision frequency REAL(dp), PUBLIC, PROTECTED :: tau_e = 1._dp ! Temperature REAL(dp), PUBLIC, PROTECTED :: tau_i = 1._dp ! - REAL(dp), PUBLIC, PROTECTED :: sigma_e = 1._dp ! Mass + REAL(dp), PUBLIC, PROTECTED :: sigma_e = 0.023338_dp! sqrt of electron ion mass ratio REAL(dp), PUBLIC, PROTECTED :: sigma_i = 1._dp ! REAL(dp), PUBLIC, PROTECTED :: q_e = -1._dp ! Charge REAL(dp), PUBLIC, PROTECTED :: q_i = 1._dp ! @@ -57,7 +58,7 @@ CONTAINS IMPLICIT NONE NAMELIST /MODEL_PAR/ CLOS, NL_CLOS, KERN, LINEARITY, KIN_E, & - mu_x, mu_y, mu_z, mu_p, mu_j, nu,& + mu_x, mu_y, N_HD, mu_z, 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 @@ -109,9 +110,11 @@ CONTAINS CALL attach(fidres, TRIM(str), "KIN_E", KIN_E) CALL attach(fidres, TRIM(str), "nu", nu) CALL attach(fidres, TRIM(str), "mu", 0) - CALL attach(fidres, TRIM(str), "mu_x", mu_x) - CALL attach(fidres, TRIM(str), "mu_y", mu_y) - CALL attach(fidres, TRIM(str), "mu_z", mu_z) + CALL attach(fidres, TRIM(str), "mu_x", mu_x) + CALL attach(fidres, TRIM(str), "mu_y", mu_y) + CALL attach(fidres, TRIM(str), "mu_z", mu_z) + CALL attach(fidres, TRIM(str), "mu_p", mu_p) + CALL attach(fidres, TRIM(str), "mu_j", mu_j) CALL attach(fidres, TRIM(str), "tau_e", tau_e) CALL attach(fidres, TRIM(str), "tau_i", tau_i) CALL attach(fidres, TRIM(str), "sigma_e", sigma_e) diff --git a/src/moments_eq_rhs_mod.F90 b/src/moments_eq_rhs_mod.F90 index 3a493643875aa862251991ed6eed83655f2d8625..c30af83562b13fee14fa59c0fd7725bc7ebaa321 100644 --- a/src/moments_eq_rhs_mod.F90 +++ b/src/moments_eq_rhs_mod.F90 @@ -37,7 +37,7 @@ SUBROUTINE moments_eq_rhs_e COMPLEX(dp) :: Tnepp1j, Tnepm1j, Tnepp1jm1, Tnepm1jm1 ! Terms from mirror force with non adiab moments COMPLEX(dp) :: Tperp, Tpar, Tmir, Tphi COMPLEX(dp) :: Unepm1j, Unepm1jp1, Unepm1jm1 ! Terms from mirror force with adiab moments - COMPLEX(dp) :: i_ky,phikykxz + COMPLEX(dp) :: i_kx,i_ky,phikykxz ! Measuring execution time CALL cpu_time(t0_rhs) @@ -46,6 +46,7 @@ SUBROUTINE moments_eq_rhs_e zloope : DO iz = izs,ize kxloope : DO ikx = ikxs,ikxe kx = kxarray(ikx) ! radial wavevector + i_kx = imagu * kx ! toroidal derivative kyloope : DO iky = ikys,ikye ky = kyarray(iky) ! toroidal wavevector @@ -110,11 +111,10 @@ SUBROUTINE moments_eq_rhs_e ! Drives (density + temperature gradients) - i_ky * Tphi & ! Numerical perpendicular hyperdiffusion (totally artificial, for stability purpose) - - mu_x*diff_kx_coeff*kx**4*moments_e(ip,ij,iky,ikx,iz,updatetlevel) & - - mu_y*diff_ky_coeff*ky**4*moments_e(ip,ij,iky,ikx,iz,updatetlevel) & - ! - (mu_x*kx**2 + mu_y*ky**2)*moments_e(ip,ij,iky,ikx,iz,updatetlevel) & + - mu_x*diff_kx_coeff*kx**N_HD*moments_e(ip,ij,iky,ikx,iz,updatetlevel) & + - mu_y*diff_ky_coeff*ky**N_HD*moments_e(ip,ij,iky,ikx,iz,updatetlevel) & ! Numerical parallel hyperdiffusion "+ (mu_z*kz**4)" see Pueschel 2010 (eq 25) - + mu_z * diff_dz_coeff * ddz4_Nepj(ip,ij,iky,ikx,iz) & + - mu_z * diff_dz_coeff * ddz4_Nepj(ip,ij,iky,ikx,iz) & ! Collision term + TColl_e(ip,ij,iky,ikx,iz) & ! Nonlinear term @@ -166,7 +166,7 @@ SUBROUTINE moments_eq_rhs_i COMPLEX(dp) :: Tnipp1j, Tnipm1j, Tnipp1jm1, Tnipm1jm1 ! Terms from mirror force with non adiab moments COMPLEX(dp) :: Unipm1j, Unipm1jp1, Unipm1jm1 ! Terms from mirror force with adiab moments COMPLEX(dp) :: Tperp, Tpar, Tmir, Tphi - COMPLEX(dp) :: i_ky, phikykxz + COMPLEX(dp) :: i_kx, i_ky, phikykxz ! Measuring execution time CALL cpu_time(t0_rhs) @@ -176,7 +176,7 @@ SUBROUTINE moments_eq_rhs_i zloopi : DO iz = izs,ize kxloopi : DO ikx = ikxs,ikxe kx = kxarray(ikx) ! radial wavevector - + i_kx = imagu * kx ! toroidal derivative kyloopi : DO iky = ikys,ikye ky = kyarray(iky) ! toroidal wavevector i_ky = imagu * ky ! toroidal derivative @@ -242,8 +242,8 @@ SUBROUTINE moments_eq_rhs_i ! Drives (density + temperature gradients) - i_ky * Tphi & ! Numerical hyperdiffusion (totally artificial, for stability purpose) - - (mu_x*kx**4 + mu_y*ky**4)*moments_i(ip,ij,iky,ikx,iz,updatetlevel) & - ! - (mu_x*kx**2 + mu_y*ky**2)*moments_i(ip,ij,iky,ikx,iz,updatetlevel) & + + mu_x*diff_kx_coeff*i_kx**N_HD*moments_i(ip,ij,iky,ikx,iz,updatetlevel) & + + mu_y*diff_ky_coeff*i_ky**N_HD*moments_i(ip,ij,iky,ikx,iz,updatetlevel) & ! Numerical parallel hyperdiffusion "+ (mu_z*kz**4)" + mu_z * diff_dz_coeff * ddz4_Nipj(ip,ij,iky,ikx,iz) & ! Collision term