diff --git a/GKCoulomb/Tljpmf/fort.90 b/GKCoulomb/Tljpmf/fort.90
index d4f7e19..6608dd7 100644
--- a/GKCoulomb/Tljpmf/fort.90
+++ b/GKCoulomb/Tljpmf/fort.90
@@ -1,20 +1,16 @@
 &BASIC 
-! Number of coefficient to be calculated. Should be equal to the number of
-! lines contained in the Tljpmf_indices.csv file
-NbOfCoeffs = 4536
-
 ! restart from previous calculation
 restart = .false.
 / 
 
 
 &MODEL_PAR 
 ! Component to compute 
 coll_type = 'field'
 ! Define colliding species
 coll_ab = 'ie'
 
 mu = 0.0027 ! me/mi
 tau = 1     ! Te/Ti
 / 
 
diff --git a/GKCoulomb/Tljpmf/src/basic_mod.f90 b/GKCoulomb/Tljpmf/src/basic_mod.f90
index 9fb5a56..ca09fe9 100644
--- a/GKCoulomb/Tljpmf/src/basic_mod.f90
+++ b/GKCoulomb/Tljpmf/src/basic_mod.f90
@@ -1,309 +1,325 @@
 MODULE basic
   !   Basic module 
 
   USE prec_const
   USE FMZM
 
 
   IMPLICIT NONE
   !
   ! input dimension
   ! integer :: mdim,pdim,fdim,jdim,ldim
  
   ! character*3 :: mdim_str,pdim_str,fdim_str,jdim_str,ldim_str
 
   ! restart flag
   logical :: restart
 
   !  List of logical file units
   INTEGER :: lu_in   = 90              ! File duplicated from STDIN
 
   ! Output format KOUT
   CHARACTER(len=7) :: FMFRMT = 'F100.20'
 
   ! Range of NN T5 coefficient to compute
   INTEGER :: idxMAXs,idxMAXe
   ! 
   !
   ! NN T5 list 
 
   ! Number of NBOFT5 to compute
   INTEGER :: NbOfCoeffs
 
   
   ! max and min indices per MPI process
   INTEGER :: lmin_l,jmin_l,pmin_l,mmin_l,fmin_l
   INTEGER :: lmax_l,jmax_l,pmax_l,mmax_l,fmax_l
   INTEGER :: tmin_l,tmax_l
 
   ! Number max of Ekrfab/ekab to compute
   INTEGER :: ERFMAX = 200
 
   ! MPI Stuff 
   ! MPI handles and variables
   INTEGER :: ierr                    ! flag for MPI error
   INTEGER :: nprocs                  ! number of processors
   INTEGER :: me =0                   ! Rank of processor
   CHARACTER(6) :: me_str             ! string containing Rank of MPI proc.
 
   ! Local idx
   INTEGER :: iNN_s_l,iNN_e_L
   INTEGER :: chksz
   INTEGER :: nbNN_l
 
 
 
   ! CPU TIME in s
   REAL(dp) :: start_time
   REAL(dp):: end_time
   REAL(dp) :: cpu_ellapsed_time
 
   !
   ! MPI WALL TIME 
   REAL(dp) :: starttime
   REAL(dp) :: endtime
 
   ! system clock
   INTEGER :: count_start,count_rate,count_stop  
   REAL(dp) :: system_ellapsed_time
 
 
   INTEGER,PARAMETER :: T5len= 100
   INTEGER,PARAMETER :: NNLKMPJlen = 14
  
 
   INTERFACE allocate_array
     MODULE PROCEDURE allocate_array_dp1,allocate_array_dp2,allocate_array_dp3,allocate_array_dp4
     MODULE PROCEDURE allocate_array_fm1,allocate_array_fm2,allocate_array_fm3,allocate_array_fm5
     MODULE PROCEDURE allocate_array_dc1,allocate_array_dc2,allocate_array_dc3,allocate_array_dc4
     MODULE PROCEDURE allocate_array_i1,allocate_array_i2,allocate_array_i3,allocate_array_i4
     MODULE PROCEDURE allocate_array_l1,allocate_array_l2,allocate_array_l3,allocate_array_l4
     MODULE PROCEDURE allocate_array_str5
   END INTERFACE allocate_array
 
 CONTAINS
 
   !================================================================================
   SUBROUTINE basic_data
     !   Read basic data from input file
 
     use prec_const
     IMPLICIT NONE
+
+    !locs. vars.
+    INTEGER :: buff_, NN, ENDOF, fid
+
     ! Namelist
