From 6d12f9ca8b5b118fd3e5fd71c0a490e9bed28163 Mon Sep 17 00:00:00 2001
From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch>
Date: Mon, 29 Nov 2021 11:04:48 +0100
Subject: [PATCH] bug fix

---
 src/collision_mod.F90 | 199 +++++++++++++++++++-----------------------
 1 file changed, 90 insertions(+), 109 deletions(-)

diff --git a/src/collision_mod.F90 b/src/collision_mod.F90
index bc80eb80..835c9221 100644
--- a/src/collision_mod.F90
+++ b/src/collision_mod.F90
@@ -629,29 +629,66 @@ CONTAINS
       CALL allocate_array(  CiepjF_kp, 1,(pmaxe+1)*(jmaxe+1), 1,(pmaxe+1)*(jmaxe+1), ikps_C,ikpe_C)
 
       DO ikp = ikps_C,ikpe_C ! Loop over everz kperp values
-        ! we put zeros if kp>2/3kpmax because thoses frequencies are filtered through AA
-        IF( (kp_grid_mat(ikp) .GT. two_third_kpmax) .AND. (LINEARITY .NE. 'linear')) THEN
-          CiepjT_kp(:,:,ikp) = 0._dp
-          CiepjF_kp(:,:,ikp) = 0._dp
-          CeipjT_kp(:,:,ikp) = 0._dp
-          CeipjF_kp(:,:,ikp) = 0._dp
-          Ceepj__kp(:,:,ikp) = 0._dp
-          Ciipj__kp(:,:,ikp) = 0._dp
+        ! Kperp value in string format to select in cosolver hdf5 file
+        IF (gyrokin_CO) THEN
+          write(ikp_string,'(i5.5)') ikp-1
         ELSE
