From 37641e0d94b6dfc1918e2d3b2a4353c02d3a6fa8 Mon Sep 17 00:00:00 2001
From: Antoine Hoffmann <antoine.hoffmann@epfl.ch>
Date: Wed, 21 Sep 2022 11:18:05 +0200
Subject: [PATCH] Clean and Added Nexc parameter, not working yet for Nexc > 1

---
 src/geometry_mod.F90 | 60 +++++++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 28 deletions(-)

diff --git a/src/geometry_mod.F90 b/src/geometry_mod.F90
index ff0e309e..74ec32c5 100644
--- a/src/geometry_mod.F90
+++ b/src/geometry_mod.F90
@@ -151,25 +151,18 @@ CONTAINS
 
     ! Derivative of the magnetic field strenght
       gradxB(iz,eo) = -COS(z) ! Gene put a factor hatB^2 or 1/hatR^2 in this
-      gradyB(iz,eo) = 0._dp
-      gradzB(iz,eo) = eps * SIN(z) / hatR(iz,eo) ! Gene put a factor hatB or 1/hatR in this
-
-    ! ! Curvature operator
-    !   DO iky = ikys, ikye
-    !     ky = kyarray(iky)
-    !      DO ikx= ikxs, ikxe
-    !        kx = kxarray(ikx)
-    !        Ckxky(iky, ikx, iz,eo) = (-SIN(z)*kx - ( COS(z) + (shear*z-alpha_MHD*SIN(z))*SIN(z) )*ky) * hatB(iz,eo) ! .. multiply by hatB to cancel the 1/ hatB factor in moments_eqs_rhs.f90 routine
-    !      ENDDO
-    !   ENDDO
+      gradyB(iz,eo) =  0._dp
+      gradzB(iz,eo) =  eps*SIN(z)/hatR(iz,eo)  ! Gene put a factor hatB or 1/hatR in this
+
     ! Curvature operator
     Gx =           (gxz(iz,eo) * gxy(iz,eo) - gxx(iz,eo) * gyz(iz,eo)) *eps*SIN(Z) ! Kx
-    Gy = -COS(Z) + (gxz(iz,eo) * gyy(iz,eo) - gxy(iz,eo) * gyz(iz,eo)) *eps*SIN(Z) ! Ky
+    Gy = -COS(z) + (gxz(iz,eo) * gyy(iz,eo) - gxy(iz,eo) * gyz(iz,eo)) *eps*SIN(Z) ! Ky
     DO iky = ikys, ikye
         ky = kyarray(iky)
          DO ikx= ikxs, ikxe
            kx = kxarray(ikx)
-           Ckxky(iky, ikx, iz,eo) = (Gx*kx + Gy*ky) * hatB(iz,eo) ! .. multiply by hatB to cancel the 1/ hatB factor in moments_eqs_rhs.f90 routine
+           Ckxky(iky, ikx, iz,eo) = (-SIN(z)*kx - COS(z)*ky -(shear*z-alpha_MHD*SIN(z))*SIN(z)*ky)* hatB(iz,eo) ! .. multiply by hatB to cancel the 1/ hatB factor in moments_eqs_rhs.f90 routine
+           ! Ckxky(iky, ikx, iz,eo) = (Gx*kx + Gy*ky) * hatB(iz,eo) ! .. multiply by hatB to cancel the 1/ hatB factor in moments_eqs_rhs.f90 routine
          ENDDO
       ENDDO
     ! coefficient in the front of parallel derivative
@@ -446,9 +439,15 @@ CONTAINS
 
  SUBROUTINE set_ikx_zBC_map
  IMPLICIT NONE
- REAL :: shift, kx_shift, kxmax_, kxmin_
+ REAL :: shift, kx_shift
+ ! For periodic CHI BC or 0 dirichlet
+ LOGICAL :: PERIODIC_CHI_BC = .false.
  ALLOCATE(ikx_zBC_R(ikys:ikye,ikxs:ikxe))
  ALLOCATE(ikx_zBC_L(ikys:ikye,ikxs:ikxe))
+
+ ! No periodic connection for extension of the domain
+ IF(Nexc .GT. 1) PERIODIC_CHI_BC = .false.
+
  !! No shear case (simple id mapping)
  !3            | 1    2    3    4    5    6 |  ky = 3 dky
  !2   ky       | 1    2    3    4    5    6 |  ky = 2 dky
@@ -463,25 +462,31 @@ CONTAINS
  ENDDO
  ! Modify connection map only at border of z
  IF(SHEARED) THEN