-    NAMELIST /BASIC/NbOfCoeffs,restart
+    NAMELIST /BASIC/ restart
 
     !     !                            READ INPUT BASIC 
     IF( me .ne. 0 ) GOTO 110
     READ(lu_in,basic)
     WRITE(*,basic)
 110 CONTINUE
     !
     ! Broadcast from PE 0 to 
     !    
-    CALL MPI_bcast(NbOfCoeffs,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
     CALL MPI_bcast(restart,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr)
     !
+    ! get number of coeff to be cumputed and distributed along the MPI tasks
+    OPEN(fid,FILE = 'indices.in')
+    !
+    NN = 0
+    ENDOF = 0 
+    DO WHILE (ENDOF .eq. 0) 
+       READ(fid,*,IOSTAT=ENDOF) buff_ 
+       NN = NN +1
+    ENDDO
+    CLOSE(fid)
+    !
+    NbOfCoeffs = NN -1
+    print*, 'Numer of coefficients to be computed: ', NbOfCoeffs
     !
   END SUBROUTINE basic_data
   !================================================================================
   SUBROUTINE daytim(str)
     !   Print date and time
 
     use prec_const
     IMPLICIT NONE
     
     CHARACTER(len=*) , INTENT(in) :: str
     CHARACTER(len=16) :: d, t, dat, time
     !________________________________________________________________________________
     !
     CALL DATE_AND_TIME(d,t)
     dat=d(7:8) // '/' // d(5:6) // '/' // d(1:4)
     time=t(1:2) // ':' // t(3:4) // ':' // t(5:10)
     IF( me .eq. 0) WRITE(*,'(a,1x,a,1x,a)') str, dat(1:10), time(1:12)
     !
   END SUBROUTINE daytim
   !================================================================================
   SUBROUTINE clock(endorstart)
     !
     IMPLICIT NONE
     !
     INTEGER,INTENT(IN) :: endorstart
     !
     IF(endorstart .eq. 1) THEN 
        CALL system_clock(count = count_start, count_rate  = count_rate)
     ELSEIF (endorstart .eq. -1) THEN
        CALL system_clock(count = count_stop)
        system_ellapsed_time = real(count_stop - count_start)/real( count_rate)
     ENDIF
     !
   END SUBROUTINE clock
   !================================================================================
 
 ! To allocate arrays of doubles, integers, etc. at run time
 
   SUBROUTINE allocate_array_dp1(a,is1,ie1)
     real(dp), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp1
   SUBROUTINE allocate_array_dp2(a,is1,ie1,is2,ie2)
     real(dp), DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp2
   SUBROUTINE allocate_array_dp3(a,is1,ie1,is2,ie2,is3,ie3)
     real(dp), DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp3
   SUBROUTINE allocate_array_dp4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     real(dp), DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp4
 
 
   !__________________ TO ALLOCATE FM ARRAYS_________________
   SUBROUTINE allocate_array_fm2(a,is1,ie1,is2,ie2)
     TYPE(FM), DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm2
 
   SUBROUTINE allocate_array_fm1(a,is1,ie1)
     TYPE(FM), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1   
     ALLOCATE(a(is1:ie1))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm1
 
   SUBROUTINE allocate_array_fm3(a,is1,ie1,is2,ie2,is3,ie3)
     TYPE(FM), DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm3
 
   SUBROUTINE allocate_array_fm5(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5)
     TYPE(FM), DIMENSION(:,:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4,is5:ie5))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm5
 
   SUBROUTINE allocate_array_dc1(a,is1,ie1)
     DOUBLE COMPLEX, DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc1
   SUBROUTINE allocate_array_dc2(a,is1,ie1,is2,ie2)
     DOUBLE COMPLEX, DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc2
   SUBROUTINE allocate_array_dc3(a,is1,ie1,is2,ie2,is3,ie3)
     DOUBLE COMPLEX, DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc3
   SUBROUTINE allocate_array_dc4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     DOUBLE COMPLEX, DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc4
 
 
   SUBROUTINE allocate_array_i1(a,is1,ie1)
     INTEGER, DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=0
   END SUBROUTINE allocate_array_i1
   SUBROUTINE allocate_array_i2(a,is1,ie1,is2,ie2)
     INTEGER, DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=0
   END SUBROUTINE allocate_array_i2
   SUBROUTINE allocate_array_i3(a,is1,ie1,is2,ie2,is3,ie3)
     INTEGER, DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=0
   END SUBROUTINE allocate_array_i3
   SUBROUTINE allocate_array_i4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=0
   END SUBROUTINE allocate_array_i4
   
 
   SUBROUTINE allocate_array_l1(a,is1,ie1)
     LOGICAL, DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=.false.
   END SUBROUTINE allocate_array_l1
   SUBROUTINE allocate_array_l2(a,is1,ie1,is2,ie2)
     LOGICAL, DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=.false.
   END SUBROUTINE allocate_array_l2
   SUBROUTINE allocate_array_l3(a,is1,ie1,is2,ie2,is3,ie3)
     LOGICAL, DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=.false.
   END SUBROUTINE allocate_array_l3
   SUBROUTINE allocate_array_l4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=.false.
   END SUBROUTINE allocate_array_l4
   SUBROUTINE allocate_array_str5(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5)
     CHARACTER(T5len), DIMENSION(:,:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4,is5:ie5))
     a='0'
   END SUBROUTINE allocate_array_str5
 
   SUBROUTINE print_FM(iout,XIN)
     ! print XIN Type FM variable 
     USE FMZM 
     
     IMPLICIT NONE
     !
     INTEGER,INTENT(IN) :: iout
     TYPE(FM),INTENT(IN) :: XIN
     CHARACTER(100)  :: ST1
 
     !
     CALL FM_ENTER_USER_ROUTINE
     !
     !             print XIN
     
     IF( iout .eq. 0 ) THEN 
        CALL FM_FORM(FMFRMT, XIN,ST1)
        WRITE(*,*) ADJUSTL(TRIM(ST1))
     ELSE 
        CALL FM_FORM(FMFRMT, XIN,ST1)
        WRITE(iout,*) ADJUSTL(TRIM(ST1))
     ENDIF 
     !
     CALL FM_ENTER_USER_ROUTINE
     !
   END SUBROUTINE print_FM
   
 END MODULE basic
