From 17aae9e64a04517dbb16c14d59bff5a018b47138 Mon Sep 17 00:00:00 2001
From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch>
Date: Tue, 12 Jan 2021 11:51:31 +0100
Subject: [PATCH] moved precomputed factors from stepon routines to model

---
 src/compute_Sapj.F90   |   5 --
 src/model_mod.F90      |  34 ++++++++++++
 src/moments_eq_rhs.F90 | 116 +++++++++++++++--------------------------
 src/poisson.F90        |   7 +--
 4 files changed, 78 insertions(+), 84 deletions(-)

diff --git a/src/compute_Sapj.F90 b/src/compute_Sapj.F90
index 07a5a4db..185fa13b 100644
--- a/src/compute_Sapj.F90
+++ b/src/compute_Sapj.F90
@@ -21,14 +21,11 @@ SUBROUTINE compute_Sapj
 
   INTEGER :: in, is
   REAL(dp):: kr, kz, kerneln
-  REAL(dp):: sigmae2_taue_o2, sigmai2_taui_o2
 
   ! Execution time start
   CALL cpu_time(t0_Sapj)
 
   !!!!!!!!!!!!!!!!!!!! ELECTRON non linear term computation (Sepj)!!!!!!!!!!
-  sigmae2_taue_o2 = sigma_e**2 * tau_e/2._dp ! factor of the kerneln argument
-
   ploope: DO ip = ips_e,ipe_e ! Loop over Hermite moments
     jloope: DO ij = ijs_e, ije_e ! Loop over Laguerre moments
       real_data_c = 0._dp ! initialize sum over real nonlinear term
@@ -101,8 +98,6 @@ SUBROUTINE compute_Sapj
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
   !!!!!!!!!!!!!!!!!!!! ION non linear term computation (Sipj)!!!!!!!!!!
-  sigmai2_taui_o2 = sigma_i**2 * tau_i/2._dp ! factor of the kerneln argument
-
   ploopi: DO ip = ips_e,ipe_e ! Loop over Hermite moments
     jloopi: DO ij = ijs_e, ije_e ! Loop over Laguerre moments
       real_data_c = 0._dp ! initialize sum over real nonlinear term
diff --git a/src/model_mod.F90 b/src/model_mod.F90
index 58604cf5..1b0967a1 100644
--- a/src/model_mod.F90
+++ b/src/model_mod.F90
@@ -21,6 +21,18 @@ MODULE model
   REAL(dp), PUBLIC, PROTECTED ::   eta_B =  1._dp     ! Magnetic gradient
   REAL(dp), PUBLIC, PROTECTED :: lambdaD =  1._dp     ! Debye length
 
+  REAL(dp), PUBLIC, PROTECTED :: taue_qe_etaB         ! factor of the magnetic moment coupling
+  REAL(dp), PUBLIC, PROTECTED :: taui_qi_etaB         !
+  REAL(dp), PUBLIC, PROTECTED :: sqrtTaue_qe          ! factor of parallel moment term
+  REAL(dp), PUBLIC, PROTECTED :: sqrtTaui_qi          !
+  REAL(dp), PUBLIC, PROTECTED :: qe_sigmae_sqrtTaue   ! factor of parallel phi term
+  REAL(dp), PUBLIC, PROTECTED :: qi_sigmai_sqrtTaui   !
+  REAL(dp), PUBLIC, PROTECTED :: sigmae2_taue_o2      ! factor of the Kernel argument
+  REAL(dp), PUBLIC, PROTECTED :: sigmai2_taui_o2      !
+  REAL(dp), PUBLIC, PROTECTED :: nu_e,  nu_i          ! electron-ion, ion-ion collision frequency
+  REAL(dp), PUBLIC, PROTECTED :: nu_ee, nu_ie         ! e-e, i-e coll. frequ.
+  REAL(dp), PUBLIC, PROTECTED :: qe2_taue, qi2_taui   ! factor of the gammaD sum
+
   PUBLIC :: model_readinputs, model_outputinputs
 
 CONTAINS
@@ -41,6 +53,28 @@ CONTAINS
     ! Collision Frequency Normalization ... to match fluid limit
     nu = nu*0.532_dp
 
