MODULE species_mod
  USE :: basic
  IMPLICIT NONE
  PRIVATE

  ! Classe that encapsulate all atributes and methods for one arbitrary species
  TYPE, PUBLIC :: species_class
      REAL(dp), PUBLIC :: q     !charge
      REAL(dp), PUBLIC :: sigma !sqrt masse ratio w.r.t. ion mass
      REAL(dp), PUBLIC :: tau   !temperatrue ratio w.r.t. electron temp.
      INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: parray ! Hermite degrees
      INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC :: jarray ! Laguerre degrees
      ! Hermite-Moments: N_a^pj ! DIMENSIONs correspond to: p, j, kx, ky, z, updatetlevel.
      COMPLEX(dp), DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: moments
      ! Arrays to store the rhs, for time integration (ip,ij,ikx,iky,iz,updatetlevel)
      COMPLEX(dp), DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: moments_rhs
      ! Non linear term array (ip,ij,ikx,iky,iz)
      COMPLEX(dp), DIMENSION(:,:,:,:,:),   ALLOCATABLE :: Sapj
      ! lin rhs p,j coefficient storage (ip,ij)
      REAL(dp), DIMENSION(:,:), ALLOCATABLE :: xnapj
      REAL(dp), DIMENSION(:),   ALLOCATABLE :: xnapp1j, xnapm1j,   xnapp2j,   xnapm2j, xnapjp1, xnapjm1
      REAL(dp), DIMENSION(:,:), ALLOCATABLE :: ynapp1j, ynapm1j,   ynapp1jm1, ynapm1jm1 ! mirror lin coeff for non adiab mom
      REAL(dp), DIMENSION(:,:), ALLOCATABLE :: zNapm1j, zNapm1jp1, zNapm1jm1            ! mirror lin coeff for adiab mom
      ! Kernel function evaluation (ij,ikx,iky,iz)
      REAL(dp), DIMENSION(:,:,:,:), ALLOCATABLE :: kernel
      !! Diagnostics
      ! Gyrocenter density (ikx,iky,iz)
      COMPLEX(dp), DIMENSION(:,:,:), ALLOCATABLE :: Na00

      ! particle density (ikx,iky,iz)
      COMPLEX(dp), DIMENSION(:,:,:), ALLOCATABLE :: density

      ! particle temperature for electron and ions (ikx,iky,iz)
      COMPLEX(dp), DIMENSION(:,:,:), ALLOCATABLE :: temperature

    CONTAINS
      ! Initialization procedures
      PROCEDURE, PUBLIC :: init                => species_init
      PROCEDURE, PUBLIC :: setup_arrays        => species_setup_arrays
      PROCEDURE, PUBLIC :: evaluate_kernels    => species_evaluate_kernels
      ! Diagnostics
      PROCEDURE, PUBLIC :: compute_density     => species_compute_density
      PROCEDURE, PUBLIC :: compute_temperature => species_compute_temperature
    END TYPE species_class

  ! Routines that every species may use
  CONTAINS
    SUBROUTINE species_setup_arrays(this)

    END SUBROUTINE

    SUBROUTINE species_compute_density(this)

    END SUBROUTINE

END MODULE