-          ! Kperp value in string format
-          IF (gyrokin_CO) THEN
-            write(ikp_string,'(i5.5)') ikp-1
-          ELSE
-            write(ikp_string,'(i5.5)') 0
-          ENDIF
-          !!!!!!!!!!!! E-E matrices !!!!!!!!!!!!
-          ! get the self electron colision matrix
-          ! Allocate space for storing full collision matrix
-          CALL allocate_array(  Ceepj_full, 1,(pdime+1)*(jdime+1), 1,(pdime+1)*(jdime+1))
-          ! Naming of the array to load (kperp dependant)
-          WRITE(var_name,'(a,a)') TRIM(ADJUSTL(ikp_string)),'/Caapj/Ceepj'
-          CALL getarr(fid, var_name, Ceepj_full) ! get array (moli format)
-          ! Fill sub array with the usefull polynmial degrees only
+          write(ikp_string,'(i5.5)') 0
+        ENDIF
+        !!!!!!!!!!!! E-E matrices !!!!!!!!!!!!
+        ! get the self electron colision matrix
+        ! Allocate space for storing full collision matrix
+        CALL allocate_array(  Ceepj_full, 1,(pdime+1)*(jdime+1), 1,(pdime+1)*(jdime+1))
+        ! Naming of the array to load (kperp dependant)
+        WRITE(var_name,'(a,a)') TRIM(ADJUSTL(ikp_string)),'/Caapj/Ceepj'
+        CALL getarr(fid, var_name, Ceepj_full) ! get array (moli format)
+        ! Fill sub array with the usefull polynmial degrees only
+        DO ip_e = 0,pmaxe ! Loop over rows
+        DO ij_e = 0,jmaxe
+              irow_sub  = (jmaxe +1)*ip_e + ij_e +1
+              irow_full = (jdime +1)*ip_e + ij_e +1
+              DO il_e = 0,pmaxe ! Loop over columns
+              DO ik_e = 0,jmaxe
+                    icol_sub  = (jmaxe +1)*il_e + ik_e +1
+                    icol_full = (jdime +1)*il_e + ik_e +1
+                    Ceepj__kp (irow_sub,icol_sub,ikp) = Ceepj_full (irow_full,icol_full)
+              ENDDO
+              ENDDO
+        ENDDO
+        ENDDO
+        DEALLOCATE(Ceepj_full)
+
+        !!!!!!!!!!!!!!! I-I matrices !!!!!!!!!!!!!!
+        ! get the self electron colision matrix
+        CALL allocate_array(  Ciipj_full, 1,(pdimi+1)*(jdimi+1), 1,(pdimi+1)*(jdimi+1))
+        WRITE(var_name,'(a,a,a)') TRIM(ADJUSTL(ikp_string)),'/Caapj/Ciipj'
+        CALL getarr(fid, var_name, Ciipj_full) ! get array (moli format)
+        ! Fill sub array with only usefull polynmials degree
+        DO ip_i = 0,Pmaxi ! Loop over rows
+        DO ij_i = 0,Jmaxi
+              irow_sub  = (Jmaxi +1)*ip_i + ij_i +1
+              irow_full = (jdimi +1)*ip_i + ij_i +1
+              DO il_i = 0,Pmaxi ! Loop over columns
+              DO ik_i = 0,Jmaxi
+                    icol_sub  = (Jmaxi +1)*il_i + ik_i +1
+                    icol_full = (jdimi +1)*il_i + ik_i +1
+                    Ciipj__kp (irow_sub,icol_sub,ikp) = Ciipj_full (irow_full,icol_full)
+              ENDDO
+              ENDDO
+        ENDDO
+        ENDDO
+        DEALLOCATE(Ciipj_full)
+
+        IF(interspecies) THEN ! Pitch angle is only applied on like-species
+          !!!!!!!!!!!!!!! E-I matrices !!!!!!!!!!!!!!
+          ! Get test and field e-i collision matrices
+          CALL allocate_array( CeipjT_full, 1,(pdime+1)*(jdime+1), 1,(pdime+1)*(jdime+1))
+          CALL allocate_array( CeipjF_full, 1,(pdime+1)*(jdime+1), 1,(pdimi+1)*(jdimi+1))
+          WRITE(var_name,'(a,a)') TRIM(ADJUSTL(ikp_string)),'/Ceipj/CeipjT'
+          CALL getarr(fid, var_name, CeipjT_full)
+          WRITE(var_name,'(a,a)') TRIM(ADJUSTL(ikp_string)),'/Ceipj/CeipjF'
+          CALL getarr(fid, var_name, CeipjF_full)
+          ! Fill sub array with only usefull polynmials degree
           DO ip_e = 0,pmaxe ! Loop over rows
           DO ij_e = 0,jmaxe
                 irow_sub  = (jmaxe +1)*ip_e + ij_e +1
@@ -660,18 +697,29 @@ CONTAINS
                 DO ik_e = 0,jmaxe
                       icol_sub  = (jmaxe +1)*il_e + ik_e +1
                       icol_full = (jdime +1)*il_e + ik_e +1
-                      Ceepj__kp (irow_sub,icol_sub,ikp) = Ceepj_full (irow_full,icol_full)
+                      CeipjT_kp(irow_sub,icol_sub,ikp) = CeipjT_full(irow_full,icol_full)
+                ENDDO
+                ENDDO
+                DO il_i = 0,pmaxi ! Loop over columns
+                DO ik_i = 0,jmaxi
+                      icol_sub  = (Jmaxi +1)*il_i + ik_i +1
+                      icol_full = (jdimi +1)*il_i + ik_i +1
+                      CeipjF_kp(irow_sub,icol_sub,ikp) = CeipjF_full(irow_full,icol_full)
                 ENDDO
                 ENDDO
           ENDDO
           ENDDO
