From 5d9e3a380a14c07a3f53346f26d28410b5ad5da2 Mon Sep 17 00:00:00 2001
From: Antoine Hoffmann <antoine.hoffmann@epfl.ch>
Date: Sun, 19 Mar 2023 18:49:32 +0100
Subject: [PATCH] Mpi parallelization looks fine, need to check adiab e

---
 src/calculus_mod.F90       | 10 +++-------
 src/geometry_mod.F90       |  8 ++++----
 src/grid_mod.F90           | 19 ++++++++++++++-----
 src/moments_eq_rhs_mod.F90 | 30 +++++++++++++++---------------
 src/parallel_mod.F90       |  1 -
 src/processing_mod.F90     | 10 +++++-----
 src/solve_EM_fields.F90    |  4 ++--
 7 files changed, 43 insertions(+), 39 deletions(-)

diff --git a/src/calculus_mod.F90 b/src/calculus_mod.F90
index f36ce8c2..613ec92e 100644
--- a/src/calculus_mod.F90
+++ b/src/calculus_mod.F90
@@ -170,7 +170,7 @@ CONTAINS
 
 END SUBROUTINE interp_z
 
-SUBROUTINE simpson_rule_z(local_nz,dz,f,intf)
+SUBROUTINE simpson_rule_z(local_nz,zweights_SR,f,intf)
   ! integrate f(z) over z using the simpon's rule. Assume periodic boundary conditions (f(ize+1) = f(izs))
   !from molix BJ Frei
   USE prec_const, ONLY: dp, onethird
@@ -178,7 +178,7 @@ SUBROUTINE simpson_rule_z(local_nz,dz,f,intf)
   USE mpi
   implicit none
   INTEGER, INTENT(IN) :: local_nz
-  REAL(dp),INTENT(IN) :: dz
+  REAL(dp),   dimension(local_nz), intent(in) :: zweights_SR
   complex(dp),dimension(local_nz), intent(in) :: f
   COMPLEX(dp), intent(out) :: intf
   COMPLEX(dp)              :: buffer, local_int
@@ -186,11 +186,7 @@ SUBROUTINE simpson_rule_z(local_nz,dz,f,intf)
   ! Buil local sum using the weights of composite Simpson's rule
   local_int = 0._dp
   DO iz = 1,local_nz
-    IF(MODULO(iz,2) .EQ. 1) THEN ! odd iz
-      local_int = local_int + 2._dp*onethird*dz*f(iz)
-    ELSE ! even iz
-      local_int = local_int + 4._dp*onethird*dz*f(iz)
-    ENDIF
+      local_int = local_int + zweights_SR(iz)*f(iz)
   ENDDO
   buffer = local_int
   root = 0
diff --git a/src/geometry_mod.F90 b/src/geometry_mod.F90
index 6afb1fed..c354536f 100644
--- a/src/geometry_mod.F90
+++ b/src/geometry_mod.F90
@@ -93,7 +93,8 @@ CONTAINS
   END SUBROUTINE geometry_readinputs
 
   subroutine eval_magnetic_geometry
-    USE grid,     ONLY: total_nky, total_nz, local_nkx, local_nky, local_nz, Ngz, kxarray, kyarray, set_kparray, nzgrid, deltaz
+    USE grid,     ONLY: total_nky, total_nz, local_nkx, local_nky, local_nz, Ngz,&
+                        kxarray, kyarray, set_kparray, nzgrid, zweights_SR, ieven
     USE basic,    ONLY: speak
     USE miller,   ONLY: set_miller_parameters, get_miller
     USE calculus, ONLY: simpson_rule_z
@@ -165,8 +166,8 @@ CONTAINS
     CALL set_ikx_zBC_map
     !
     ! Compute the inverse z integrated Jacobian (useful for flux averaging)