diff --git a/GKCoulomb/curlyNpjmn/fort.90 b/GKCoulomb/curlyNpjmn/fort.90
index 23fc6bb..399efdc 100644
--- a/GKCoulomb/curlyNpjmn/fort.90
+++ b/GKCoulomb/curlyNpjmn/fort.90
@@ -1,8 +1,8 @@
 &BASIC
-pmax = 25
-jmax = 15
-NbOfCoeffs = 31744
-idmaxT5=30
-T5dir = '/misc/bjfrei/coeffs_backup/T5src/'
+! hermite-Laguerrre resolution 
+pmax =3
+jmax = 2
+
+! number of coefficient per hermite-Lagurre gyro-momentes
 restart = .false.
 /
diff --git a/GKCoulomb/curlyNpjmn/src/basic_mod.f90 b/GKCoulomb/curlyNpjmn/src/basic_mod.f90
index 7fb79fe..58ff177 100644
--- a/GKCoulomb/curlyNpjmn/src/basic_mod.f90
+++ b/GKCoulomb/curlyNpjmn/src/basic_mod.f90
@@ -1,315 +1,332 @@
 MODULE basic
   !   Basic module 
 
   USE prec_const
   USE FMZM
 
   
   IMPLICIT NONE
   !
   ! input dimension
   integer :: Pmax  ! Hermite resolution
   integer :: Jmax  ! Laguerre resolution
 
   integer :: PMAXX   ! p = l + 2 (k + n)
   integer :: JMAXX   ! energy component
   integer :: NFLRMAXX  ! FLR indices 
   integer :: ColMAXX
