From edc95ef25a43674393b7bd2cf8de6aa18f174410 Mon Sep 17 00:00:00 2001
From: Antoine Hoffmann <antoine.hoffmann@epfl.ch>
Date: Fri, 15 Dec 2023 14:41:19 +0100
Subject: [PATCH] background ZF shearing method is added

---
 src/model_mod.F90     |  7 +++++--
 src/nonlinear_mod.F90 | 22 ++++++++++++----------
 2 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/src/model_mod.F90 b/src/model_mod.F90
index 7f23ce85..81ebdbe7 100644
--- a/src/model_mod.F90
+++ b/src/model_mod.F90
@@ -28,7 +28,8 @@ MODULE model
   REAL(xp), PUBLIC, PROTECTED ::    beta =  0._xp     ! electron plasma Beta (8piNT_e/B0^2)
   REAL(xp), PUBLIC, PROTECTED :: ExBrate =  0._xp     ! ExB background shearing rate (radially constant shear flow)
   INTEGER,  PUBLIC, PROTECTED ::   ikxZF =  0         ! Background zonal mode wavenumber (acts in the nonlinear term)
-  REAL(xp), PUBLIC, PROTECTED ::   ZFamp =  0._xp   ! Amplitude of the background zonal mode
+  REAL(xp), PUBLIC, PROTECTED ::  ZFrate =  0._xp     ! Shearing rate of the background zonal mode
+  LOGICAL,  PUBLIC, PROTECTED :: ZF_ONLY =  .false.   ! Cancels the nonlinear term excepts the background ZF contribution
   ! Auxiliary variable
   LOGICAL,  PUBLIC, PROTECTED ::      EM =  .true.    ! Electromagnetic effects flag
   LOGICAL,  PUBLIC, PROTECTED ::  MHD_PD =  .true.    ! MHD pressure drift
@@ -55,7 +56,7 @@ CONTAINS
                          Na, ADIAB_E, ADIAB_I, q_i, tau_i, &
                          mu_x, mu_y, N_HD, HDz_h, mu_z, mu_p, mu_j, HYP_V, &
                          nu, k_gB, k_cB, lambdaD, beta, ExBrate, ExB_NL_CORRECTION,&
-                         ikxZF, ZFamp
+                         ikxZF, ZFrate, ZF_ONLY
 
     READ(lu_in,model)
 
@@ -114,6 +115,8 @@ CONTAINS
     CALL attach(fid, TRIM(str),    "MHD_PD",  MHD_PD)
     CALL attach(fid, TRIM(str),      "beta",    beta)
     CALL attach(fid, TRIM(str),   "ExBrate", ExBrate)
+    CALL attach(fid, TRIM(str),     "ikxZF",   ikxZF)
+    CALL attach(fid, TRIM(str),    "ZFrate",  ZFrate)
     CALL attach(fid, TRIM(str),   "ADIAB_E", ADIAB_E)
     CALL attach(fid, TRIM(str),   "ADIAB_I", ADIAB_I)
     CALL attach(fid, TRIM(str),     "tau_i",   tau_i)
diff --git a/src/nonlinear_mod.F90 b/src/nonlinear_mod.F90
index 62abc850..c11fa8f8 100644
--- a/src/nonlinear_mod.F90
+++ b/src/nonlinear_mod.F90
@@ -8,10 +8,10 @@ MODULE nonlinear
                          local_nj,ngj,jarray,jmax, local_nj_offset, dmax,&
                          kyarray, AA_y, local_nky, inv_Ny,&
                          total_nkx,kxarray, AA_x, inv_Nx,local_nx, Ny, &
-                         local_nz,ngz,zarray,nzgrid, deltakx, iky0, contains_kx0, contains_ky0
-  USE model,       ONLY : LINEARITY, EM, ikxZF, ZFamp, ExB_NL_CORRECTION
+                         local_nz,ngz,zarray,nzgrid, deltakx, deltaky, iky0, contains_kx0, contains_ky0
+  USE model,       ONLY : LINEARITY, EM, ikxZF, ZFrate, ZF_ONLY, ExB_NL_CORRECTION
   USE closure,     ONLY : evolve_mom, nmaxarray
-  USE prec_const,  ONLY : xp
+  USE prec_const,  ONLY : xp, imagu
   USE species,     ONLY : sqrt_tau_o_sigma
   USE time_integration, ONLY : updatetlevel
   USE ExB_shear_flow,   ONLY : ExB_NL_factor, inv_ExB_NL_factor
@@ -24,7 +24,7 @@ MODULE nonlinear
   COMPLEX(xp), DIMENSION(:,:), ALLOCATABLE :: F_cmpx, G_cmpx
   INTEGER :: in, is, p_int, j_int, n_int
   INTEGER :: smax
-  REAL(xp):: sqrt_p, sqrt_pp1
+  REAL(xp):: sqrt_p, sqrt_pp1, inv_kx_ZF
   PUBLIC  :: compute_Sapj, nonlinear_init
 
 CONTAINS
@@ -33,6 +33,7 @@ SUBROUTINE nonlinear_init
   IMPLICIT NONE
   ALLOCATE( F_cmpx(local_nky,total_nkx))
   ALLOCATE( G_cmpx(local_nky,total_nkx))
+  inv_kx_ZF = ikxZF/deltakx
 END SUBROUTINE nonlinear_init
 
 SUBROUTINE compute_Sapj
@@ -81,13 +82,14 @@ SUBROUTINE compute_nonlinear
                   F_cmpx(iky,ikx) = phi(iky,ikx,izi) * kernel(ia,ini,iky,ikx,izi,eo)
                 ENDDO
               ENDDO
-              ! Test to implement the ExB shearing as a additional zonal mode in the ES potential
-              IF(ikxZF .GT. 1) THEN
-                ikxExBp = ikxZF
-                ikxExBn = total_nkx - (ikxExBp-2)
+              ! ExB shearing as a additional zonal mode in the ES potential
+              IF(abs(ZFrate) .GT. 0) THEN
+                ikxExBp = ikxZF + 1
+                ikxExBn = total_nkx - (ikxExBp - 2)
+                IF(ZF_ONLY) F_cmpx = 0._xp
                 IF(contains_kx0 .AND. contains_ky0) THEN
-                  F_cmpx(iky0,ikxExBp) = F_cmpx(iky0,ikxExBp) + ZFamp * kernel(ia,ini,iky0,ikxExBp,izi,eo)
-                  F_cmpx(iky0,ikxExBn) = F_cmpx(iky0,ikxExBn) + ZFamp * kernel(ia,ini,iky0,ikxExBn,izi,eo)
+                  F_cmpx(iky0,ikxExBp) = F_cmpx(iky0,ikxExBp) + 8._xp*ZFrate*inv_kx_ZF * kernel(ia,ini,iky0,ikxExBp,izi,eo)
+                  F_cmpx(iky0,ikxExBn) = F_cmpx(iky0,ikxExBn) + 8._xp*ZFrate*inv_kx_ZF * kernel(ia,ini,iky0,ikxExBn,izi,eo)
                 ENDIF
               ENDIF
               ! Second convolution terms
-- 
GitLab