+    !Precompute species dependant factors
+    IF( q_e .NE. 0._dp ) THEN
+      taue_qe_etaB    = tau_e/q_e * eta_B ! factor of the magnetic moment coupling
+      sqrtTaue_qe     = sqrt(tau_e)/q_e   ! factor of parallel moment term
+    ELSE
+      taue_qe_etaB  = 0._dp
+      sqrtTaue_qe   = 0._dp
+    ENDIF
+
+    taui_qi_etaB    = tau_i/q_i * eta_B ! factor of the magnetic moment coupling
+    sqrtTaui_qi     = sqrt(tau_i)/q_i   ! factor of parallel moment term
+    qe_sigmae_sqrtTaue = q_e/sigma_e/SQRT(tau_e) ! factor of parallel phi term
+    qi_sigmai_sqrtTaui = q_i/sigma_i/SQRT(tau_i)
+    qe2_taue        = (q_e**2)/tau_e ! factor of the gammaD sum
+    qi2_taui        = (q_i**2)/tau_i
+    sigmae2_taue_o2 = sigma_e**2 * tau_e/2._dp ! factor of the Kernel argument
+    sigmai2_taui_o2 = sigma_i**2 * tau_i/2._dp
+    nu_e            = nu ! electron-ion collision frequency (where already multiplied by 0.532)
+    nu_i            = nu * sigma_e * (tau_i)**(-3._dp/2._dp)/SQRT2 ! ion-ion collision frequ.
+    nu_ee           = nu_e/SQRT2 ! e-e coll. frequ.
+    nu_ie           = nu*sigma_e**2 ! i-e coll. frequ.
+
   END SUBROUTINE model_readinputs
 
 
diff --git a/src/moments_eq_rhs.F90 b/src/moments_eq_rhs.F90
index 13b955ac..3b3c5fde 100644
--- a/src/moments_eq_rhs.F90
+++ b/src/moments_eq_rhs.F90
@@ -8,46 +8,23 @@ SUBROUTINE moments_eq_rhs
   USE model
   USE prec_const
   USE utility, ONLY : is_nan
+  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
   REAL(dp)    :: kr, kz, kperp2
-  REAL(dp)    :: taue_qe_etaB, taui_qi_etaB
-  REAL(dp)    :: sqrtTaue_qe, sqrtTaui_qi, qe_sigmae_sqrtTaue, qi_sigmai_sqrtTaui
   REAL(dp)    :: kernelj, kerneljp1, kerneljm1 ! Kernel functions and variable
-  REAL(dp)    :: factj, sigmae2_taue_o2, sigmai2_taui_o2 ! Auxiliary variables
   REAL(dp)    :: xNapj, xNapp1j, xNapm1j, xNapp2j, xNapm2j, xNapjp1, xNapjm1 ! Mom. factors depending on the pj loop
   REAL(dp)    :: xphij, xphijp1, xphijm1, xphijpar ! ESpot. factors depending on the pj loop
   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) :: test_nan, i_kz
-  REAL(dp)    :: nu_e, nu_i, nu_ee, nu_ie ! Species collisional frequency
 
   ! Measuring execution time
   CALL cpu_time(t0_rhs)
 
-  !Precompute species dependant factors
-  IF( q_e .NE. 0._dp ) THEN
-    taue_qe_etaB    = tau_e/q_e * eta_B ! factor of the magnetic moment coupling
-    sqrtTaue_qe     = sqrt(tau_e)/q_e   ! factor of parallel moment term
-  ELSE
-    taue_qe_etaB  = 0._dp
-    sqrtTaue_qe   = 0._dp
-  ENDIF
-
-  taui_qi_etaB    = tau_i/q_i * eta_B ! factor of the magnetic moment coupling
-  sqrtTaui_qi     = sqrt(tau_i)/q_i   ! factor of parallel moment term
-  qe_sigmae_sqrtTaue = q_e/sigma_e/SQRT(tau_e) ! factor of parallel phi term
-  qi_sigmai_sqrtTaui = q_i/sigma_i/SQRT(tau_i)
-  sigmae2_taue_o2 = sigma_e**2 * tau_e/2._dp ! factor of the Kernel argument
-  sigmai2_taui_o2 = sigma_i**2 * tau_i/2._dp
-  nu_e  = nu ! electron-ion collision frequency (where already multiplied by 0.532)
-  nu_i  = nu * sigma_e * (tau_i)**(-3._dp/2._dp)/SQRT2 ! ion-ion collision frequ.
-  nu_ee  = nu_e/SQRT2 ! e-e coll. frequ.
-  nu_ie  = nu*sigma_e**2 ! i-e coll. frequ.
-
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !!!!!!!!! Electrons moments RHS !!!!!!!!!
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -65,7 +42,7 @@ SUBROUTINE moments_eq_rhs
     ! N_e^{p-2,j} coeff
     xNapm2j = taue_qe_etaB * SQRT(p_dp * (p_dp - 1._dp))
 
