From e581e2d06aa83c1d67b9845f409a799adfc77049 Mon Sep 17 00:00:00 2001 From: Antoine Hoffmann <antoine.hoffmann@epfl.ch> Date: Thu, 26 Jan 2023 13:39:51 +0100 Subject: [PATCH] Major change of the module. The e-i routines have been merged in one with input parameters. --- src/moments_eq_rhs_mod.F90 | 430 ++++++++++++++----------------------- 1 file changed, 167 insertions(+), 263 deletions(-) diff --git a/src/moments_eq_rhs_mod.F90 b/src/moments_eq_rhs_mod.F90 index eaefef5d..4ab8c91d 100644 --- a/src/moments_eq_rhs_mod.F90 +++ b/src/moments_eq_rhs_mod.F90 @@ -4,313 +4,217 @@ MODULE moments_eq_rhs CONTAINS SUBROUTINE compute_moments_eq_rhs - USE model, only: KIN_E - IMPLICIT NONE - - IF(KIN_E) CALL moments_eq_rhs_e - CALL moments_eq_rhs_i - !! BETA TESTING !! - IF(.false.) CALL add_Maxwellian_background_terms -END SUBROUTINE compute_moments_eq_rhs -!_____________________________________________________________________________! -!_____________________________________________________________________________! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!! Electrons moments RHS !!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!_____________________________________________________________________________! -SUBROUTINE moments_eq_rhs_e - - USE basic - USE time_integration - USE array, ONLY: xnepj, xnepp2j, xnepm2j, xnepjp1, xnepjm1, xnepp1j, xnepm1j,& - ynepp1j, ynepp1jm1, ynepm1j, ynepm1jm1, & - znepm1j, znepm1jp1, znepm1jm1, & - xphij_e, xphijp1_e, xphijm1_e, xpsij_e, xpsijp1_e, xpsijm1_e,& - nadiab_moments_e, ddz_nepj, interp_nepj, moments_rhs_e, Sepj,& - TColl_e, ddzND_nepj, kernel_e - USE fields, ONLY: phi, psi, moments_e - USE grid USE model - USE prec_const - USE collision - USE geometry, ONLY: gradz_coeff, dBdz, Ckxky, hatB_NL, hatB - USE calculus, ONLY : interp_z, grad_z, grad_z2 - IMPLICIT NONE - - INTEGER :: p_int, j_int ! loops indices and polynom. degrees - REAL(dp) :: kx, ky, kperp2 - COMPLEX(dp) :: Tnepj, Tnepp2j, Tnepm2j, Tnepjp1, Tnepjm1 ! Terms from b x gradB and drives - COMPLEX(dp) :: Tnepp1j, Tnepm1j, Tnepp1jm1, Tnepm1jm1 ! Terms from mirror force with non adiab moments - COMPLEX(dp) :: Tperp, Tpar, Tmir, Tphi, Tpsi - COMPLEX(dp) :: Unepm1j, Unepm1jp1, Unepm1jm1 ! Terms from mirror force with adiab moments - COMPLEX(dp) :: i_kx,i_ky,phikykxz, psikykxz - - ! Measuring execution time - CALL cpu_time(t0_rhs) - - ! Spatial loops - 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 - i_ky = imagu * ky ! toroidal derivative - phikykxz = phi(iky,ikx,iz)! tmp phi value - psikykxz = psi(iky,ikx,iz)! tmp psi value - - ! Kinetic loops - jloope : DO ij = ijs_e, ije_e ! This loop is from 1 to jmaxi+1 - j_int = jarray_e(ij) - - ploope : DO ip = ips_e, ipe_e ! Hermite loop - p_int = parray_e(ip) ! Hermite degree - eo = MODULO(p_int,2) ! Indicates if we are on odd or even z grid - kperp2= kparray(iky,ikx,iz,eo)**2 - - IF((CLOS .NE. 1) .OR. (p_int+2*j_int .LE. dmaxe)) THEN - !! Compute moments mixing terms - Tperp = 0._dp; Tpar = 0._dp; Tmir = 0._dp - ! Perpendicular dynamic - ! term propto n_e^{p,j} - Tnepj = xnepj(ip,ij)* nadiab_moments_e(ip,ij,iky,ikx,iz) - ! term propto n_e^{p+2,j} - Tnepp2j = xnepp2j(ip) * nadiab_moments_e(ip+pp2,ij,iky,ikx,iz) - ! term propto n_e^{p-2,j} - Tnepm2j = xnepm2j(ip) * nadiab_moments_e(ip-pp2,ij,iky,ikx,iz) - ! term propto n_e^{p,j+1} - Tnepjp1 = xnepjp1(ij) * nadiab_moments_e(ip,ij+1,iky,ikx,iz) - ! term propto n_e^{p,j-1} - Tnepjm1 = xnepjm1(ij) * nadiab_moments_e(ip,ij-1,iky,ikx,iz) - ! Tperp - Tperp = Tnepj + Tnepp2j + Tnepm2j + Tnepjp1 + Tnepjm1 - ! Parallel dynamic - ! ddz derivative for Landau damping term - Tpar = xnepp1j(ip) * ddz_nepj(ip+1,ij,iky,ikx,iz) & - + xnepm1j(ip) * ddz_nepj(ip-1,ij,iky,ikx,iz) - ! Mirror terms - Tnepp1j = ynepp1j (ip,ij) * interp_nepj(ip+1,ij ,iky,ikx,iz) - Tnepp1jm1 = ynepp1jm1(ip,ij) * interp_nepj(ip+1,ij-1,iky,ikx,iz) - Tnepm1j = ynepm1j (ip,ij) * interp_nepj(ip-1,ij ,iky,ikx,iz) - Tnepm1jm1 = ynepm1jm1(ip,ij) * interp_nepj(ip-1,ij-1,iky,ikx,iz) - ! Trapping terms - Unepm1j = znepm1j (ip,ij) * interp_nepj(ip-1,ij ,iky,ikx,iz) - Unepm1jp1 = znepm1jp1(ip,ij) * interp_nepj(ip-1,ij+1,iky,ikx,iz) - Unepm1jm1 = znepm1jm1(ip,ij) * interp_nepj(ip-1,ij-1,iky,ikx,iz) - - Tmir = Tnepp1j + Tnepp1jm1 + Tnepm1j + Tnepm1jm1 + Unepm1j + Unepm1jp1 + Unepm1jm1 - !! Electrical potential term - IF ( p_int .LE. 2 ) THEN ! kronecker p0 p1 p2 - Tphi = (xphij_e (ip,ij)*kernel_e(ij ,iky,ikx,iz,eo) & - + xphijp1_e(ip,ij)*kernel_e(ij+1,iky,ikx,iz,eo) & - + xphijm1_e(ip,ij)*kernel_e(ij-1,iky,ikx,iz,eo))*phikykxz - ELSE - Tphi = 0._dp - ENDIF - - !! Vector potential term - IF ( (p_int .LE. 3) .AND. (p_int .GE. 1) ) THEN ! Kronecker p1 or p3 - Tpsi = (xpsij_e (ip,ij)*kernel_e(ij ,iky,ikx,iz,eo) & - + xpsijp1_e(ip,ij)*kernel_e(ij+1,iky,ikx,iz,eo) & - + xpsijm1_e(ip,ij)*kernel_e(ij-1,iky,ikx,iz,eo))*psikykxz - ELSE - Tpsi = 0._dp - ENDIF - - !! Sum of all RHS terms - moments_rhs_e(ip,ij,iky,ikx,iz,updatetlevel) = & - ! Perpendicular magnetic gradient/curvature effects - -imagu*Ckxky(iky,ikx,iz,eo) * Tperp& - ! Perpendicular pressure effects - -i_ky*beta*dpdx * Tperp& - ! Parallel coupling (Landau Damping) - -gradz_coeff(iz,eo) * Tpar & - ! Mirror term (parallel magnetic gradient) - -dBdz(iz,eo)*gradz_coeff(iz,eo) * Tmir& - ! Drives (density + temperature gradients) - -i_ky * (Tphi - Tpsi) & - ! Numerical perpendicular hyperdiffusion (totally artificial, for stability purpose) - -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*ddz**4" see Pueschel 2010 (eq 25) - -mu_z*diff_dz_coeff*ddzND_nepj(ip,ij,iky,ikx,iz) & - ! Collision term - +TColl_e(ip,ij,iky,ikx,iz) & - ! Nonlinear term - -hatB_NL(iz,eo) * Sepj(ip,ij,iky,ikx,iz) - - ! IF( (ip-4 .GT. 0) .AND. (num_procs_p .EQ. 1) ) & - ! ! Numerical parallel velocity hyperdiffusion "+ dvpar4 g_a" see Pueschel 2010 (eq 33) - ! ! (not used often so not parallelized) - ! moments_rhs_e(ip,ij,iky,ikx,iz,updatetlevel) = & - ! moments_rhs_e(ip,ij,iky,ikx,iz,updatetlevel) & - ! + mu_p * moments_e(ip-4,ij,iky,ikx,iz,updatetlevel) - - ELSE - moments_rhs_e(ip,ij,iky,ikx,iz,updatetlevel) = 0._dp - ENDIF - END DO ploope - END DO jloope - END DO kyloope - END DO kxloope - END DO zloope - - ! Execution time end - CALL cpu_time(t1_rhs) - tc_rhs = tc_rhs + (t1_rhs-t0_rhs) - -END SUBROUTINE moments_eq_rhs_e -!_____________________________________________________________________________! -!_____________________________________________________________________________! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!!!!!!!!! Ions moments RHS !!!!!!!!! -!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!_____________________________________________________________________________! -SUBROUTINE moments_eq_rhs_i - - USE basic - USE time_integration, ONLY: updatetlevel - USE array, ONLY: xnipj, xnipp2j, xnipm2j, xnipjp1, xnipjm1, xnipp1j, xnipm1j,& - ynipp1j, ynipp1jm1, ynipm1j, ynipm1jm1, & - znipm1j, znipm1jp1, znipm1jm1, & - xphij_i, xphijp1_i, xphijm1_i, xpsij_i, xpsijp1_i, xpsijm1_i,& - nadiab_moments_i, ddz_nipj, interp_nipj, moments_rhs_i, Sipj,& - TColl_i, ddzND_nipj, kernel_i - USE fields, ONLY: phi, psi, moments_i + USE array + USE fields USE grid - USE model + USE basic USE prec_const USE collision + USE time_integration USE geometry, ONLY: gradz_coeff, dBdz, Ckxky, hatB_NL, hatB USE calculus, ONLY : interp_z, grad_z, grad_z2 IMPLICIT NONE - INTEGER :: p_int, j_int ! loops indices and polynom. degrees - REAL(dp) :: kx, ky, kperp2 - COMPLEX(dp) :: Tnipj, Tnipp2j, Tnipm2j, Tnipjp1, Tnipjm1 - 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, Tpsi - COMPLEX(dp) :: i_kx, i_ky, phikykxz, psikykxz - - ! Measuring execution time - CALL cpu_time(t0_rhs) - - - ! Spatial loops - 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 + !compute ion moments_eq_rhs + CALL moments_eq_rhs(ips_i,ipe_i,ipgs_i,ipge_i,ijs_i,ije_i,ijgs_i,ijge_i,jarray_i,parray_i,& + xnipj, xnipp2j, xnipm2j, xnipjp1, xnipjm1, xnipp1j, xnipm1j,& + ynipp1j, ynipp1jm1, ynipm1j, ynipm1jm1, & + znipm1j, znipm1jp1, znipm1jm1, & + xphij_i, xphijp1_i, xphijm1_i, xpsij_i, xpsijp1_i, xpsijm1_i,& + kernel_i, nadiab_moments_i, ddz_nipj, interp_nipj, Sipj,& + moments_i(ipgs_i:ipge_i,ijgs_i:ijge_i,ikys:ikye,ikxs:ikxe,izgs:izge,updatetlevel),& + TColl_i, ddzND_nipj, & + moments_rhs_i(ipgs_i:ipge_i,ijgs_i:ijge_i,ikys:ikye,ikxs:ikxe,izgs:izge,updatetlevel)) + + !compute ion moments_eq_rhs + IF(KIN_E) & + CALL moments_eq_rhs(ips_e,ipe_e,ipgs_e,ipge_e,ijs_e,ije_e,ijgs_e,ijge_e,jarray_e,parray_e,& + xnepj, xnepp2j, xnepm2j, xnepjp1, xnepjm1, xnepp1j, xnepm1j,& + ynepp1j, ynepp1jm1, ynepm1j, ynepm1jm1, & + znepm1j, znepm1jp1, znepm1jm1, & + xphij_e, xphijp1_e, xphijm1_e, xpsij_e, xpsijp1_e, xpsijm1_e,& + kernel_e, nadiab_moments_e, ddz_nepj, interp_nepj, Sepj,& + moments_e(ipgs_e:ipge_e,ijgs_e:ijge_e,ikys:ikye,ikxs:ikxe,izgs:izge,updatetlevel),& + TColl_e, ddzND_nepj,& + moments_rhs_e(ipgs_e:ipge_e,ijgs_e:ijge_e,ikys:ikye,ikxs:ikxe,izgs:izge,updatetlevel)) + + CONTAINS + !_____________________________________________________________________________! + !_____________________________________________________________________________! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !!! moments_ RHS computation !!!!!!! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ! This routine assemble the RHS of the moment hierarchy equations. It uses + ! linear coefficients that are stored in arrays (xn*, yn* and zn*) computed in + ! numerics_mod.F90. Otherwise it simply adds the collision term TColl that is + ! computed in collision_mod.F90 and the nonlinear term Sapj computed in + ! nonlinear_mod.F90. + ! All arguments of the subroutines are inputs only except the last one, + ! moments_rhs_ that will contain the sum of every terms in the RHS. + !_____________________________________________________________________________! + SUBROUTINE moments_eq_rhs(ips,ipe,ipgs,ipge,ijs,ije,ijgs,ijge,jarray,parray,& + xnapj, xnapp2j, xnapm2j, xnapjp1, xnapjm1, xnapp1j, xnapm1j,& + ynapp1j, ynapp1jm1, ynapm1j, ynapm1jm1, & + znapm1j, znapm1jp1, znapm1jm1, & + xphij, xphijp1, xphijm1, xpsij, xpsijp1, xpsijm1,& + kernel, nadiab_moments, ddz_napj, interp_napj, Sapj,& + moments_, TColl_, ddzND_napj, moments_rhs_) + + IMPLICIT NONE + !! INPUTS + INTEGER, INTENT(IN) :: ips, ipe, ipgs, ipge, ijs, ije, ijgs, ijge + INTEGER, DIMENSION(ips:ipe), INTENT(IN) :: parray + INTEGER, DIMENSION(ijs:ije), INTENT(IN) :: jarray + REAL(dp), DIMENSION(ips:ipe,ijs:ije), INTENT(IN) :: xnapj,& + ynapp1j, ynapm1j, ynapp1jm1, ynapm1jm1,& + znapm1j, znapm1jp1, znapm1jm1,& + xphij, xphijp1, xphijm1,& + xpsij, xpsijp1, xpsijm1 + REAL(dp), DIMENSION(ips:ipe), INTENT(IN) :: & + xnapp1j, xnapm1j, xnapp2j, xnapm2j, xnapjp1, xnapjm1 + + REAL(dp), DIMENSION(ijgs:ijge,ikys:ikye,ikxs:ikxe,izgs:izge,0:1),INTENT(IN) :: kernel + + COMPLEX(dp), DIMENSION(ipgs:ipge,ijgs:ijge,ikys:ikye,ikxs:ikxe,izgs:izge),INTENT(IN) ::& + moments_,nadiab_moments, ddz_napj, interp_napj, ddzND_napj + COMPLEX(dp), DIMENSION(ips:ipe,ijs:ije,ikys:ikye,ikxs:ikxe,izs:ize),INTENT(IN) :: Sapj, TColl_ + + !! OUTPUT + COMPLEX(dp), DIMENSION(ips:ipe,ijs:ije,ikys:ikye,ikxs:ikxe,izs:ize),INTENT(OUT) :: moments_rhs_ + + INTEGER :: p_int, j_int ! loops indices and polynom. degrees + REAL(dp) :: kx, ky, kperp2 + COMPLEX(dp) :: Tnapj, Tnapp2j, Tnapm2j, Tnapjp1, Tnapjm1 ! Terms from b x gradB and drives + COMPLEX(dp) :: Tnapp1j, Tnapm1j, Tnapp1jm1, Tnapm1jm1 ! Terms from mirror force with non adiab moments_ + COMPLEX(dp) :: Tperp, Tpar, Tmir, Tphi, Tpsi + COMPLEX(dp) :: Unapm1j, Unapm1jp1, Unapm1jm1 ! Terms from mirror force with adiab moments_ + COMPLEX(dp) :: i_kx,i_ky,phikykxz, psikykxz + + ! Measuring execution time + CALL cpu_time(t0_rhs) + + ! Spatial loops + zloop : DO iz = izs,ize + kxloop : DO ikx = ikxs,ikxe + kx = kxarray(ikx) ! radial wavevector + i_kx = imagu * kx ! radial derivative + + kyloop : DO iky = ikys,ikye + ky = kyarray(iky) ! binormal wavevector + i_ky = imagu * ky ! binormal derivative phikykxz = phi(iky,ikx,iz)! tmp phi value - psikykxz = psi(iky,ikx,iz)! tmp phi value + psikykxz = psi(iky,ikx,iz)! tmp psi value - ! Kinetic loops - jloopi : DO ij = ijs_i, ije_i ! This loop is from 1 to jmaxi+1 - j_int = jarray_i(ij) + ! Kinetic loops + jloop : DO ij = ijs, ije ! This loop is from 1 to jmaxi+1 + j_int = jarray(ij) - ploopi : DO ip = ips_i, ipe_i ! Hermite loop - p_int = parray_i(ip) ! Hermite degree - eo = MODULO(p_int,2) ! Indicates if we are on odd or even z grid - kperp2= kparray(iky,ikx,iz,eo)**2 + ploop : DO ip = ips, ipe ! Hermite loop + p_int = parray(ip) ! Hermite degree + eo = MODULO(p_int,2) ! Indicates if we are on odd or even z grid + kperp2= kparray(iky,ikx,iz,eo)**2 - IF((CLOS .NE. 1) .OR. (p_int+2*j_int .LE. dmaxi)) THEN - !! Compute moments mixing terms + IF((CLOS .NE. 1) .OR. (p_int+2*j_int .LE. dmaxe)) THEN + !! Compute moments_ mixing terms Tperp = 0._dp; Tpar = 0._dp; Tmir = 0._dp ! Perpendicular dynamic - ! term propto n_i^{p,j} - Tnipj = xnipj(ip,ij) * nadiab_moments_i(ip ,ij ,iky,ikx,iz) - ! term propto n_i^{p+2,j} - Tnipp2j = xnipp2j(ip) * nadiab_moments_i(ip+pp2,ij ,iky,ikx,iz) - ! term propto n_i^{p-2,j} - Tnipm2j = xnipm2j(ip) * nadiab_moments_i(ip-pp2,ij ,iky,ikx,iz) - ! term propto n_i^{p,j+1} - Tnipjp1 = xnipjp1(ij) * nadiab_moments_i(ip ,ij+1,iky,ikx,iz) - ! term propto n_i^{p,j-1} - Tnipjm1 = xnipjm1(ij) * nadiab_moments_i(ip ,ij-1,iky,ikx,iz) + ! term propto n^{p,j} + Tnapj = xnapj(ip,ij)* nadiab_moments(ip,ij,iky,ikx,iz) + ! term propto n^{p+2,j} + Tnapp2j = xnapp2j(ip) * nadiab_moments(ip+pp2,ij,iky,ikx,iz) + ! term propto n^{p-2,j} + Tnapm2j = xnapm2j(ip) * nadiab_moments(ip-pp2,ij,iky,ikx,iz) + ! term propto n^{p,j+1} + Tnapjp1 = xnapjp1(ij) * nadiab_moments(ip,ij+1,iky,ikx,iz) + ! term propto n^{p,j-1} + Tnapjm1 = xnapjm1(ij) * nadiab_moments(ip,ij-1,iky,ikx,iz) ! Tperp - Tperp = Tnipj + Tnipp2j + Tnipm2j + Tnipjp1 + Tnipjm1 + Tperp = Tnapj + Tnapp2j + Tnapm2j + Tnapjp1 + Tnapjm1 ! Parallel dynamic ! ddz derivative for Landau damping term - Tpar = xnipp1j(ip) * ddz_nipj(ip+1,ij,iky,ikx,iz) & - + xnipm1j(ip) * ddz_nipj(ip-1,ij,iky,ikx,iz) + Tpar = xnapp1j(ip) * ddz_napj(ip+1,ij,iky,ikx,iz) & + + xnapm1j(ip) * ddz_napj(ip-1,ij,iky,ikx,iz) ! Mirror terms - Tnipp1j = ynipp1j (ip,ij) * interp_nipj(ip+1,ij ,iky,ikx,iz) - Tnipp1jm1 = ynipp1jm1(ip,ij) * interp_nipj(ip+1,ij-1,iky,ikx,iz) - Tnipm1j = ynipm1j (ip,ij) * interp_nipj(ip-1,ij ,iky,ikx,iz) - Tnipm1jm1 = ynipm1jm1(ip,ij) * interp_nipj(ip-1,ij-1,iky,ikx,iz) + Tnapp1j = ynapp1j (ip,ij) * interp_napj(ip+1,ij ,iky,ikx,iz) + Tnapp1jm1 = ynapp1jm1(ip,ij) * interp_napj(ip+1,ij-1,iky,ikx,iz) + Tnapm1j = ynapm1j (ip,ij) * interp_napj(ip-1,ij ,iky,ikx,iz) + Tnapm1jm1 = ynapm1jm1(ip,ij) * interp_napj(ip-1,ij-1,iky,ikx,iz) ! Trapping terms - Unipm1j = znipm1j (ip,ij) * interp_nipj(ip-1,ij ,iky,ikx,iz) - Unipm1jp1 = znipm1jp1(ip,ij) * interp_nipj(ip-1,ij+1,iky,ikx,iz) - Unipm1jm1 = znipm1jm1(ip,ij) * interp_nipj(ip-1,ij-1,iky,ikx,iz) - - Tmir = Tnipp1j + Tnipp1jm1 + Tnipm1j + Tnipm1jm1 + Unipm1j + Unipm1jp1 + Unipm1jm1 + Unapm1j = znapm1j (ip,ij) * interp_napj(ip-1,ij ,iky,ikx,iz) + Unapm1jp1 = znapm1jp1(ip,ij) * interp_napj(ip-1,ij+1,iky,ikx,iz) + Unapm1jm1 = znapm1jm1(ip,ij) * interp_napj(ip-1,ij-1,iky,ikx,iz) + Tmir = Tnapp1j + Tnapp1jm1 + Tnapm1j + Tnapm1jm1 + Unapm1j + Unapm1jp1 + Unapm1jm1 !! Electrical potential term IF ( p_int .LE. 2 ) THEN ! kronecker p0 p1 p2 - Tphi = (xphij_i (ip,ij)*kernel_i(ij ,iky,ikx,iz,eo) & - + xphijp1_i(ip,ij)*kernel_i(ij+1,iky,ikx,iz,eo) & - + xphijm1_i(ip,ij)*kernel_i(ij-1,iky,ikx,iz,eo))*phikykxz + Tphi = (xphij (ip,ij)*kernel(ij ,iky,ikx,iz,eo) & + + xphijp1(ip,ij)*kernel(ij+1,iky,ikx,iz,eo) & + + xphijm1(ip,ij)*kernel(ij-1,iky,ikx,iz,eo))*phikykxz ELSE Tphi = 0._dp ENDIF !! Vector potential term IF ( (p_int .LE. 3) .AND. (p_int .GE. 1) ) THEN ! Kronecker p1 or p3 - Tpsi = (xpsij_i (ip,ij)*kernel_i(ij ,iky,ikx,iz,eo) & - + xpsijp1_i(ip,ij)*kernel_i(ij+1,iky,ikx,iz,eo) & - + xpsijm1_i(ip,ij)*kernel_i(ij-1,iky,ikx,iz,eo))*psikykxz + Tpsi = (xpsij (ip,ij)*kernel(ij ,iky,ikx,iz,eo) & + + xpsijp1(ip,ij)*kernel(ij+1,iky,ikx,iz,eo) & + + xpsijm1(ip,ij)*kernel(ij-1,iky,ikx,iz,eo))*psikykxz ELSE Tpsi = 0._dp ENDIF - !! Sum of all RHS terms - moments_rhs_i(ip,ij,iky,ikx,iz,updatetlevel) = & + moments_rhs_(ip,ij,iky,ikx,iz) = & ! Perpendicular magnetic gradient/curvature effects - -imagu*Ckxky(iky,ikx,iz,eo) * Tperp & + -imagu*Ckxky(iky,ikx,iz,eo) * Tperp& ! Perpendicular pressure effects -i_ky*beta*dpdx * Tperp& - ! Parallel coupling (Landau damping) + ! Parallel coupling (Landau Damping) -gradz_coeff(iz,eo) * Tpar & ! Mirror term (parallel magnetic gradient) - -dBdz(iz,eo)*gradz_coeff(iz,eo) * Tmir & + -dBdz(iz,eo)*gradz_coeff(iz,eo) * Tmir& ! Drives (density + temperature gradients) -i_ky * (Tphi - Tpsi) & - ! Numerical hyperdiffusion (totally artificial, for stability purpose) - -mu_x*diff_kx_coeff*kx**N_HD*moments_i(ip,ij,iky,ikx,iz,updatetlevel) & - -mu_y*diff_ky_coeff*ky**N_HD*moments_i(ip,ij,iky,ikx,iz,updatetlevel) & - ! Numerical parallel hyperdiffusion "mu_z*ddz**4" - -mu_z*diff_dz_coeff*ddzND_nipj(ip,ij,iky,ikx,iz) & + ! Numerical Hermite hyperdiffusion (GX version) + -mu_p*diff_pe_coeff*p_int**4*moments_(ip,ij,iky,ikx,iz)& + ! Numerical Laguerre hyperdiffusion (GX version) + -mu_j*diff_je_coeff*j_int**4*moments_(ip,ij,iky,ikx,iz)& + ! Numerical perpendicular hyperdiffusion (totally artificial, for stability purpose) + -mu_x*diff_kx_coeff*kx**N_HD*moments_(ip,ij,iky,ikx,iz) & + -mu_y*diff_ky_coeff*ky**N_HD*moments_(ip,ij,iky,ikx,iz) & + ! Numerical parallel hyperdiffusion "mu_z*ddz**4" see Pueschel 2010 (eq 25) + -mu_z*diff_dz_coeff*ddzND_napj(ip,ij,iky,ikx,iz) & ! Collision term - +TColl_i(ip,ij,iky,ikx,iz)& - ! Nonlinear term with a (gxx*gxy - gxy**2)^1/2 factor - -hatB_NL(iz,eo) * Sipj(ip,ij,iky,ikx,iz) + +TColl_(ip,ij,iky,ikx,iz) & + ! Nonlinear term + -hatB_NL(iz,eo) * Sapj(ip,ij,iky,ikx,iz) - ! IF( (ip-4 .GT. 0) .AND. (num_procs_p .EQ. 1) ) & - ! ! Numerical parallel velocity hyperdiffusion "+ dvpar4 g_a" see Pueschel 2010 (eq 33) - ! ! (not used often so not parallelized) - ! moments_rhs_i(ip,ij,iky,ikx,iz,updatetlevel) = & - ! moments_rhs_i(ip,ij,iky,ikx,iz,updatetlevel) & - ! + mu_p * moments_i(ip-4,ij,iky,ikx,iz,updatetlevel) - ELSE - moments_rhs_i(ip,ij,iky,ikx,iz,updatetlevel) = 0._dp - ENDIF - END DO ploopi - END DO jloopi - END DO kyloopi - END DO kxloopi - END DO zloopi + ! IF( (ip-4 .GT. 0) .AND. (num_procs_p .EQ. 1) ) & + ! ! Numerical parallel velocity hyperdiffusion "+ dvpar4 g_a" see Pueschel 2010 (eq 33) + ! ! (not used often so not parallelized) + ! moments_rhs_(ip,ij,iky,ikx,iz) = & + ! moments_rhs_(ip,ij,iky,ikx,iz) & + ! + mu_p * moments_(ip-4,ij,iky,ikx,iz) - ! Execution time end - CALL cpu_time(t1_rhs) - tc_rhs = tc_rhs + (t1_rhs-t0_rhs) + ELSE + moments_rhs_(ip,ij,iky,ikx,iz) = 0._dp + ENDIF + END DO ploop + END DO jloop + END DO kyloop + END DO kxloop + END DO zloop + + ! Execution time end + CALL cpu_time(t1_rhs) + tc_rhs = tc_rhs + (t1_rhs-t0_rhs) -END SUBROUTINE moments_eq_rhs_i + END SUBROUTINE moments_eq_rhs + !_____________________________________________________________________________! + !_____________________________________________________________________________! + +END SUBROUTINE compute_moments_eq_rhs SUBROUTINE add_Maxwellian_background_terms ! This routine is meant to add the terms rising from the magnetic operator, -- GitLab