-  ! Nb of coefficients
   integer :: NbOfCoeffs
  
   ! restart flag 
   logical :: restart
 
   ! dimension labels
   character*3 :: PMAXX_str,JMAXX_str,NFLRMAXX_str
 
 
   !  List of logical file units
   INTEGER :: lu_in   = 90              ! File duplicated from STDIN
 
   ! Output format KOUT
   CHARACTER(len=7) :: FMFRMT = 'F100.20'
 
   ! max and min indices per MPI process
 
   ! MPI Stuff 
   ! MPI handles and variables
   INTEGER :: ierr                    ! flag for MPI error
   INTEGER :: nprocs                  ! number of processors
   INTEGER :: me =0                   ! Rank of processor
   CHARACTER(6) :: me_str             ! string containing Rank of MPI proc.
 
   integer :: idx_s_l,idx_e_l  ! local indices
   integer :: nb_l ! number of local coefficients
   integer :: chksz
   
   integer :: pmin_l,pmax_l
   integer :: jmin_l,jmax_l
   integer :: mmin_l,mmax_l
   integer:: nmin_l,nmax_l
 
   ! CPU TIME in s
   REAL(dp) :: start_time
   REAL(dp):: end_time
   REAL(dp) :: cpu_ellapsed_time
 
   !
   ! MPI WALL TIME 
   REAL(dp) :: starttime
   REAL(dp) :: endtime
 
   ! system clock
   INTEGER :: count_start,count_rate,count_stop  
   REAL(dp) :: system_ellapsed_time
 
   INTEGER :: idMAXT5
   INTEGER,PARAMETER :: T5len= 100
   INTEGER,PARAMETER :: NNLKMPJlen = 14
 
   INTERFACE allocate_array
     MODULE PROCEDURE allocate_array_dp1,allocate_array_dp2,allocate_array_dp3,allocate_array_dp4
     MODULE PROCEDURE allocate_array_fm1,allocate_array_fm2,allocate_array_fm3,allocate_array_fm5
     MODULE PROCEDURE allocate_array_dc1,allocate_array_dc2,allocate_array_dc3,allocate_array_dc4
     MODULE PROCEDURE allocate_array_i1,allocate_array_i2,allocate_array_i3,allocate_array_i4
     MODULE PROCEDURE allocate_array_l1,allocate_array_l2,allocate_array_l3,allocate_array_l4
     MODULE PROCEDURE allocate_array_str5
   END INTERFACE allocate_array
 
 CONTAINS
 
   !================================================================================
   SUBROUTINE basic_data
     !   Read basic data from input file
 
     use prec_const
     IMPLICIT NONE
+
+    !locs. vars.
+    INTEGER :: buff_, NN, ENDOF, fid
+
     ! Namelist
