diff --git a/matlab/fort.90 b/matlab/fort.90
new file mode 100644
index 0000000000000000000000000000000000000000..321aad3bcbfa44db497c042526803dec63c6cc90
--- /dev/null
+++ b/matlab/fort.90
@@ -0,0 +1,6 @@
+&GRID
+  nr   = 64
+  Lr = 10
+  nz   = 64
+  Lz = 10
+/
diff --git a/src/auxval.F90 b/src/auxval.F90
index 50efa00a92690ac936f8667c480a49e5c358fcd9..c49fc47eff29195904ab50932b0a2e57a89af892 100644
--- a/src/auxval.F90
+++ b/src/auxval.F90
@@ -4,21 +4,26 @@ subroutine auxval
   USE basic
   USE grid
   USE array
-  USE fourier, ONLY: initialize_FFT
+  USE fourier, ONLY: init_grid_distr_and_plans
   use prec_const
   IMPLICIT NONE
 
   INTEGER :: irows,irowe, irow, icol
   IF (my_id .EQ. 0) WRITE(*,*) '=== Set auxiliary values ==='
 
+  CALL init_grid_distr_and_plans(Nr,Nz)
+  CALL mpi_barrier(MPI_COMM_WORLD, ierr)
+
   CALL set_krgrid
+  CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
   CALL set_kzgrid ! Distributed dimension
+  CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
   CALL set_pj
+  CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
   CALL memory ! Allocate memory for global arrays
-
-  CALL initialize_FFT ! intialization of FFTW plans
+  CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
 END SUBROUTINE auxval
diff --git a/src/basic_mod.F90 b/src/basic_mod.F90
index e71b4d03b2e5001927fb57b172ea5237dc367078..788a3aa816056285e354e64f4ddcf6227c5b7d49 100644
--- a/src/basic_mod.F90
+++ b/src/basic_mod.F90
@@ -20,9 +20,6 @@ MODULE basic
   INTEGER :: ierr                  ! flag for MPI error
   INTEGER :: my_id                 ! identification number of current process
   INTEGER :: num_procs             ! number of MPI processes
-  integer(C_INTPTR_T) :: alloc_local   ! total local data allocation size (mpi process)
-  integer(C_INTPTR_T) :: local_nkr      ! local size of parallelized kz direction
-  integer(C_INTPTR_T) :: local_kr_start ! local start of parallelized kz direction
 
   INTEGER :: iframe1d              ! counting the number of times 1d datasets are outputed (for diagnose)
   INTEGER :: iframe2d              ! counting the number of times 2d datasets are outputed (for diagnose)
diff --git a/src/fourier_mod.F90 b/src/fourier_mod.F90
index 03978ff3e10b9244179a6cd7afe7a202f5067330..94aedfbaa6caaaa7811f02f5d0043c9158052d6c 100644
--- a/src/fourier_mod.F90
+++ b/src/fourier_mod.F90
@@ -10,109 +10,112 @@ MODULE fourier
   INCLUDE 'fftw3-mpi.f03'
 
   PRIVATE
-  type(C_PTR)                        :: planf, planb, real_ptr, cmpx_ptr
-  real(C_DOUBLE),            pointer :: real_data_1(:,:), real_data_2(:,:)
-  complex(C_DOUBLE_complex), pointer :: cmpx_data(:,:)
-  integer (C_INTPTR_T)               :: nx, ny, nh
 
-  PUBLIC :: initialize_FFT, finalize_FFT
-  PUBLIC :: convolve_2D_F2F
+  PUBLIC :: init_grid_distr_and_plans, convolve_2D_F2F, finalize_plans
 
+  real(C_DOUBLE), pointer                :: real_data_f(:,:), real_data_g(:,:), real_data_c(:,:)
+  complex(C_DOUBLE_complex), pointer     :: cmpx_data_f(:,:), cmpx_data_g(:,:), cmpx_data_c(:,:)
+  type(C_PTR)                            :: cdatar_f, cdatar_g, cdatar_c
+  type(C_PTR)                            :: cdatac_f, cdatac_g, cdatac_c
+  type(C_PTR)                            :: planf, planb
+  integer(C_INTPTR_T)                    :: i, ix, iy, alloc_local_1, alloc_local_2
+  integer(C_INTPTR_T)                    :: NR_, NZ_
 
   CONTAINS
 
