From 8270b2c60d96beb044bc07c603837f40199ff3d5 Mon Sep 17 00:00:00 2001
From: Antoine <antoine.hoffmann@epfl.ch>
Date: Fri, 15 Sep 2023 11:42:45 +0200
Subject: [PATCH] introduce initial grid for mgrid

---
 src/grid_mod.F90 | 45 ++++++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 19 deletions(-)

diff --git a/src/grid_mod.F90 b/src/grid_mod.F90
index f5a30438..823c3de6 100644
--- a/src/grid_mod.F90
+++ b/src/grid_mod.F90
@@ -23,15 +23,17 @@ MODULE grid
   ! Grid arrays
   INTEGER,  DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: parray,  parray_full
   INTEGER,  DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: jarray,  jarray_full
-  REAL(xp), DIMENSION(:,:), ALLOCATABLE, PUBLIC,PROTECTED :: kxarray ! ExB shear makes it ky dependant
+  REAL(xp), DIMENSION(:,:), ALLOCATABLE, PUBLIC,PROTECTED :: kxarray  ! moving kx grid (ExB)
+  REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: kxarray0 ! inirial kyarray
   REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: kxarray_full
   REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: xarray
   REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: kyarray, kyarray_full
   REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: ikyarray, inv_ikyarray !mode indices arrays
   REAL(xp), DIMENSION(:,:), ALLOCATABLE, PUBLIC,PROTECTED :: zarray
   REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: zarray_full
-  REAL(xp), DIMENSION(:,:,:,:), ALLOCATABLE, PUBLIC,PROTECTED :: kparray !kperp
-  REAL(xp), DIMENSION(:,:,:,:), ALLOCATABLE, PUBLIC,PROTECTED :: kp2array !kperp^2
+  REAL(xp), DIMENSION(:,:,:,:), ALLOCATABLE, PUBLIC,PROTECTED :: kparray  !moving kperp grid 
+  REAL(xp), DIMENSION(:,:,:,:), ALLOCATABLE, PUBLIC,PROTECTED :: kparray0 !initial kperp grid
+  REAL(xp), DIMENSION(:,:,:,:), ALLOCATABLE, PUBLIC,PROTECTED :: kp2array !moving kperp^2 grid
   ! Kronecker delta for p=0, p=1, p=2, j=0, j=1
   REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: kroneck_p0, kroneck_p1, kroneck_p2, kroneck_p3
   REAL(xp), DIMENSION(:),   ALLOCATABLE, PUBLIC,PROTECTED :: kroneck_j0, kroneck_j1
@@ -229,6 +231,7 @@ CONTAINS
     local_nkx        = ikxe - ikxs + 1
     local_nkx_offset = ikxs - 1
     ALLOCATE(kxarray_full(total_nkx))
+    ALLOCATE(kxarray0(local_Nkx))
     ALLOCATE(kxarray(local_nky,local_Nkx))
     ALLOCATE(AA_x(local_nkx))
     !!---------------- RADIAL X GRID (only for Fourier routines)
@@ -281,6 +284,7 @@ CONTAINS
     ENDDO
     !!---------------- Kperp grid
     CALL allocate_array( kparray, 1,local_nky, 1,local_nkx, 1,local_nz+ngz, 1,nzgrid)
+    CALL allocate_array(kparray0, 1,local_nky, 1,local_nkx, 1,local_nz+ngz, 1,nzgrid)
     CALL allocate_array(kp2array, 1,local_nky, 1,local_nkx, 1,local_nz+ngz, 1,nzgrid)
   END SUBROUTINE
   !!!! GRID REPRESENTATION
@@ -521,6 +525,7 @@ CONTAINS
       local_kxmax = 0._xp
       DO iky = 1,local_nky
         DO ikx = 1,local_nkx
+          kxarray0(ikx)    = kxarray_full(ikx+local_nkx_offset)
           kxarray(iky,ikx) = kxarray_full(ikx+local_nkx_offset)
           ! Finding kx=0
           IF (kxarray(1,ikx) .EQ. 0) THEN