-    NAMELIST /BASIC/Pmax,Jmax,NbOfCoeffs, restart
+    NAMELIST /BASIC/Pmax,Jmax, restart
 
     !     !                            READ INPUT BASIC 
     IF( me .ne. 0 ) GOTO 110
     READ(lu_in,basic)
     WRITE(*,basic)
 110 CONTINUE
     !
     ! Broadcast from PE 0 to 
     !    
     CALL MPI_bcast(Pmax,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
     CALL MPI_bcast(Jmax,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
-    CALL MPI_bcast(NbOfCoeffs,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
     CALL MPI_bcast(restart,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr)
     !
     ColMAXX = numb(Pmax,Jmax)
     !
+    ! get number of coeff to be cumputed and distributed along the MPI tasks
+    
+    OPEN(fid,FILE = 'indices.in')
+    !
+    NN = 0
+    ENDOF = 0 
+    DO WHILE (ENDOF .eq. 0) 
+       READ(fid,*,IOSTAT=ENDOF) buff_ 
+       NN = NN +1
+    ENDDO
+    CLOSE(fid)
+    !
+    NbOfCoeffs = NN -1
+    print*, 'Numer of coefficients to be computed: ', NbOfCoeffs
+    !
   END SUBROUTINE basic_data
   !================================================================================
   SUBROUTINE daytim(str)
     !   Print date and time
 
     use prec_const
     IMPLICIT NONE
     
     CHARACTER(len=*) , INTENT(in) :: str
     CHARACTER(len=16) :: d, t, dat, time
     !________________________________________________________________________________
     !
     CALL DATE_AND_TIME(d,t)
     dat=d(7:8) // '/' // d(5:6) // '/' // d(1:4)
     time=t(1:2) // ':' // t(3:4) // ':' // t(5:10)
     IF( me .eq. 0) WRITE(*,'(a,1x,a,1x,a)') str, dat(1:10), time(1:12)
     !
   END SUBROUTINE daytim
   !================================================================================
   SUBROUTINE clock(endorstart)
     !
     IMPLICIT NONE
     !
     INTEGER,INTENT(IN) :: endorstart
     !
     IF(endorstart .eq. 1) THEN 
        CALL system_clock(count = count_start, count_rate  = count_rate)
     ELSEIF (endorstart .eq. -1) THEN
        CALL system_clock(count = count_stop)
        system_ellapsed_time = real(count_stop - count_start)/real( count_rate)
     ENDIF
     !
   END SUBROUTINE clock
   !================================================================================
 
 ! To allocate arrays of doubles, integers, etc. at run time
 
   SUBROUTINE allocate_array_dp1(a,is1,ie1)
     real(dp), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp1
   SUBROUTINE allocate_array_dp2(a,is1,ie1,is2,ie2)
     real(dp), DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp2
   SUBROUTINE allocate_array_dp3(a,is1,ie1,is2,ie2,is3,ie3)
     real(dp), DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp3
   SUBROUTINE allocate_array_dp4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     real(dp), DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=0.0_dp
   END SUBROUTINE allocate_array_dp4
 
 
   !__________________ TO ALLOCATE FM ARRAYS_________________
   SUBROUTINE allocate_array_fm2(a,is1,ie1,is2,ie2)
     TYPE(FM), DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm2
 
   SUBROUTINE allocate_array_fm1(a,is1,ie1)
     TYPE(FM), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1   
     ALLOCATE(a(is1:ie1))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm1
 
   SUBROUTINE allocate_array_fm3(a,is1,ie1,is2,ie2,is3,ie3)
     TYPE(FM), DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm3
 
   SUBROUTINE allocate_array_fm5(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5)
     TYPE(FM), DIMENSION(:,:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4,is5:ie5))
     a=TO_FM('0.0')
   END SUBROUTINE allocate_array_fm5
 
   SUBROUTINE allocate_array_dc1(a,is1,ie1)
     DOUBLE COMPLEX, DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc1
   SUBROUTINE allocate_array_dc2(a,is1,ie1,is2,ie2)
     DOUBLE COMPLEX, DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc2
   SUBROUTINE allocate_array_dc3(a,is1,ie1,is2,ie2,is3,ie3)
     DOUBLE COMPLEX, DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc3
   SUBROUTINE allocate_array_dc4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     DOUBLE COMPLEX, DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=CMPLX(0.0_dp,0.0_dp)
   END SUBROUTINE allocate_array_dc4
 
 
   SUBROUTINE allocate_array_i1(a,is1,ie1)
     INTEGER, DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=0
   END SUBROUTINE allocate_array_i1
   SUBROUTINE allocate_array_i2(a,is1,ie1,is2,ie2)
     INTEGER, DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2   
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=0
   END SUBROUTINE allocate_array_i2
   SUBROUTINE allocate_array_i3(a,is1,ie1,is2,ie2,is3,ie3)
     INTEGER, DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=0
   END SUBROUTINE allocate_array_i3
   SUBROUTINE allocate_array_i4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=0
   END SUBROUTINE allocate_array_i4
   
 
   SUBROUTINE allocate_array_l1(a,is1,ie1)
     LOGICAL, DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1
     ALLOCATE(a(is1:ie1))
     a=.false.
   END SUBROUTINE allocate_array_l1
   SUBROUTINE allocate_array_l2(a,is1,ie1,is2,ie2)
     LOGICAL, DIMENSION(:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2
     ALLOCATE(a(is1:ie1,is2:ie2))
     a=.false.
   END SUBROUTINE allocate_array_l2
   SUBROUTINE allocate_array_l3(a,is1,ie1,is2,ie2,is3,ie3)
     LOGICAL, DIMENSION(:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3))
     a=.false.
   END SUBROUTINE allocate_array_l3
   SUBROUTINE allocate_array_l4(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4)
     LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4))
     a=.false.
   END SUBROUTINE allocate_array_l4
   SUBROUTINE allocate_array_str5(a,is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5)
     CHARACTER(T5len), DIMENSION(:,:,:,:,:), ALLOCATABLE, INTENT(INOUT) :: a
     INTEGER, INTENT(IN) :: is1,ie1,is2,ie2,is3,ie3,is4,ie4,is5,ie5
     ALLOCATE(a(is1:ie1,is2:ie2,is3:ie3,is4:ie4,is5:ie5))
     a='0'
   END SUBROUTINE allocate_array_str5
 
 
    INTEGER FUNCTION numb(pp,jj)
   ! 1D Hermite-Laguerre index mapping function 
   INTEGER, INTENT(in) :: pp,jj
   numb = (Jmax +1)*pp + 1 + jj
   END FUNCTION numb
 
 
   SUBROUTINE print_FM(iout,XIN)
     ! print XIN Type FM variable 
     USE FMZM 
     
     IMPLICIT NONE
     !
     INTEGER,INTENT(IN) :: iout
     TYPE(FM),INTENT(IN) :: XIN
     CHARACTER(100)  :: ST1
 
     !
     CALL FM_ENTER_USER_ROUTINE
     !
     !             print XIN
     
     IF( iout .eq. 0 ) THEN 
        CALL FM_FORM(FMFRMT, XIN,ST1)
        WRITE(*,*) ADJUSTL(TRIM(ST1))
     ELSE 
        CALL FM_FORM(FMFRMT, XIN,ST1)
        WRITE(iout,*) ADJUSTL(TRIM(ST1))
     ENDIF 
     !
     CALL FM_ENTER_USER_ROUTINE
     !
   END SUBROUTINE print_FM
   
 END MODULE basic