-    SUBROUTINE initialize_FFT
-      IMPLICIT NONE
-      nx = Nr; ny = Nz; nh = ( nx / 2 ) + 1
+  SUBROUTINE init_grid_distr_and_plans(Nr,Nz)
+    IMPLICIT NONE
+
+    INTEGER, INTENT(IN) :: Nr,Nz
+    NR_ = Nr; NZ_ = Nz
 
-      IF ( my_id .EQ. 1)write(*,*) 'Initialize FFT..'
-      CALL fftw_mpi_init
+    ! Compute the room to allocate
+    alloc_local_1 = fftw_mpi_local_size_2d(NR_/2 + 1, NZ_, MPI_COMM_WORLD, local_nkr, local_nkr_offset)
+    ! Initalize pointers to this room
+    cdatac_f = fftw_alloc_complex(alloc_local_1)
+    cdatac_g = fftw_alloc_complex(alloc_local_1)
+    cdatac_c = fftw_alloc_complex(alloc_local_1)
+    ! Initalize the arrays with the rooms pointed
+    call c_f_pointer(cdatac_f, cmpx_data_f, [NZ_ ,local_nkr])
+    call c_f_pointer(cdatac_g, cmpx_data_g, [NZ_ ,local_nkr])
+    call c_f_pointer(cdatac_c, cmpx_data_c, [NZ_ ,local_nkr])
 
-      IF ( my_id .EQ. 1)write(*,*) 'distribution of the array along kr..'
-      alloc_local = fftw_mpi_local_size_2d(nh, ny, MPI_COMM_WORLD, local_nkr, local_kr_start)
-      write(*,*) 'local_nkr', local_nkr, 'local_kr_start', local_kr_start
+    alloc_local_2 = fftw_mpi_local_size_2d(NZ_, NR_/2 + 1, MPI_COMM_WORLD, local_nz, local_nz_offset)
 
-      real_ptr = fftw_alloc_real(2 * alloc_local)
-      cmpx_ptr = fftw_alloc_complex(alloc_local)
+    cdatar_f = fftw_alloc_real(2*alloc_local_2)
+    cdatar_g = fftw_alloc_real(2*alloc_local_2)
+    cdatar_c = fftw_alloc_real(2*alloc_local_2)
+    call c_f_pointer(cdatar_f, real_data_f, [2*(NR_/2  + 1),local_nz])
+    call c_f_pointer(cdatar_g, real_data_g, [2*(NR_/2  + 1),local_nz])
+    call c_f_pointer(cdatar_c, real_data_c, [2*(NR_/2  + 1),local_nz])
 
-      call c_f_pointer(real_ptr, real_data_1, [2*local_nkr, nx])
-      call c_f_pointer(real_ptr, real_data_2, [2*local_nkr, nx])
-      call c_f_pointer(cmpx_ptr, cmpx_data,   [  local_nkr, nx])
+    ! Plan Creation (out-of-place forward and backward FFT)
+    planf = fftw_mpi_plan_dft_r2c_2d(NZ_, NR_, real_data_f, cmpx_data_f, MPI_COMM_WORLD,  ior(FFTW_MEASURE, FFTW_MPI_TRANSPOSED_OUT))
+    planb = fftw_mpi_plan_dft_c2r_2d(NZ_, NR_, cmpx_data_f, real_data_f, MPI_COMM_WORLD,  ior(FFTW_MEASURE, FFTW_MPI_TRANSPOSED_IN))
 
-      IF ( my_id .EQ. 1)write(*,*) 'setting FFT iFFT 2D plans..'
-      ! Backward FFT plan
-      planb = fftw_mpi_plan_dft_c2r_2d(ny, nx, cmpx_data, real_data_1, MPI_COMM_WORLD, &
-                                                                 FFTW_PATIENT)
-      ! Forward FFT plan
-      planf = fftw_mpi_plan_dft_r2c_2d(ny, nx, real_data_1, cmpx_data, MPI_COMM_WORLD, &
-                                                                 FFTW_PATIENT)
-    END SUBROUTINE initialize_FFT
+   if ((.not. c_associated(planf)) .OR. (.not. c_associated(planb))) then
+      write(*,*) "plan creation error!!"
+      stop
+   end if
 
-    SUBROUTINE finalize_FFT
-      IMPLICIT NONE
+   DO ix = 0,num_procs-1
+     CALL mpi_barrier(MPI_COMM_WORLD, ierr)
+     IF (my_id .EQ. ix) print *, my_id,': alloc_local = ', alloc_local_1+alloc_local_2
+     CALL mpi_barrier(MPI_COMM_WORLD, ierr)
+     ! IF (my_id .EQ. 0) print *, my_id,': local_nz = ', local_nz, ' loc_nz_of. = ', local_nz_offset
+     ! CALL mpi_barrier(MPI_COMM_WORLD, ierr)
+   ENDDO
 