-   ! connection map BC of the RIGHT boundary (z=pi*Npol-dz)
+   ! connection map BC of the RIGHT boundary (z=pi*Npol-dz) (even NZ)
    !3            | 4    x    x    x    2    3 |  ky = 3 dky
    !2   ky       | 3    4    x    x    1    2 |  ky = 2 dky
    !1   A        | 2    3    4    x    6    1 |  ky = 1 dky
    !0   | -> kx  | 1____2____3____4____5____6 |  ky = 0 dky
    !kx =           0   0.1  0.2  0.3 -0.2 -0.1  (dkx=2pi*shear*npol*dky)
-   kxmax_ =  kx_max
+
+   ! connection map BC of the RIGHT boundary (z=pi*Npol-dz) (ODD NZ)
+   !3            | x    x    x    2    3 |  ky = 3 dky
+   !2   ky       | 3    x    x    1    2 |  ky = 2 dky
+   !1   A        | 2    3    x    5    1 |  ky = 1 dky
+   !0   | -> kx  | 1____2____3____4____5 |  ky = 0 dky
+   !kx =           0   0.1  0.2 -0.2 -0.1  (dkx=2pi*shear*npol*dky)
    IF(contains_zmax) THEN ! Check if the process is at the end of the FT
      DO iky = ikys,ikye
-       shift = 2._dp*PI*shear*kyarray(iky)*Npol*Nexc
+       shift = 2._dp*PI*shear*kyarray(iky)*Npol
          DO ikx = ikxs,ikxe
            kx_shift = kxarray(ikx) + shift
-           IF(kx_shift .GT. kxmax_) THEN ! outside of the frequ domain
+           ! We use EPSILON() to treat perfect equality case
+           IF( ((kx_shift-EPSILON(kx_shift)) .GT. kx_max) .AND. (.NOT. PERIODIC_CHI_BC) )THEN ! outside of the frequ domain
              ikx_zBC_R(iky,ikx) = -99
            ELSE
-             ikx_zBC_R(iky,ikx) = (ikx+iky)-1
-             IF(SINGLE_KY) ikx_zBC_R(iky,ikx) = (ikx+(iky+1))-1
+             ikx_zBC_R(iky,ikx) = ikx+(iky-1)*Nexc
              IF( ikx_zBC_R(iky,ikx) .GT. Nkx ) &
-             ikx_zBC_R(iky,ikx) = ikx_zBC_R(iky,ikx) - Nkx
+              ikx_zBC_R(iky,ikx) = ikx_zBC_R(iky,ikx) - Nkx
            ENDIF
          ENDDO
      ENDDO
@@ -492,19 +497,18 @@ CONTAINS
    !1   A        | 6    1    2    3    x    5 |  ky = 1 dky
    !0   | -> kx  | 1____2____3____4____5____6 |  ky = 0 dky
    !(e.g.) kx =    0   0.1  0.2  0.3 -0.2 -0.1  (dkx=2pi*shear*npol*dky)
-   kxmin_ = -kx_max+deltakx
    IF(contains_zmin) THEN ! Check if the process is at the start of the FT
      DO iky = ikys,ikye
-       shift = 2._dp*PI*shear*kyarray(iky)*Npol*Nexc
+       shift = 2._dp*PI*shear*kyarray(iky)*Npol
          DO ikx = ikxs,ikxe
            kx_shift = kxarray(ikx) - shift
-           IF( kx_shift .LT. kxmin_ ) THEN ! outside of the frequ domain
+           ! We use EPSILON() to treat perfect equality case
+           IF( ((kx_shift+EPSILON(kx_shift)) .LT. kx_min) .AND. (.NOT. PERIODIC_CHI_BC) ) THEN ! outside of the frequ domain
              ikx_zBC_L(iky,ikx) = -99
            ELSE
-             ikx_zBC_L(iky,ikx) = (ikx-iky)+1
-             IF(SINGLE_KY) ikx_zBC_L(iky,ikx) = (ikx-(iky+1))+1
-             IF( ikx_zBC_L(iky,ikx) .LE. 0 ) &
-             ikx_zBC_L(iky,ikx) = ikx_zBC_L(iky,ikx) + Nkx
+             ikx_zBC_L(iky,ikx) = ikx-(iky-1)*Nexc
+             IF( ikx_zBC_L(iky,ikx) .LT. 1 ) &
+              ikx_zBC_L(iky,ikx) = ikx_zBC_L(iky,ikx) + Nkx
            ENDIF
          ENDDO
      ENDDO
-- 
GitLab