From d9db1695730e2d2c11878e368839e97df771eeaf Mon Sep 17 00:00:00 2001
From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch>
Date: Fri, 19 Feb 2021 11:26:00 +0100
Subject: [PATCH] started kinetic hyperdiffusivity

---
 src/moments_eq_rhs.F90 | 61 +++++++++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 12 deletions(-)

diff --git a/src/moments_eq_rhs.F90 b/src/moments_eq_rhs.F90
index ab5c63f0..4de634b4 100644
--- a/src/moments_eq_rhs.F90
+++ b/src/moments_eq_rhs.F90
@@ -17,8 +17,8 @@ SUBROUTINE moments_eq_rhs_e
   USE collision
   IMPLICIT NONE
 
-  INTEGER     :: ip2, ij2, p_int, j_int, p2_int, j2_int ! loops indices and polynom. degrees
-  REAL(dp)    :: p_dp, j_dp
+  INTEGER     :: ip2, ij2, il, p_int, j_int, p2_int, j2_int ! loops indices and polynom. degrees
+  REAL(dp)    :: p_dp, j_dp, l_dp
   REAL(dp)    :: kr, kz, kperp2
   REAL(dp)    :: kernelj, kerneljp1, kerneljm1 ! Kernel functions and variable
   REAL(dp)    :: xNapj, xNapp1j, xNapm1j, xNapp2j, xNapm2j, xNapjp1, xNapjm1 ! Mom. factors depending on the pj loop
@@ -26,7 +26,7 @@ SUBROUTINE moments_eq_rhs_e
   REAL(dp)    :: xCapj,   xCa20,   xCa01, xCa10 ! Coll. factors depending on the pj loop
   COMPLEX(dp) :: TNapj, TNapp1j, TNapm1j, TNapp2j, TNapm2j, TNapjp1, TNapjm1, Tphi
   COMPLEX(dp) :: TColl, TColl20, TColl01, TColl10 ! terms of the rhs
-  COMPLEX(dp) :: i_kz
+  COMPLEX(dp) :: i_kz, Hyper_diff_p, Hyper_diff_j
 
   ! Measuring execution time
   CALL cpu_time(t0_rhs)
@@ -144,13 +144,28 @@ SUBROUTINE moments_eq_rhs_e
             Tphi = 0._dp
           ENDIF
 
-          ! Sum of all linear terms
+          !! Kinetic hyperdiffusion
+          Hyper_diff_p = 0._dp
+          IF ( p_int .GE. 4 ) THEN
+            Hyper_diff_p = (2._dp*p_dp)**2 *moments_e(ip-4,ij,ikr,ikz,updatetlevel)
+          ENDIF
+
+          Hyper_diff_j = 0._dp
+          IF ( j_int .GE. 2 ) THEN
+            DO il = 1,(ij-2)
+              l_dp = real(il-1,dp)
+              Hyper_diff_j = Hyper_diff_j + (j_dp-(l_dp+1_dp))*moments_e(ip,il,ikr,ikz,updatetlevel)
+            ENDDO
+          ENDIF
+
+          !! Sum of all linear terms
           moments_rhs_e(ip,ij,ikr,ikz,updatetlevel) = &
               -i_kz  * (TNapj + TNapp2j + TNapm2j + TNapjp1 + TNapjm1 - Tphi)&
               - mu*kperp2**2 * moments_e(ip,ij,ikr,ikz,updatetlevel) &
+              + mu_p * Hyper_diff_p + mu_j * Hyper_diff_j &
               + TColl
 
-          ! Adding non linearity
+          !! Adding non linearity
           IF ( NON_LIN ) THEN
             moments_rhs_e(ip,ij,ikr,ikz,updatetlevel) = &
               moments_rhs_e(ip,ij,ikr,ikz,updatetlevel) - Sepj(ip,ij,ikr,ikz)
@@ -186,8 +201,8 @@ SUBROUTINE moments_eq_rhs_i
   USE collision
   IMPLICIT NONE
 