-      IF ( my_id .EQ. 0)write(*,*) 'finalize FFTW'
-      CALL dfftw_destroy_plan(planf)
-      CALL dfftw_destroy_plan(planb)
-      call fftw_mpi_cleanup
-      call fftw_free(real_ptr)
-      call fftw_free(cmpx_ptr)
 
-    END SUBROUTINE finalize_FFT
+  END SUBROUTINE init_grid_distr_and_plans
 
 
   !!! Convolution 2D Fourier to Fourier
-  !   - Compute the convolution using the convolution theorem
+  !   - Compute the convolution using the convolution theorem and MKL
   SUBROUTINE convolve_2D_F2F( F_2D, G_2D, C_2D )
     IMPLICIT NONE
-    COMPLEX(dp), DIMENSION(ikrs:ikre,ikzs:ikze), INTENT(IN)  :: F_2D, G_2D  ! input fields
-    COMPLEX(dp), DIMENSION(ikrs:ikre,ikzs:ikze), INTENT(OUT) :: C_2D  ! output convolutioned field
 
-    ! initialize data to some function my_function(i,j)
-    do ikr = ikrs,ikre
-      do ikz = ikzs,ikze
-      cmpx_data(ikr-local_kr_start, ikz) = F_2D(ikr, ikz)
+    COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(ikrs:ikre,ikzs:ikze), INTENT(IN)  :: F_2D, G_2D  ! input fields
+    COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(ikrs:ikre,ikzs:ikze), INTENT(OUT) :: C_2D  ! output convolutioned field
+
+    do ikr = ikrs, ikre
+      do ikz = ikzs, ikze
+        cmpx_data_f(ikz,ikr-local_nkr_offset) = F_2D(ikr,ikz)
+        cmpx_data_g(ikz,ikr-local_nkr_offset) = G_2D(ikr,ikz)
       end do
     end do
-    CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
-    ! 2D backward Fourier transform
-    ! write(*,*) my_id, 'iFFT(F) ..'
-    call fftw_mpi_execute_dft_c2r(planb, cmpx_data, real_data_1)
+    call fftw_mpi_execute_dft_c2r(planb, cmpx_data_f, real_data_f)
 
-    ! initialize data to some function my_function(i,j)
-    do ikr = ikrs,ikre
-      do ikz = ikzs,ikze
-      cmpx_data(ikr-local_kr_start, ikz) = G_2D(ikr, ikz)
-      end do
-    end do
-    ! 2D inverse Fourier transform
-    ! write(*,*) my_id, 'iFFT(G) ..'
-    call fftw_mpi_execute_dft_c2r(planb, cmpx_data, real_data_2)
-
-    ! Product in physical space
-    ! write(*,*) 'multply..'
-    real_data_1 = real_data_1 * real_data_2
-
-    ! 2D Fourier tranform
-    ! write(*,*) my_id, 'FFT(f*g) ..'
-    call fftw_mpi_execute_dft_r2c(planf, real_data_1, cmpx_data)
-
-    ! COPY TO OUTPUT ARRAY
-    ! write(*,*) my_id, 'out ..'
-    do ikr = ikrs,ikre
-      do ikz = ikzs,ikze
-        cmpx_data(ikr-local_kr_start,ikz) = C_2D(ikr,ikz)
+    call fftw_mpi_execute_dft_c2r(planb, cmpx_data_g, real_data_g)
+
+    real_data_c = real_data_f/NZ_/NR_  * real_data_g/NZ_/NR_
+
+    call fftw_mpi_execute_dft_r2c(planf, real_data_c, cmpx_data_c)
+
+    ! Retrieve convolution in input format
+    do ikr = ikrs, ikre
+      do ikz = ikzs, ikze
+        C_2D(ikr,ikz) = cmpx_data_c(ikz,ikr-local_nkr_offset)*AA_r(ikr)*AA_z(ikz)
       end do
     end do
 
-    ! Anti aliasing (2/3 rule)
-    DO ikr = ikrs,ikre
-      DO ikz = ikzs,ikze
-         C_2D(ikr,ikz) = C_2D(ikr,ikz) * AA_r(ikr) * AA_z(ikz)
-      ENDDO
-    ENDDO
 
 END SUBROUTINE convolve_2D_F2F
 