-    integrant = Jacobian(1+ngz/2:local_nz+ngz/2,1) ! Convert into complex array
-    CALL simpson_rule_z(local_nz,deltaz,integrant,iInt_Jacobian)
+    integrant = Jacobian((1+ngz/2):(local_nz+ngz/2),ieven) ! Convert into complex array
+    CALL simpson_rule_z(local_nz,zweights_SR,integrant,iInt_Jacobian)
     iInt_Jacobian = 1._dp/iInt_Jacobian ! reverse it
   END SUBROUTINE eval_magnetic_geometry
   !
@@ -220,7 +221,6 @@ CONTAINS
 
    ENDDO
   ENDDO
-
   END SUBROUTINE eval_salpha_geometry
   !
   !--------------------------------------------------------------------------------
diff --git a/src/grid_mod.F90 b/src/grid_mod.F90
index 513fd0a2..5a1604b6 100644
--- a/src/grid_mod.F90
+++ b/src/grid_mod.F90
@@ -504,10 +504,10 @@ CONTAINS
     local_nz_offset = izs - 1
     ! Ghosts boundaries (depend on the order of z operators)
     IF(Nz .EQ. 1) THEN
-      Ngz              = 0
+      ngz              = 0
       zarray_full(izs) = 0
     ELSEIF(Nz .GE. 4) THEN
-      Ngz =4
+      ngz =4
     ELSE
       ERROR STOP '>> ERROR << Nz is not appropriate!!'
     ENDIF
@@ -520,11 +520,11 @@ CONTAINS
       displs_nz(in+1) = istart-1
     ENDDO
     ! Local z array
-    ALLOCATE(zarray(local_nz+Ngz,nzgrid))
+    ALLOCATE(zarray(local_nz+ngz,nzgrid))
     !! interior point loop
-    DO iz = 1,total_nz
+    DO iz = 1,local_nz
       DO eo = 1,nzgrid
-        zarray(iz+ngz/2,eo) = zarray_full(iz) + REAL(eo-1,dp)*grid_shift
+        zarray(iz+ngz/2,eo) = zarray_full(iz+local_nz_offset) + REAL(eo-1,dp)*grid_shift
       ENDDO
     ENDDO
     CALL allocate_array(local_zmax,1,nzgrid)
@@ -562,6 +562,15 @@ CONTAINS
      IF(mod(Nz,2) .NE. 0 ) THEN
         ERROR STOP '>> ERROR << Nz must be an even number for Simpson integration rule !!!!'
      ENDIF
+    ! local weights for Simpson rule
+    ALLOCATE(zweights_SR(local_nz))
+    DO iz = 1,local_nz
+      IF(MODULO(iz+local_nz_offset,2) .EQ. 1) THEN ! odd iz
+        zweights_SR(iz) = onethird*deltaz*2._dp
+      ELSE ! even iz
+        zweights_SR(iz) = onethird*deltaz*4._dp
+      ENDIF
+    ENDDO
   END SUBROUTINE set_zgrid
 
   SUBROUTINE set_kparray(gxx, gxy, gyy,hatB)
diff --git a/src/moments_eq_rhs_mod.F90 b/src/moments_eq_rhs_mod.F90
index 29c658c5..eecef868 100644
--- a/src/moments_eq_rhs_mod.F90
+++ b/src/moments_eq_rhs_mod.F90
@@ -159,21 +159,21 @@ SUBROUTINE compute_moments_eq_rhs
   CALL cpu_time(t1_rhs)
   tc_rhs = tc_rhs + (t1_rhs-t0_rhs)
 