-  INTEGER     :: ip2, ij2, p_int, j_int, p2_int, j2_int ! loops indices and polynom. degrees
-  REAL(dp)    :: p_dp, j_dp
+  INTEGER     :: ip2, ij2, il, p_int, j_int, p2_int, j2_int ! loops indices and polynom. degrees
+  REAL(dp)    :: p_dp, j_dp, l_dp
   REAL(dp)    :: kr, kz, kperp2
   REAL(dp)    :: kernelj, kerneljp1, kerneljm1 ! Kernel functions and variable
   REAL(dp)    :: xNapj, xNapp1j, xNapm1j, xNapp2j, xNapm2j, xNapjp1, xNapjm1 ! Mom. factors depending on the pj loop
@@ -195,7 +210,7 @@ SUBROUTINE moments_eq_rhs_i
   REAL(dp)    :: xCapj,   xCa20,   xCa01, xCa10 ! Coll. factors depending on the pj loop
   COMPLEX(dp) :: TNapj, TNapp1j, TNapm1j, TNapp2j, TNapm2j, TNapjp1, TNapjm1, Tphi
   COMPLEX(dp) :: TColl, TColl20, TColl01, TColl10 ! terms of the rhs
-  COMPLEX(dp) :: i_kz
+  COMPLEX(dp) :: i_kz, Hyper_diff_p, Hyper_diff_j
 
   LOGICAL     :: COPY_CLOS = .false. ! To test closures
   ! LOGICAL     :: COPY_CLOS = .true. ! To test closures
@@ -226,7 +241,14 @@ SUBROUTINE moments_eq_rhs_i
       xNapjm1 = -taui_qi_etaB * j_dp
       ! x N_i^{pj} coeff
       xNapj   = taui_qi_etaB * 2._dp*(p_dp + j_dp + 1._dp)
-
+      ! Damping over the moments
+      IF ( p_damp .GT. 0 ) THEN
+        xNapj = xNapj - (p_dp/real(pmaxi,dp))**(2*p_damp)
+      ENDIF
+      IF ( j_damp .GT. 0 ) THEN
+        xNapj = xNapj - (j_dp/real(jmaxi,dp))**(2*j_damp)
+      ENDIF
+      
       !! Collision operator pj terms
       xCapj = -nu_i*(p_dp + 2._dp*j_dp) !DK Lenard-Bernstein basis
       ! Dougherty part
@@ -315,13 +337,28 @@ SUBROUTINE moments_eq_rhs_i
             Tphi = 0._dp
           ENDIF
 
-          ! Sum of linear terms
+          !! Kinetic hyperdiffusion
+          Hyper_diff_p = 0._dp
+          IF ( p_int .GE. 4 ) THEN
+            Hyper_diff_p = (2._dp*p_dp)**2 *moments_i(ip-4,ij,ikr,ikz,updatetlevel)
+          ENDIF
+
+          Hyper_diff_j = 0._dp
+          IF ( j_int .GE. 2 ) THEN
+            DO il = 1,(ij-2)
+              l_dp = real(il-1,dp)
+              Hyper_diff_j = Hyper_diff_j + (j_dp-(l_dp+1_dp))*moments_i(ip,il,ikr,ikz,updatetlevel)
+            ENDDO
+          ENDIF
+
+          !! Sum of linear terms
           moments_rhs_i(ip,ij,ikr,ikz,updatetlevel) = &
               -i_kz  * (TNapj + TNapp2j + TNapm2j + TNapjp1 + TNapjm1 - Tphi)&
               - mu*kperp2**2 * moments_i(ip,ij,ikr,ikz,updatetlevel) &
-               + TColl
+              + mu_p * Hyper_diff_p + mu_j * Hyper_diff_j &
+              + TColl
 
-          ! Adding non linearity
+          !! Adding non linearity
           IF ( NON_LIN ) THEN
            moments_rhs_i(ip,ij,ikr,ikz,updatetlevel) = &
              moments_rhs_i(ip,ij,ikr,ikz,updatetlevel) - Sipj(ip,ij,ikr,ikz)
-- 
GitLab