+SUBROUTINE finalize_plans
+  IMPLICIT NONE
+
+  IF (my_id .EQ. 0) write(*,*) '..plan Destruction.'
+  call fftw_destroy_plan(planb)
+  call fftw_destroy_plan(planf)
+  call fftw_mpi_cleanup()
+  call fftw_free(cdatar_f)
+  call fftw_free(cdatar_g)
+  call fftw_free(cdatar_c)
+  call fftw_free(cdatac_f)
+  call fftw_free(cdatac_g)
+  call fftw_free(cdatac_c)
+END SUBROUTINE finalize_plans
+
 END MODULE fourier
diff --git a/src/grid_mod.F90 b/src/grid_mod.F90
index a3c0286bdb3cca69e0b2ff41c8cfe9882c9ca72d..da4bf65557b6cc2cebeceac4c07d2eac1c3e6d16 100644
--- a/src/grid_mod.F90
+++ b/src/grid_mod.F90
@@ -37,6 +37,7 @@ MODULE grid
   REAL(dp), PUBLIC, PROTECTED ::  deltar,  deltaz
   INTEGER,  PUBLIC, PROTECTED  ::  irs,  ire,  izs,  ize
   INTEGER,  PUBLIC :: ir,iz ! counters
+  integer(C_INTPTR_T), PUBLIC :: local_nkr, local_nkr_offset, local_nz, local_nz_offset
 
   ! Grids containing position in fourier space
   REAL(dp), DIMENSION(:), ALLOCATABLE, PUBLIC :: krarray
@@ -88,86 +89,79 @@ CONTAINS
 
   END SUBROUTINE set_pj
 
-  SUBROUTINE set_krgrid
-    USE prec_const
-    IMPLICIT NONE
-    INTEGER :: ikr
 
-    Nkr = Nr/2+1 ! Defined only on positive kr since fields are real
-    ! ! Start and END indices of grid
-    ikrs =    my_id  * Nkr/num_procs + 1
-    ikre = (my_id+1) * Nkr/num_procs
+    SUBROUTINE set_krgrid
+      USE prec_const
+      IMPLICIT NONE
+      INTEGER :: i_
 
-    IF(my_id .EQ. num_procs) ikre = Nkr
+      Nkr = Nr/2+1 ! Defined only on positive kr since fields are real
+      ! Start and END indices of grid
+      ikrs = local_nkr_offset + 1
+      ikre = ikrs + local_nkr - 1
 
-    WRITE(*,*) 'ID = ',my_id,' ikrs = ', ikrs, ' ikre = ', ikre
+      DO i_ = 0,num_procs-1
+        CALL mpi_barrier(MPI_COMM_WORLD, ierr)
+        IF (my_id .EQ. i_) print *, i_,': ikrs = ', ikrs, ' ikre = ', ikre
+        CALL mpi_barrier(MPI_COMM_WORLD, ierr)
+      ENDDO
 
-    ! Grid spacings
-    IF (Lr .GT. 0) THEN
+      IF (my_id .EQ. num_procs-1) ikre = Nkr
+      !WRITE(*,*) 'ID = ',my_id,' ikrs = ', ikrs, ' ikre = ', ikre
+      ! Grid spacings
       deltakr = 2._dp*PI/Lr
-    ELSE
-      deltakr = 1.0
-    ENDIF
-
-    ! Discretized kr positions ordered as dk*(0 1 2)
-    ALLOCATE(krarray(ikrs:ikre))
-    DO ikr = ikrs,ikre
-      krarray(ikr) = REAL(ikr-1,dp) * deltakr
-      if (krarray(ikr) .EQ. 0) THEN
-        ikr_0 = ikr
-      ENDIF
-    END DO
-
-    ! Orszag 2/3 filter
-    two_third_krmax = 2._dp/3._dp*deltakr*Nkr
-    ALLOCATE(AA_r(ikrs:ikre))
-    DO ikr = ikrs,ikre
-      IF ( (krarray(ikr) .GT. -two_third_krmax) .AND. (krarray(ikr) .LT. two_third_krmax) ) THEN
-        AA_r(ikr) = 1._dp;
-      ELSE
-        AA_r(ikr) = 0._dp;
-      ENDIF
-    END DO
-  END SUBROUTINE set_krgrid
-
-  SUBROUTINE set_kzgrid
-    USE prec_const
-    USE model, ONLY : kr0KH, ikz0KH
-    IMPLICIT NONE
 
