diff --git a/src/moments_eq_rhs_mod.F90 b/src/moments_eq_rhs_mod.F90 index 84dbced3d8c1c611eb8359e62e6fff5b3d8dbac9..f8cab0197039865e1cd6ec4dda8c93e7e33bee65 100644 --- a/src/moments_eq_rhs_mod.F90 +++ b/src/moments_eq_rhs_mod.F90 @@ -12,7 +12,7 @@ SUBROUTINE compute_moments_eq_rhs USE prec_const USE collision USE time_integration - USE geometry, ONLY: gradz_coeff, dBdz, Ckxky, Gamma_NL!, Gamma_phipar + USE geometry, ONLY: gradz_coeff, dlnBdz, Ckxky, Gamma_NL!, Gamma_phipar USE calculus, ONLY : interp_z, grad_z, grad_z2 IMPLICIT NONE @@ -59,7 +59,7 @@ SUBROUTINE compute_moments_eq_rhs znapm1j, znapm1jp1, znapm1jm1, & xphij, xphijp1, xphijm1, xpsij, xpsijp1, xpsijm1,& kernel, nadiab_moments, ddz_napj, interp_napj, Sapj,& - moments_, TColl_, ddzND_napj, moments_rhs_) + moments, TColl, ddzND_napj, moments_rhs) IMPLICIT NONE !! INPUTS @@ -81,17 +81,18 @@ SUBROUTINE compute_moments_eq_rhs COMPLEX(dp), DIMENSION(ipgs:ipge,ijgs:ijge,ikys:ikye,ikxs:ikxe,izgs:izge),INTENT(IN) :: ddz_napj COMPLEX(dp), DIMENSION(ipgs:ipge,ijgs:ijge,ikys:ikye,ikxs:ikxe,izgs:izge),INTENT(IN) :: interp_napj COMPLEX(dp), DIMENSION( ips:ipe, ijs:ije, ikys:ikye,ikxs:ikxe, izs:ize), INTENT(IN) :: Sapj - COMPLEX(dp), DIMENSION(ipgs:ipge,ijgs:ijge,ikys:ikye,ikxs:ikxe,izgs:izge),INTENT(IN) :: moments_ - COMPLEX(dp), DIMENSION( ips:ipe, ijs:ije, ikys:ikye,ikxs:ikxe, izs:ize), INTENT(IN) :: TColl_ + COMPLEX(dp), DIMENSION(ipgs:ipge,ijgs:ijge,ikys:ikye,ikxs:ikxe,izgs:izge),INTENT(IN) :: moments + COMPLEX(dp), DIMENSION( ips:ipe, ijs:ije, ikys:ikye,ikxs:ikxe, izs:ize), INTENT(IN) :: TColl COMPLEX(dp), DIMENSION(ipgs:ipge,ijgs:ijge,ikys:ikye,ikxs:ikxe,izgs:izge),INTENT(IN) :: ddzND_napj !! OUTPUT - COMPLEX(dp), DIMENSION( ips:ipe, ijs:ije, ikys:ikye,ikxs:ikxe, izs:ize),INTENT(OUT) :: moments_rhs_ + 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) :: Tpar, Tmir, Tphi, Tpsi + COMPLEX(dp) :: Mperp, Mpara, Dphi, Dpsi COMPLEX(dp) :: Unapm1j, Unapm1jp1, Unapm1jm1 ! Terms from mirror force with adiab moments_ COMPLEX(dp) :: i_kx,i_ky,phikykxz, psikykxz @@ -107,7 +108,6 @@ SUBROUTINE compute_moments_eq_rhs 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 psi value ! Kinetic loops @@ -121,7 +121,6 @@ SUBROUTINE compute_moments_eq_rhs IF((CLOS .NE. 1) .OR. (p_int+2*j_int .LE. dmaxe)) THEN ! for the closure scheme !! Compute moments_ mixing terms - Tperp = 0._dp; Tpar = 0._dp; Tmir = 0._dp ! Perpendicular dynamic ! term propto n^{p,j} Tnapj = xnapj(ip,ij)* nadiab_moments(ip,ij,iky,ikx,iz) @@ -133,8 +132,9 @@ SUBROUTINE compute_moments_eq_rhs 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 = Tnapj + Tnapp2j + Tnapm2j + Tnapjp1 + Tnapjm1 + ! Perpendicular magnetic term (curvature and gradient drifts) + Mperp = imagu*Ckxky(iky,ikx,iz,eo)*(Tnapj + Tnapp2j + Tnapm2j + Tnapjp1 + Tnapjm1) + ! Parallel dynamic ! ddz derivative for Landau damping term Tpar = xnapp1j(ip) * ddz_napj(ip+1,ij,iky,ikx,iz) & @@ -149,52 +149,53 @@ SUBROUTINE compute_moments_eq_rhs 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 + Tmir = dlnBdz(iz,eo)*(Tnapp1j + Tnapp1jm1 + Tnapm1j + Tnapm1jm1 +& + Unapm1j + Unapm1jp1 + Unapm1jm1) + ! Parallel magnetic term (Landau damping and the mirror force) + Mpara = gradz_coeff(iz,eo)*(Tpar + Tmir) !! Electrical potential term IF ( p_int .LE. 2 ) THEN ! kronecker p0 p1 p2 - 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)) + Dphi =i_ky*( 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) )*phi(iky,ikx,iz) 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 (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)) + Dpsi =-i_ky*( 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))*psi(iky,ikx,iz) ELSE - Tpsi = 0._dp + Dpsi = 0._dp ENDIF !! Sum of all RHS terms - moments_rhs_(ip,ij,iky,ikx,iz) = & - ! 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& + moments_rhs(ip,ij,iky,ikx,iz) = & + ! Nonlinear term Sapj = {phi,f} + - Sapj(ip,ij,iky,ikx,iz) & + ! Perpendicular magnetic term + - Mperp & + ! Parallel magnetic term + - Mpara & ! Drives (density + temperature gradients) - -i_ky * (Tphi*phikykxz - Tpsi*psikykxz) & - ! Parallel drive term (should be negligible, test) + - (Dphi + Dpsi) & + ! Collision term + + TColl(ip,ij,iky,ikx,iz) & + ! Perpendicular pressure effects (electromagnetic term) (TO CHECK) + - i_ky*beta*dpdx * (Tnapj + Tnapp2j + Tnapm2j + Tnapjp1 + Tnapjm1)& + ! Parallel drive term (should be negligible, to test) ! -Gamma_phipar(iz,eo)*Tphi*ddz_phi(iky,ikx,iz) & ! Numerical Hermite hyperdiffusion (GX version) - -mu_p*diff_pe_coeff*p_int**4*moments_(ip,ij,iky,ikx,iz)& + -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) & + -mu_j*diff_je_coeff*j_int**4*moments(ip,ij,iky,ikx,iz)& + ! Numerical perpendicular hyperdiffusion + -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_(ip,ij,iky,ikx,iz) & - ! Nonlinear term - -Gamma_NL(iz,eo)*Sapj(ip,ij,iky,ikx,iz) + -mu_z*diff_dz_coeff*ddzND_napj(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) @@ -204,7 +205,7 @@ SUBROUTINE compute_moments_eq_rhs ! + mu_p * moments_(ip-4,ij,iky,ikx,iz) ELSE - moments_rhs_(ip,ij,iky,ikx,iz) = 0._dp + moments_rhs(ip,ij,iky,ikx,iz) = 0._dp ENDIF END DO ploop END DO jloop @@ -224,8 +225,8 @@ END SUBROUTINE compute_moments_eq_rhs SUBROUTINE add_Maxwellian_background_terms ! This routine is meant to add the terms rising from the magnetic operator, - ! i.e. (B x GradB) Grad, applied on the background Maxwellian distribution - ! (x_a + spar^2)(b x GradB) GradFaM + ! i.e. (B x k_gB) Grad, applied on the background Maxwellian distribution + ! (x_a + spar^2)(b x k_gB) GradFaM ! It gives birth to kx=ky=0 sources terms (averages) that hit moments 00, 20, ! 40, 01,02, 21 with background gradient dependences. USE prec_const