-    factj = 1.0 ! Start of the recursive factorial
+    ! factj = 1.0 ! Start of the recursive factorial
 
     jloope : DO ij = ijs_e, ije_e ! loop over Laguerre degree indices
       j_int= jarray_e(ij) ! Laguerre polynom. degree
@@ -116,11 +93,11 @@ SUBROUTINE moments_eq_rhs
       ENDIF
 
       ! Recursive factorial
-      IF (j_dp .GT. 0) THEN
-        factj = factj * j_dp
-      ELSE
-        factj = 1._dp
-      ENDIF
+      ! IF (j_dp .GT. 0) THEN
+      !   factj = factj * j_dp
+      ! ELSE
+      !   factj = 1._dp
+      ! ENDIF
 
       ! Loop on kspace
       krloope : DO ikr = ikrs,ikre
@@ -137,46 +114,49 @@ SUBROUTINE moments_eq_rhs
           ! term propto N_e^{p,j}
           TNapj = xNapj * moments_e(ip,ij,ikr,ikz,updatetlevel)
           ! term propto N_e^{p+1,j} and kparallel
-          IF ( (ip+1 .LE. pmaxe+1) ) THEN ! OoB check
+          IF ( (p_int+1 .LE. pmaxe) ) THEN ! OoB check
             TNapp1j = xNapp1j * moments_e(ip+1,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapp1j = 0._dp
           ENDIF
           ! term propto N_e^{p-1,j} and kparallel
-          IF ( (ip-1 .GE. 1) ) THEN ! OoB check
+          IF ( (p_int-1 .GE. 0) ) THEN ! OoB check
             TNapm1j = xNapm1j * moments_e(ip-1,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapm1j = 0._dp
           ENDIF
           ! term propto N_e^{p+2,j}
-          IF (ip+(2-pskip) .LE. pmaxe+1) THEN ! OoB check
-            TNapp2j = xNapp2j * moments_e(ip+(2-pskip),ij,ikr,ikz,updatetlevel)
+          IF (p_int+2 .LE. pmaxe) THEN ! OoB check
+            TNapp2j = xNapp2j * moments_e(ip+2,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapp2j = 0._dp
           ENDIF
           ! term propto N_e^{p-2,j}
-          IF (ip-(2-pskip) .GE. 1) THEN ! OoB check
-            TNapm2j = xNapm2j * moments_e(ip-(2-pskip),ij,ikr,ikz,updatetlevel)
+          IF (p_int-2 .GE. 0) THEN ! OoB check
+            TNapm2j = xNapm2j * moments_e(ip-2,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapm2j = 0._dp
           ENDIF
           ! xterm propto N_e^{p,j+1}
-          IF (ij+1 .LE. jmaxe+1) THEN ! OoB check
+          IF (j_int+1 .LE. jmaxe) THEN ! OoB check
             TNapjp1 = xNapjp1 * moments_e(ip,ij+1,ikr,ikz,updatetlevel)
           ELSE
             TNapjp1 = 0._dp
           ENDIF
           ! term propto N_e^{p,j-1}
-          IF (ij-1 .GE. 1) THEN ! OoB check
+          IF (j_int-1 .GE. 0) THEN ! OoB check
             TNapjm1 = xNapjm1 * moments_e(ip,ij-1,ikr,ikz,updatetlevel)
           ELSE
             TNapjm1 = 0._dp
           ENDIF
 
           !! Collision
-          IF (CO .EQ. -2) THEN ! Dougherty Collision terms
-            IF ( (pmaxe .GE. 2-pskip) ) THEN ! OoB check
-              TColl20 = xCa20 * moments_e(3-pskip,1,ikr,ikz,updatetlevel)
+          IF (CO .EQ. -3) THEN ! GK Dougherty
+            CALL DoughertyGK_e(ip,ij,ikr,ikz,TColl)
+
+          ELSEIF (CO .EQ. -2) THEN ! DK Dougherty
+            IF ( (pmaxe .GE. 2) ) THEN ! OoB check
+              TColl20 = xCa20 * moments_e(3,1,ikr,ikz,updatetlevel)
             ELSE
               TColl20 = 0._dp
             ENDIF
@@ -190,7 +170,6 @@ SUBROUTINE moments_eq_rhs
             ELSE
               TColl10 = 0._dp
             ENDIF
-
             ! Total collisional term
             TColl =  xCapj* moments_e(ip,ij,ikr,ikz,updatetlevel)&
                    + TColl20 + TColl01 + TColl10
@@ -203,22 +182,17 @@ SUBROUTINE moments_eq_rhs
               p2_int = parray_e(ip2)
               jloopee: DO ij2 = 1,jmaxe+1
                 j2_int = jarray_e(ij2)
-
                 TColl = TColl + moments_e(ip2,ij2,ikr,ikz,updatetlevel) &
                    *( nu_e  * CeipjT(bare(p_int,j_int), bare(p2_int,j2_int)) &
                      +nu_ee * Ceepj (bare(p_int,j_int), bare(p2_int,j2_int)))
-
               ENDDO jloopee
             ENDDO ploopee
-
             ploopei: DO ip2 = 1,pmaxi+1 ! sum the electron-ion field terms
               p2_int = parray_i(ip2)
               jloopei: DO ij2 = 1,jmaxi+1
                 j2_int = jarray_i(ij2)
-
                 TColl = TColl + moments_i(ip2,ij2,ikr,ikz,updatetlevel) &
                   *(nu_e * CeipjF(bare(p_int,j_int), bari(p2_int,j2_int)))
-
               END DO jloopei
             ENDDO ploopei
 
@@ -285,7 +259,7 @@ SUBROUTINE moments_eq_rhs
     ! x N_i^{p-2,j} coeff
     xNapm2j = taui_qi_etaB * SQRT(p_dp * (p_dp - 1._dp))
 
-    factj = 1._dp ! Start of the recursive factorial
+    ! factj = 1._dp ! Start of the recursive factorial
 
     jloopi : DO ij = ijs_i, ije_i  ! This loop is from 1 to jmaxi+1
       j_int= jarray_i(ij)   ! REALof Laguerre degree
@@ -335,12 +309,12 @@ SUBROUTINE moments_eq_rhs
         xphij = 0._dp; xphijp1 = 0._dp; xphijm1 = 0._dp; xphijpar =  0._dp
       ENDIF
 
-      ! Recursive factorial
-      IF (j_dp .GT. 0) THEN
-        factj = factj * j_dp
-      ELSE
-        factj = 1._dp
-      ENDIF
+      ! ! Recursive factorial
+      ! IF (j_dp .GT. 0) THEN
+      !   factj = factj * j_dp
+      ! ELSE
+      !   factj = 1._dp
+      ! ENDIF
 
       ! Loop on kspace
       krloopi : DO ikr = ikrs,ikre
@@ -355,46 +329,49 @@ SUBROUTINE moments_eq_rhs
           ! term propto N_i^{p,j}
           TNapj = xNapj * moments_i(ip,ij,ikr,ikz,updatetlevel)
           ! term propto N_i^{p+1,j}
-          IF ( (ip+1 .LE. pmaxi+1) ) THEN ! OoB check
+          IF ( (p_int+1 .LE. pmaxi) ) THEN ! OoB check
             TNapp1j = xNapp1j * moments_i(ip+1,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapp1j = 0._dp
           ENDIF
           ! term propto N_i^{p-1,j}
-          IF ( (ip-1 .GE. 1) ) THEN ! OoB check
+          IF ( (p_int-1 .GE. 0) ) THEN ! OoB check
             TNapm1j = xNapm1j * moments_i(ip-1,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapm1j = 0._dp
           ENDIF
           ! term propto N_i^{p+2,j}
-          IF (ip+(2-pskip) .LE. pmaxi+1) THEN ! OoB check
-            TNapp2j = xNapp2j * moments_i(ip+(2-pskip),ij,ikr,ikz,updatetlevel)
+          IF (p_int+2 .LE. pmaxi) THEN ! OoB check
+            TNapp2j = xNapp2j * moments_i(ip+2,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapp2j = 0._dp
           ENDIF
           ! term propto N_i^{p-2,j}
-          IF (ip-(2-pskip) .GE. 1) THEN ! OoB check
-            TNapm2j = xNapm2j * moments_i(ip-(2-pskip),ij,ikr,ikz,updatetlevel)
+          IF (p_int-2 .GE. 0) THEN ! OoB check
+            TNapm2j = xNapm2j * moments_i(ip-2,ij,ikr,ikz,updatetlevel)
           ELSE
             TNapm2j = 0._dp
           ENDIF
           ! xterm propto N_i^{p,j+1}
-          IF (ij+1 .LE. jmaxi+1) THEN ! OoB check
+          IF (j_int+1 .LE. jmaxi) THEN ! OoB check
             TNapjp1 = xNapjp1 * moments_i(ip,ij+1,ikr,ikz,updatetlevel)
           ELSE
             TNapjp1 = 0._dp
           ENDIF
           ! term propto N_i^{p,j-1}
-          IF (ij-1 .GE. 1) THEN ! OoB check
+          IF (j_int-1 .GE. 0) THEN ! OoB check
             TNapjm1 = xNapjm1 * moments_i(ip,ij-1,ikr,ikz,updatetlevel)
           ELSE
             TNapjm1 = 0._dp
           ENDIF
 
           !! Collision
-          IF (CO .EQ. -2) THEN  ! Dougherty Collision terms
-            IF ( (pmaxi .GE. 2-pskip) ) THEN ! OoB check
-              TColl20 = xCa20 * moments_i(3-pskip,1,ikr,ikz,updatetlevel)
+          IF (CO .EQ. -3) THEN  ! Gyrokin. Dougherty Collision terms
+            CALL DoughertyGK_i(ip,ij,ikr,ikz,TColl)
+
+          ELSEIF (CO .EQ. -2) THEN  ! Dougherty Collision terms
+            IF ( (pmaxi .GE. 2) ) THEN ! OoB check
+              TColl20 = xCa20 * moments_i(3,1,ikr,ikz,updatetlevel)
             ELSE
               TColl20 = 0._dp
             ENDIF
@@ -408,40 +385,33 @@ SUBROUTINE moments_eq_rhs
             ELSE
               TColl10 = 0._dp
             ENDIF
-
             ! Total collisional term
             TColl =  xCapj* moments_i(ip,ij,ikr,ikz,updatetlevel)&
                    + TColl20 + TColl01 + TColl10
 
           ELSEIF (CO .EQ. -1) THEN !!! Full Coulomb for ions (COSOlver matrix) !!!
-
             TColl = 0._dp ! Initialization
-
             ploopii: DO ip2 = 1,pmaxi+1 ! sum the ion-self and ion-electron test terms
               p2_int = parray_i(ip2)
               jloopii: DO ij2 = 1,jmaxi+1
                 j2_int = jarray_i(ij2)
-
                 TColl = TColl + moments_i(ip2,ij2,ikr,ikz,updatetlevel) &
                     *( nu_ie * CiepjT(bari(p_int,j_int), bari(p2_int,j2_int)) &
                       +nu_i  * Ciipj (bari(p_int,j_int), bari(p2_int,j2_int)))
-
               ENDDO jloopii
             ENDDO ploopii
-
             ploopie: DO ip2 = 1,pmaxe+1 ! sum the ion-electron field terms
               p2_int = parray_e(ip2)
               jloopie: DO ij2 = 1,jmaxe+1
                 j2_int = jarray_e(ij2)
-
                 TColl = TColl + moments_e(ip2,ij2,ikr,ikz,updatetlevel) &
                   *(nu_ie * CiepjF(bari(p_int,j_int), bare(p2_int,j2_int)))
-
               ENDDO jloopie
             ENDDO ploopie
 
           ELSEIF (CO .EQ. 0) THEN! Lenhard Bernstein
             TColl = xCapj * moments_i(ip,ij,ikr,ikz,updatetlevel)
+
           ENDIF
 
           !! Electrical potential term
diff --git a/src/poisson.F90 b/src/poisson.F90
index f126d60b..dc5c93a4 100644
--- a/src/poisson.F90
+++ b/src/poisson.F90
@@ -6,7 +6,7 @@ SUBROUTINE poisson
   USE array
   USE fields
   USE grid
-  use model, ONLY : tau_e, tau_i, sigma_e, sigma_i, q_e, q_i, lambdaD, DK
+  use model, ONLY : qe2_taue, qi2_taui, q_e, q_i, lambdaD
 
   USE prec_const
   IMPLICIT NONE
@@ -14,7 +14,6 @@ SUBROUTINE poisson
   INTEGER     :: ini,ine
   REAL(dp)    :: Kne, Kni ! sub kernel factor for recursive build
   REAL(dp)    :: alphaD
-  REAL(dp)    :: qe2_taue, qi2_taui ! To avoid redondant computation
   REAL(dp)    :: sum_kernel2_e,    sum_kernel2_i    ! Store sum Kn^2
   COMPLEX(dp) :: sum_kernel_mom_e, sum_kernel_mom_i ! Store sum Kn*Napn
   REAL(dp)    :: gammaD
@@ -23,10 +22,6 @@ SUBROUTINE poisson
   ! Execution time start
   CALL cpu_time(t0_poisson)
 
-  !Precompute species dependant factors
-  qe2_taue        = (q_e**2)/tau_e ! factor of the gammaD sum
-  qi2_taui        = (q_i**2)/tau_i
-
   DO ikr=ikrs,ikre
     DO ikz=ikzs,ikze
 
-- 
GitLab