-    Nkz = Nz;
-    ! Start and END indices of grid
-    ikzs = 1
-    ikze = Nkz
-    WRITE(*,*) 'ID = ',my_id,' ikzs = ', ikzs, ' ikze = ', ikze
-    ! Grid spacings
-    deltakz = 2._dp*PI/Lz
-
-    ! Discretized kz positions ordered as dk*(0 1 2 -3 -2 -1)
-    ALLOCATE(kzarray(ikzs:ikze))
-    DO ikz = ikzs,ikze
-      kzarray(ikz) = deltakz*(MODULO(ikz-1,Nkz/2)-Nkz/2*FLOOR(2.*real(ikz-1)/real(Nkz)))
-      if (kzarray(ikz) .EQ. 0)        ikz_0 = ikz
-      if (ikz .EQ. Nz/2+1)     kzarray(ikz) = -kzarray(ikz)
-    END DO
-
-    IF (my_id .EQ. 1) WRITE(*,*) 'ID = ',my_id,' kz = ',kzarray
-    ! Orszag 2/3 filter
-    two_third_kzmax = 2._dp/3._dp*deltakz*(Nkz/2);
-    ALLOCATE(AA_z(ikzs:ikze))
-    DO ikz = ikzs,ikze
-      IF ( (kzarray(ikz) .GT. -two_third_kzmax) .AND. (kzarray(ikz) .LT. two_third_kzmax) ) THEN
-        AA_z(ikz) = 1._dp;
-      ELSE
-        AA_z(ikz) = 0._dp;
-      ENDIF
-    END DO
-
-    ! Put kz0RT to the nearest grid point on kz
-    ikz0KH = NINT(kr0KH/deltakr)+1
-    IF ( (ikz0KH .GE. ikzs) .AND. (ikz0KH .LE. ikze) ) kr0KH  = kzarray(ikz0KH)
-
-  END SUBROUTINE set_kzgrid
+      ! Discretized kr positions ordered as dk*(0 1 2 3)
+      ALLOCATE(krarray(ikrs:ikre))
+      DO ikr = ikrs,ikre
+        krarray(ikr) = REAL(ikr-1,dp) * deltakr
+        IF (krarray(ikr) .EQ. 0) ikr_0 = ikr
+      END DO
+
+      ! Orszag 2/3 filter
+      two_third_krmax = 2._dp/3._dp*deltakr*Nkr
+      ALLOCATE(AA_r(ikrs:ikre))
+      DO ikr = ikrs,ikre
+        IF ( (krarray(ikr) .LT. two_third_krmax) ) THEN
+          AA_r(ikr) = 1._dp;
+        ELSE
+          AA_r(ikr) = 0._dp;
+        ENDIF
+      END DO
+    END SUBROUTINE set_krgrid
+
+    SUBROUTINE set_kzgrid
+      USE prec_const
+      IMPLICIT NONE
+      INTEGER :: i_
+
+      Nkz = Nz;
+      ! Start and END indices of grid
+      ikzs = 1
+      ikze = Nkz
+
+      ! Grid spacings
+      deltakz = 2._dp*PI/Lz
+
+      ! Discretized kz positions ordered as dk*(0 1 2 3 -2 -1)
+      ALLOCATE(kzarray(ikzs:ikze))
+      DO ikz = ikzs,ikze
+        kzarray(ikz) = deltakz*(MODULO(ikz-1,Nkz/2)-Nkz/2*FLOOR(2.*real(ikz-1)/real(Nkz)))
+        if (ikz .EQ. Nz/2+1)     kzarray(ikz) = -kzarray(ikz)
+        IF (kzarray(ikz) .EQ. 0) ikz_0 = ikz
+      END DO
+
+      ! Orszag 2/3 filter
+      two_third_kzmax = 2._dp/3._dp*deltakz*(Nkz/2);
+      ALLOCATE(AA_z(ikzs:ikze))
+      DO ikz = ikzs,ikze
+        IF ( (kzarray(ikz) .GT. -two_third_kzmax) .AND. (kzarray(ikz) .LT. two_third_kzmax) ) THEN
+          AA_z(ikz) = 1._dp;
+        ELSE
+          AA_z(ikz) = 0._dp;
+        ENDIF
+      END DO
+    END SUBROUTINE set_kzgrid
 
   SUBROUTINE grid_readinputs
     ! Read the input parameters
diff --git a/src/inital.F90 b/src/inital.F90
index 7f50dbb8096918d19ab8d7f0619780f55b26b628..7fa64c9988b9909fd5b4c85187ab23816ef53384 100644
--- a/src/inital.F90
+++ b/src/inital.F90
@@ -61,37 +61,7 @@ SUBROUTINE init_moments
 
   ! Seed random number generator
   iseedarr(:)=iseed