-          DEALLOCATE(Ceepj_full)
-
-          !!!!!!!!!!!!!!! I-I matrices !!!!!!!!!!!!!!
-          ! get the self electron colision matrix
-          CALL allocate_array(  Ciipj_full, 1,(pdimi+1)*(jdimi+1), 1,(pdimi+1)*(jdimi+1))
-          WRITE(var_name,'(a,a,a)') TRIM(ADJUSTL(ikp_string)),'/Caapj/Ciipj'
-          CALL getarr(fid, var_name, Ciipj_full) ! get array (moli format)
+          DEALLOCATE(CeipjF_full)
+          DEALLOCATE(CeipjT_full)
+
+          !!!!!!!!!!!!!!! I-E matrices !!!!!!!!!!!!!!
+          ! get the Test and Back field electron ion collision matrix
+          CALL allocate_array( CiepjT_full, 1,(pdimi+1)*(jdimi+1), 1,(pdimi+1)*(jdimi+1))
+          CALL allocate_array( CiepjF_full, 1,(pdimi+1)*(jdimi+1), 1,(pdime+1)*(jdime+1))
+          WRITE(var_name,'(a,a,a)') TRIM(ADJUSTL(ikp_string)),'/Ciepj/CiepjT'
+          CALL getarr(fid, var_name, CiepjT_full)
+          WRITE(var_name,'(a,a,a)') TRIM(ADJUSTL(ikp_string)),'/Ciepj/CiepjF'
+          CALL getarr(fid, var_name, CiepjF_full)
           ! Fill sub array with only usefull polynmials degree
           DO ip_i = 0,Pmaxi ! Loop over rows
           DO ij_i = 0,Jmaxi
@@ -681,80 +729,22 @@ CONTAINS
                 DO ik_i = 0,Jmaxi
                       icol_sub  = (Jmaxi +1)*il_i + ik_i +1
                       icol_full = (jdimi +1)*il_i + ik_i +1
-                      Ciipj__kp (irow_sub,icol_sub,ikp) = Ciipj_full (irow_full,icol_full)
+                      CiepjT_kp(irow_sub,icol_sub,ikp) = CiepjT_full(irow_full,icol_full)
+                ENDDO
+                ENDDO
+                DO il_e = 0,pmaxe ! Loop over columns
+                DO ik_e = 0,jmaxe
+                      icol_sub  = (jmaxe +1)*il_e + ik_e +1
+                      icol_full = (jdime +1)*il_e + ik_e +1
+                      CiepjF_kp(irow_sub,icol_sub,ikp) = CiepjF_full(irow_full,icol_full)
                 ENDDO
                 ENDDO
           ENDDO
           ENDDO