-  !     print*,'sumabs moments i', SUM(ABS(moments(1,:,:,:,:,:,updatetlevel)))
-  !     print*,'moment rhs i 221', moments_rhs(1,1,1,2,2,1,updatetlevel)
-  !     print*,'sum real nadiabe', SUM(REAL(nadiab_moments(2,:,:,:,:,:)))
-  !     print*,'sumreal momrhs i', SUM(REAL(moments_rhs(1,:,:,:,:,:,:)))
-  !     print*,'sumimag momrhs i', SUM(IMAG(moments_rhs(1,:,:,:,:,:,:)))
-  !     print*,'sumreal phi     ', SUM(REAL(phi(:,:,(1+ngz/2):(local_nz+ngz/2))))
-  !     print*,'sumimag phi     ', SUM(IMAG(phi(:,:,(1+ngz/2):(local_nz+ngz/2))))
-  !     print*,'phi(2,2,1)      ', phi(2,2,1+ngz/2)
-  !     print*,'sumreal ddznipj ', SUM(REAL(ddz_napj(1,:,:,:,:,:)))
-  !     print*,'sumimag ddznipj ', SUM(IMAG(ddz_napj(1,:,:,:,:,:)))
-  !     print*,'        ddznipj  ',(ddz_napj(1,2+ngp/2,2+ngj/2,2,2,1))
-  !     print*,'sumreal Capj    ', SUM(REAL(Capj(1,:,:,:,:,:)))
-  !     print*,'---'
-  !     IF(updatetlevel .EQ. 4) stop
-  ! ! stop
+      ! print*,'sumabs moments i', SUM(ABS(moments(1,:,:,:,:,:,updatetlevel)))
+      ! print*,'moment rhs i 221', moments_rhs(1,1,1,2,2,1,updatetlevel)
+      ! print*,'sum real nadiabe', SUM(REAL(nadiab_moments(2,:,:,:,:,:)))
+      ! print*,'sumreal momrhs i', SUM(REAL(moments_rhs(1,:,:,:,:,:,:)))
+      ! print*,'sumimag momrhs i', SUM(IMAG(moments_rhs(1,:,:,:,:,:,:)))
+      ! print*,'sumreal phi     ', SUM(REAL(phi(:,:,(1+ngz/2):(local_nz+ngz/2))))
+      ! print*,'sumimag phi     ', SUM(IMAG(phi(:,:,(1+ngz/2):(local_nz+ngz/2))))
+      ! print*,'phi(2,2,1)      ', phi(2,2,1+ngz/2)
+      ! print*,'sumreal ddznipj ', SUM(REAL(ddz_napj(1,:,:,:,:,:)))
+      ! print*,'sumimag ddznipj ', SUM(IMAG(ddz_napj(1,:,:,:,:,:)))
+      ! print*,'        ddznipj  ',(ddz_napj(1,2+ngp/2,2+ngj/2,2,2,1))
+      ! print*,'sumreal Capj    ', SUM(REAL(Capj(1,:,:,:,:,:)))
+      ! print*,'---'
+      ! IF(updatetlevel .EQ. 4) stop
+  ! stop
 
 END SUBROUTINE compute_moments_eq_rhs
 
diff --git a/src/parallel_mod.F90 b/src/parallel_mod.F90
index a9f3df34..e4469d0f 100644
--- a/src/parallel_mod.F90
+++ b/src/parallel_mod.F90
@@ -47,7 +47,6 @@ CONTAINS
     INTEGER, PARAMETER :: ndims=3 ! p, kx and z
     INTEGER, DIMENSION(ndims) :: dims=0, coords=0
     LOGICAL :: periods(ndims) = .FALSE., reorder=.FALSE.
-    LOGICAL :: com_log(ndims) = .FALSE.
     CHARACTER(len=32) :: str
     INTEGER :: nargs, i, l
     CALL MPI_INIT(ierr)
diff --git a/src/processing_mod.F90 b/src/processing_mod.F90
index 65bfea95..47ede3ef 100644
--- a/src/processing_mod.F90
+++ b/src/processing_mod.F90
@@ -7,7 +7,7 @@ MODULE processing
       jarray,jmax,ij0, dmax,&
       kyarray, AA_y,&
       kxarray, AA_x,&
-      zarray, deltaz, ieven, iodd, inv_deltaz
+      zarray, zweights_SR, ieven, iodd, inv_deltaz
    USE fields,           ONLY: moments, phi, psi
    USE array,            ONLY : kernel, nadiab_moments, &
       ddz_napj, ddzND_Napj, interp_napj,&
@@ -81,7 +81,7 @@ CONTAINS
             ENDDO
          ENDIF
          ! Integrate over z