-  CALL RANDOM_SEED(PUT=iseedarr)
-
-  IF ( only_Na00 ) THEN ! Spike initialization on density only
-
-    DO ikr=ikrs,ikre
-      DO ikz=ikzs,ikze
-        moments_e( 1,1, ikr,ikz, :) = initback_moments + initnoise_moments*(noise-0.5_dp)
-        moments_i( 1,1, ikr,ikz, :) = initback_moments + initnoise_moments*(noise-0.5_dp)
-      END DO
-    END DO
-
-    DO ikz=2,Nkz/2 !symmetry at kr = 0
-      CALL RANDOM_NUMBER(noise)
-      moments_e( 1,1,1,ikz, :) = moments_e( 1,1,1,Nkz+2-ikz, :)
-      moments_i( 1,1,1,ikz, :) = moments_i( 1,1,1,Nkz+2-ikz, :)
-    END DO
-
-  ELSE
-    !**** Gaussian initialization (Hakim 2017) *********************************
-    ! sigma    = 5._dp     ! Gaussian sigma
-    ! gain     = 0.5_dp    ! Gaussian mean
-    ! kz_shift = 0.5_dp    ! Gaussian z shift
-    ! moments_i = 0; moments_e = 0;
-    !   DO ikr=ikrs,ikre
-    !     kr = krarray(ikr)
-    !     DO ikz=ikzs,ikze
-    !       kz = kzarray(ikz)
-    !       moments_i( 1,1, ikr,ikz, :) = gain*sigma/SQRT2 * EXP(-(kr**2+(kz-kz_shift)**2)*sigma**2/4._dp)
-    !       moments_e( 1,1, ikr,ikz, :) = gain*sigma/SQRT2 * EXP(-(kr**2+(kz-kz_shift)**2)*sigma**2/4._dp)
-    !     END DO
-    !   END DO
+  CALL RANDOM_SEED(PUT=iseedarr+my_id)
 
     !**** Broad noise initialization *******************************************
     DO ip=ips_e,ipe_e
@@ -106,13 +76,13 @@ SUBROUTINE init_moments
 
         IF ( ikrs .EQ. 1 ) THEN
           DO ikz=2,Nkz/2 !symmetry at kr = 0
-            CALL RANDOM_NUMBER(noise)
             moments_e( ip,ij,1,ikz, :) = moments_e( ip,ij,1,Nkz+2-ikz, :)
           END DO
         ENDIF
 
       END DO
     END DO
+
     DO ip=ips_i,ipe_i
       DO ij=ijs_i,ije_i
 
@@ -125,7 +95,6 @@ SUBROUTINE init_moments
 
         IF ( ikrs .EQ. 1 ) THEN
           DO ikz=2,Nkz/2 !symmetry at kr = 0
-            CALL RANDOM_NUMBER(noise)
             moments_i( ip,ij,1,ikz, :) = moments_i( ip,ij,1,Nkz+2-ikz, :)
           END DO
         ENDIF
@@ -133,7 +102,7 @@ SUBROUTINE init_moments
       END DO
     END DO
 
-  ENDIF
+  ! ENDIF
 END SUBROUTINE init_moments
 !******************************************************************************!
 
@@ -177,9 +146,9 @@ SUBROUTINE load_cp
     iframe2d = iframe2d-1; iframe5d = iframe5d-1
 
     ! Read state of system from restart file
-    CALL getarr(fidrst, dset_name, moments_e(ips_e:ipe_e,ijs_e:ije_e,ikrs:ikre,ikzs:ikze,1),ionode=0)
+    CALL getarr(fidrst, dset_name, moments_e(ips_e:ipe_e,ijs_e:ije_e,ikrs:ikre,ikzs:ikze,1),pardim=3)
     WRITE(dset_name, "(A, '/', i6.6)") "/Basic/moments_i", n_
-    CALL getarr(fidrst, dset_name, moments_i(ips_i:ipe_i,ijs_i:ije_i,ikrs:ikre,ikzs:ikze,1),ionode=0)
+    CALL getarr(fidrst, dset_name, moments_i(ips_i:ipe_i,ijs_i:ije_i,ikrs:ikre,ikzs:ikze,1),pardim=3)
 
   ELSE
     CALL getatt(fidrst, '/Basic', 'cstep', cstep)