-          DEALLOCATE(Ciipj_full)
-
-          IF(interspecies) THEN ! Pitch angle is only applied on like-species
-            !!!!!!!!!!!!!!! E-I matrices !!!!!!!!!!!!!!
-            ! Get test and field e-i collision matrices
-            CALL allocate_array( CeipjT_full, 1,(pdime+1)*(jdime+1), 1,(pdime+1)*(jdime+1))
-            CALL allocate_array( CeipjF_full, 1,(pdime+1)*(jdime+1), 1,(pdimi+1)*(jdimi+1))
-            WRITE(var_name,'(a,a)') TRIM(ADJUSTL(ikp_string)),'/Ceipj/CeipjT'
-            CALL getarr(fid, var_name, CeipjT_full)
-            WRITE(var_name,'(a,a)') TRIM(ADJUSTL(ikp_string)),'/Ceipj/CeipjF'
-            CALL getarr(fid, var_name, CeipjF_full)
-            ! Fill sub array with only usefull polynmials degree
-            DO ip_e = 0,pmaxe ! Loop over rows
-            DO ij_e = 0,jmaxe
-                  irow_sub  = (jmaxe +1)*ip_e + ij_e +1
-                  irow_full = (jdime +1)*ip_e + ij_e +1
-                  DO il_e = 0,pmaxe ! Loop over columns
-                  DO ik_e = 0,jmaxe
-                        icol_sub  = (jmaxe +1)*il_e + ik_e +1
-                        icol_full = (jdime +1)*il_e + ik_e +1
-                        CeipjT_kp(irow_sub,icol_sub,ikp) = CeipjT_full(irow_full,icol_full)
-                  ENDDO
-                  ENDDO
-                  DO il_i = 0,pmaxi ! Loop over columns
-                  DO ik_i = 0,jmaxi
-                        icol_sub  = (Jmaxi +1)*il_i + ik_i +1
-                        icol_full = (jdimi +1)*il_i + ik_i +1
-                        CeipjF_kp(irow_sub,icol_sub,ikp) = CeipjF_full(irow_full,icol_full)
-                  ENDDO
-                  ENDDO
-            ENDDO
-            ENDDO
-            DEALLOCATE(CeipjF_full)
-            DEALLOCATE(CeipjT_full)
-
-            !!!!!!!!!!!!!!! I-E matrices !!!!!!!!!!!!!!
-            ! get the Test and Back field electron ion collision matrix
-            CALL allocate_array( CiepjT_full, 1,(pdimi+1)*(jdimi+1), 1,(pdimi+1)*(jdimi+1))
-            CALL allocate_array( CiepjF_full, 1,(pdimi+1)*(jdimi+1), 1,(pdime+1)*(jdime+1))
-            WRITE(var_name,'(a,a,a)') TRIM(ADJUSTL(ikp_string)),'/Ciepj/CiepjT'
-            CALL getarr(fid, var_name, CiepjT_full)
-            WRITE(var_name,'(a,a,a)') TRIM(ADJUSTL(ikp_string)),'/Ciepj/CiepjF'
-            CALL getarr(fid, var_name, CiepjF_full)
-            ! Fill sub array with only usefull polynmials degree
-            DO ip_i = 0,Pmaxi ! Loop over rows
-            DO ij_i = 0,Jmaxi
-                  irow_sub  = (Jmaxi +1)*ip_i + ij_i +1
-                  irow_full = (jdimi +1)*ip_i + ij_i +1
-                  DO il_i = 0,Pmaxi ! Loop over columns
-                  DO ik_i = 0,Jmaxi
-                        icol_sub  = (Jmaxi +1)*il_i + ik_i +1
-                        icol_full = (jdimi +1)*il_i + ik_i +1
-                        CiepjT_kp(irow_sub,icol_sub,ikp) = CiepjT_full(irow_full,icol_full)
-                  ENDDO
-                  ENDDO
-                  DO il_e = 0,pmaxe ! Loop over columns
-                  DO ik_e = 0,jmaxe
-                        icol_sub  = (jmaxe +1)*il_e + ik_e +1
-                        icol_full = (jdime +1)*il_e + ik_e +1
-                        CiepjF_kp(irow_sub,icol_sub,ikp) = CiepjF_full(irow_full,icol_full)
-                  ENDDO
-                  ENDDO
-            ENDDO
-            ENDDO
-            DEALLOCATE(CiepjF_full)
-            DEALLOCATE(CiepjT_full)
-          ELSE
-            CeipjT_kp = 0._dp; CeipjF_kp = 0._dp; CiepjT_kp = 0._dp; CiepjF_kp = 0._dp;
-          ENDIF
+          DEALLOCATE(CiepjF_full)
+          DEALLOCATE(CiepjT_full)
+        ELSE
+          CeipjT_kp = 0._dp; CeipjF_kp = 0._dp; CiepjT_kp = 0._dp; CiepjF_kp = 0._dp;
         ENDIF
       ENDDO
       CALL closef(fid)
@@ -765,7 +755,6 @@ CONTAINS
           DO iky = ikys,ikye
             ! Check for nonlinear case if we are in the anti aliased domain or the filtered one
             kperp_sim = kparray(ikx,iky,1,0) ! current simulation kperp
-            IF( (LINEARITY .EQ. 'linear') .OR. (kperp_sim .LT. two_third_kpmax) ) THEN
             ! Find the interval in kp grid mat where kperp_sim is contained
             ! Loop over the whole kp mat grid to find the smallest kperp that is
             ! larger than the current kperp_sim (brute force...)
@@ -798,14 +787,6 @@ CONTAINS
               CiepjT(:,:,ikx,iky) = 0._dp
               CiepjF(:,:,ikx,iky) = 0._dp
             ENDIF
-          ELSE ! Out of anti anti aliased domain
-            Ceepj (:,:,ikx,iky) = 0._dp
-            CeipjT(:,:,ikx,iky) = 0._dp
-            CeipjF(:,:,ikx,iky) = 0._dp
-            Ciipj (:,:,ikx,iky) = 0._dp
-            CiepjT(:,:,ikx,iky) = 0._dp
-            CiepjF(:,:,ikx,iky) = 0._dp
-          ENDIF
           ENDDO
         ENDDO
       ELSE ! DK -> No kperp dep, copy simply to final collision matrices
-- 
GitLab