@@ -561,10 +566,12 @@ CONTAINS
   !----------- Radial x grid
   ! used only for the computation  of the ExB shear NL factor
   SUBROUTINE set_xgrid
-    USE prec_const
+    USE prec_const, ONLY: xp, pi
     IMPLICIT NONE
     INTEGER :: ix
-    deltax  = Lx/REAL(Nx,xp) ! periodic donc pas Lx/(Nx-1)  
+    REAL    :: L_
+    L_     = 2._xp*pi/deltakx
+    deltax = L_/REAL(Nx,xp)
     ! full xgrid
     DO ix = 1,Nx
       xarray(ix) = REAL(ix-1,xp)*deltax
@@ -651,36 +658,36 @@ CONTAINS
             ! this factor comes from $b_a$ argument in the Bessel. Kperp is not used otherwise.
             kp2array(iky, ikx, iz, eo) = &
               (gxx(iz,eo)*kx**2 + 2._xp*gxy(iz,eo)*kx*ky + gyy(iz,eo)*ky**2)*inv_hatB2(iz,eo)
-            kparray(iky, ikx, iz, eo)  = SQRT(kp2array(iky, ikx, iz, eo))
-          ENDDO
+
+            kparray (iky, ikx, iz, eo)  = SQRT(kp2array(iky, ikx, iz, eo))
+            kparray0(iky, ikx, iz, eo)  = SQRT(kp2array(iky, ikx, iz, eo))
+            ENDDO
         ENDDO
       ENDDO
     ENDDO
     two_third_kpmax = 2._xp/3._xp * MAXVAL(kparray)
   END SUBROUTINE
 
-  SUBROUTINE update_grids (sky,gxx,gxy,inv_hatB2)
+  SUBROUTINE update_grids (dkx_ExB,gxx,gxy,gyy,inv_hatB2)
     IMPLICIT NONE
-    REAL(xp), DIMENSION(local_nky),INTENT(IN) :: sky ! ExB grid shift
-    REAL(xp), DIMENSION(local_nz+ngz,nzgrid), INTENT(IN) :: gxx,gxy,inv_hatB2
+    REAL(xp), DIMENSION(local_nky),INTENT(IN) :: dkx_ExB ! ExB correction dkx = gamma_E ky dtshift
+    REAL(xp), DIMENSION(local_nz+ngz,nzgrid), INTENT(IN) :: gxx,gxy,gyy,inv_hatB2
     INTEGER     :: eo,iz,iky,ikx
     REAL(xp)    :: kx, ky, skp2
     ! Update the kx grid
     DO iky = 1,local_nky
-      DO ikx = 1,local_nkx
-        kxarray(iky,ikx) = kxarray(iky,ikx) + sky(iky)
+      DO ikx = 1,total_Nkx
+        kxarray(iky,ikx) = kxarray0(ikx) + dkx_ExB(iky)
       ENDDO
     ENDDO
     ! Update the kperp grid
     DO eo = 1,nzgrid
       DO iz = 1,local_nz+ngz
-        DO iky = 1,local_nky
-          ky = kyarray(iky)
-          DO ikx = 1,local_nkx
-            kx   = kxarray(iky,ikx)
-            ! shift in kp obtained from kp2* = kp2 + skp2
-            skp2 = sky(iky)*inv_hatB2(iz,eo)*(gxx(iz,eo)*(2._xp*kx+sky(iky)) +gxy(iz,eo)*ky)
-            kp2array(iky, ikx, iz, eo) = kp2array(iky, ikx, iz, eo) + skp2
+        DO ikx = 1,local_nkx
+          DO iky = 1,local_nky
+            ky = kyarray(iky)
+            kx = kxarray(iky,ikx)
+            kp2array(iky,ikx,iz,eo) = (gxx(iz,eo)*kx**2 + 2._xp*gxy(iz,eo)*kx*ky + gyy(iz,eo)*ky**2)*inv_hatB2(iz,eo)
           ENDDO
         ENDDO
       ENDDO
-- 
GitLab