@@ -191,8 +160,8 @@ SUBROUTINE load_cp
     iframe2d = iframe2d-1; iframe5d = iframe5d-1
 
     ! Read state of system from restart file
-    CALL getarr(fidrst, '/Basic/moments_e', moments_e(ips_e:ipe_e,ijs_e:ije_e,ikrs:ikre,ikzs:ikze,1),ionode=0)
-    CALL getarr(fidrst, '/Basic/moments_i', moments_i(ips_i:ipe_i,ijs_i:ije_i,ikrs:ikre,ikzs:ikze,1),ionode=0)
+    CALL getarr(fidrst, '/Basic/moments_e', moments_e(ips_e:ipe_e,ijs_e:ije_e,ikrs:ikre,ikzs:ikze,1),pardim=3)
+    CALL getarr(fidrst, '/Basic/moments_i', moments_i(ips_i:ipe_i,ijs_i:ije_i,ikrs:ikre,ikzs:ikze,1),pardim=3)
   ENDIF
 
   CALL closef(fidrst)
diff --git a/src/ppexit.F90 b/src/ppexit.F90
index 9995c91e9b0ac9291e6dfba9012c249f7b1c5902..b6b04cd91571d07a1c53bc9da81e48b69c829154 100644
--- a/src/ppexit.F90
+++ b/src/ppexit.F90
@@ -2,13 +2,13 @@ SUBROUTINE ppexit
   !   Exit parallel environment
 
   USE basic
-  USE fourier, ONLY : finalize_FFT
+  USE fourier, ONLY : finalize_plans
 
   use prec_const
   IMPLICIT NONE
 
 
-  CALL finalize_FFT
+  CALL finalize_plans
   CALL mpi_barrier(MPI_COMM_WORLD, ierr)
   CALL mpi_finalize(ierr)
 
diff --git a/src/stepon.F90 b/src/stepon.F90
index 7f16f1adaab6cf1c521bdb9c3b2d8ff0598dfdfd..986435d707709162307e13cbff549f29e3592770 100644
--- a/src/stepon.F90
+++ b/src/stepon.F90
@@ -17,11 +17,9 @@ SUBROUTINE stepon
    DO num_step=1,ntimelevel ! eg RK4 compute successively k1, k2, k3, k4
       ! Compute right hand side of moments hierarchy equation
       CALL moments_eq_rhs
-      CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
       ! Advance from updatetlevel to updatetlevel+1 (according to num. scheme)
       CALL advance_time_level
-      CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
       ! Update the moments with the hierarchy RHS (step by step)
 
@@ -37,27 +35,22 @@ SUBROUTINE stepon
           CALL advance_field(moments_i(ip,ij,:,:,:),moments_rhs_i(ip,ij,:,:,:))
         ENDDO
       ENDDO
-      CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
       ! Execution time end
       CALL cpu_time(t1_adv_field)
       tc_adv_field = tc_adv_field + (t1_adv_field - t0_adv_field)
-      CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
       ! Update electrostatic potential
       CALL poisson
-      CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
       ! Update nonlinear term
       IF ( NON_LIN .OR. (A0KH .NE. 0) ) THEN
         CALL compute_Sapj
       ENDIF
-      CALL mpi_barrier(MPI_COMM_WORLD, ierr)
 
       !(The two routines above are called in inital for t=0)
       CALL checkfield_all()
       CALL mpi_barrier(MPI_COMM_WORLD, ierr)
-
    END DO
 
    CONTAINS
diff --git a/wk/analysis_2D.m b/wk/analysis_2D.m
index 20d1a9152edbc68fdaa44e170a7f495d25c5a3b6..a47bcc7aca8d4f1e2c9966129846091ec3c3dbdf 100644
--- a/wk/analysis_2D.m
+++ b/wk/analysis_2D.m
@@ -89,13 +89,12 @@ E_kin_KR = mean(mean(abs(Ddr.*PHI(:,:,it)).^2+abs(Ddz.*PHI(:,:,it)).^2,3),2);
 dEdt     = diff(E_pot+E_kin)./dt2D;
 
 for it = 1:numel(Ts5D) % Loop over 5D arrays
-    NE_ = Ne00(:,:,it); NI_ = Ni00(:,:,it); PH_ = PHI(:,:,it);
     Ne_norm(:,:,it)= sum(sum(abs(Nepj(:,:,:,:,it)),3),4)/Nkr/Nkz;
     Ni_norm(:,:,it)= sum(sum(abs(Nipj(:,:,:,:,it)),3),4)/Nkr/Nkz;
 if strcmp(OUTPUTS.write_non_lin,'.true.')   
     Se_norm(:,:,it)= sum(sum(abs(Sepj(:,:,:,:,it)),3),4)/Nkr/Nkz;