-         call simpson_rule_z(local_nz,deltaz,integrant,integral)
+         call simpson_rule_z(local_nz,zweights_SR,integrant,integral)
          ! Get process local gyrocenter flux with a factor two to account for the negative ky modes
          gflux_local = 2._dp*integral*iInt_Jacobian
          !
@@ -120,7 +120,7 @@ CONTAINS
             ENDDO
          ENDIF
          ! Integrate over z
-         call simpson_rule_z(local_nz,deltaz,integrant,integral)
+         call simpson_rule_z(local_nz,zweights_SR,integrant,integral)
          ! Get process local particle flux with a factor two to account for the negative ky modes
          pflux_local = 2._dp*integral*iInt_Jacobian
          !!!!---------- Sum over all processes ----------
@@ -194,7 +194,7 @@ CONTAINS
                         ini = in + ngj/2 !interior index for ghosted arrays
                         n_dp = jarray(ini)
                         integrant(iz) = integrant(iz) &
-                           +Jacobian(izi,iodd)*tau(ia)*sqrt_tau_o_sigma(ia)*imagu*kyarray(iky)*CONJG(psi(iky,ikx,izi))&
+                            +Jacobian(izi,iodd)*tau(ia)*sqrt_tau_o_sigma(ia)*imagu*kyarray(iky)*CONJG(psi(iky,ikx,izi))&
                            *kernel(ia,ini,iky,ikx,izi,iodd)*(&
                            0.5_dp*SQRT2*SQRT3*moments(ia,ip3,ini  ,iky,ikx,izi,updatetlevel)&
                                       +1.5_dp*moments(ia,ip1,ini  ,iky,ikx,izi,updatetlevel)&
@@ -210,7 +210,7 @@ CONTAINS
          ! integrant(iz) = integrant(iz) + tau_i*imagu*ky_&
          ! *CONJG(phi(iky,ikx,iz))*phi(iky,ikx,iz) * HF_phi_correction_operator(iky,ikx,iz)
          ! Integrate over z
-         call simpson_rule_z(local_nz,deltaz,integrant,integral)
+         call simpson_rule_z(local_nz,zweights_SR,integrant,integral)
          ! Double it for taking into account the other half plane
          hflux_local = 2._dp*integral*iInt_Jacobian
          buffer(2)   = REAL(hflux_local,dp)
diff --git a/src/solve_EM_fields.F90 b/src/solve_EM_fields.F90
index db3b3dd4..a365937d 100644
--- a/src/solve_EM_fields.F90
+++ b/src/solve_EM_fields.F90
@@ -18,7 +18,7 @@ CONTAINS
     USE array,            ONLY: kernel, inv_poisson_op, inv_pol_ion
     USE fields,           ONLY: phi, moments
     USE grid,             ONLY: local_na, local_nky, local_nkx, local_nz,ngz, SOLVE_POISSON,&
-                                kyarray, contains_kx0, contains_ky0,ikx0,iky0, deltaz, ieven,&
+                                kyarray, contains_kx0, contains_ky0,ikx0,iky0, zweights_SR, ieven,&
                                 ip0, total_nj, ngj
     USE calculus,         ONLY: simpson_rule_z
     USE parallel,         ONLY: manual_3D_bcast
@@ -61,7 +61,7 @@ CONTAINS
               IF(kyarray(iky).EQ.0._dp) THEN ! take ky=0 mode (y-average)
                 ! Prepare integrant for z-average
                 integrant(iz) = Jacobian(iz+ngz/2,ieven)*rho(iz)*inv_pol_ion(iky,ikx,iz)
-                call simpson_rule_z(local_nz,deltaz,integrant,intf_) ! get the flux averaged phi
+                call simpson_rule_z(local_nz,zweights_SR,integrant,intf_) ! get the flux averaged phi
                 fsa_phi = intf_ * iInt_Jacobian !Normalize by 1/int(Jxyz)dz
               ENDIF
               rho(iz) = rho(iz) + fsa_phi
-- 
GitLab