-    Sne00_norm(it) = sum(sum(abs(Se00(:,:,it))))/Nkr/Nkz;
     Si_norm(:,:,it)= sum(sum(abs(Sipj(:,:,:,:,it)),3),4)/Nkr/Nkz;
+    Sne00_norm(it) = sum(sum(abs(Se00(:,:,it))))/Nkr/Nkz;
     Sni00_norm(it) = sum(sum(abs(Si00(:,:,it))))/Nkr/Nkz;
 end
 end
@@ -173,7 +172,7 @@ end
 %%
 if 0
 %% Photomaton : real space
-tf = 100; [~,it] = min(abs(Ts2D-tf)); [~,it5D] = min(abs(Ts5D-tf));
+tf = 0; [~,it] = min(abs(Ts2D-tf)); [~,it5D] = min(abs(Ts5D-tf));
 fig = figure; FIGNAME = ['photo_real',sprintf('_t=%.0f',Ts2D(it))]; set(gcf, 'Position',  [100, 100, 1500, 500])
     subplot(131); plt = @(x) (((x))); 
         pclr = pcolor((RR),(ZZ),plt(ni00(:,:,it))); set(pclr, 'edgecolor','none');pbaspect([1 1 1])
@@ -294,7 +293,7 @@ fig = figure; FIGNAME = 'space_time_drphi';set(gcf, 'Position',  [100, 100, 1200
 %     title(['$\eta=',num2str(ETAB),'\quad',...
 %         '\nu_{',CONAME,'}=',num2str(NU),'$'])
 %     legend(['$P=',num2str(PMAXI),'$, $J=',num2str(JMAXI),'$'])
-    ylim([-0.01,1.1*max(Flux_ri(it0:it1))]);
+    ylim([0,1.1*max(Flux_ri(it0:it1))]);
     subplot(212)
     [TY,TX] = meshgrid(r,Ts2D(it0:it1));
     pclr = pcolor(TX,TY,squeeze(mean(drphi(:,:,it0:it1),2))'); set(pclr, 'edgecolor','none'); %colorbar;
diff --git a/wk/fort.90 b/wk/fort.90
index 412c03cac1350770f03669d8484a2b92377a29a5..79b41df03a3338fb1e5c64f71e732825acb790ac 100644
--- a/wk/fort.90
+++ b/wk/fort.90
@@ -1,7 +1,7 @@
 &BASIC
   nrun   = 100000000
-  dt     = 0.01
-  tmax   = 1
+  dt     = 0.005
+  tmax   = 80
   RESTART = .false.
 /
 &GRID
@@ -9,25 +9,25 @@
   jmaxe = 1
   pmaxi = 2
   jmaxi = 1
-  Nr   = 64
-  Lr = 20
-  Nz   = 64
-  Lz = 20
+  Nr   = 256
+  Lr = 66
+  Nz   = 256
+  Lz = 66
   kpar = 0
   CANCEL_ODD_P = .false.
 /
 &OUTPUT_PAR
-  nsave_0d = 1
+  nsave_0d = 100
   nsave_1d = 0
-  nsave_2d = 1
-  nsave_5d = 1
+  nsave_2d = 100
+  nsave_5d = 200
   write_Na00    = .true.
   write_moments = .true.
   write_phi     = .true.
   write_non_lin     = .true.
   write_doubleprecision = .true.
-  resfile0      = '../results/test_parallel/64x32_L_20_Pe_2_Je_1_Pi_2_Ji_1_nB_0.5_nN_1_nu_1e-02_DG_mu_5e-06/outputs'
-  rstfile0      = '../results/test_parallel/64x32_L_20_Pe_2_Je_1_Pi_2_Ji_1_nB_0.5_nN_1_nu_1e-02_DG_mu_5e-06/checkpoint'
+  resfile0      = '../results/test_parallel/256x128_L_66_Pe_2_Je_1_Pi_2_Ji_1_nB_0.5_nN_1_nu_1e-02_DG_mu_5e-06/outputs'
+  rstfile0      = '../results/test_parallel/256x128_L_66_Pe_2_Je_1_Pi_2_Ji_1_nB_0.5_nN_1_nu_1e-02_DG_mu_5e-06/checkpoint'
   job2load      = 0
 /
 &MODEL_PAR