 SUBROUTINE splitdom_Z (bl,nb_bloc,nbdv,ndim)
!=========================== DOCUMENTATION =============================
!DOCDEBh*    UTI/PRE/splitdom_curve  *
!
!    NOM
!  splitdom_curve (bl,nb_bloc,nbdv,ndim)
!    DESCRIPTION  
!*
!  Affectation de numeros de domaines pour les courbes (Zorder, Hilbert,...)
!  Assign domain numbers for curves (Zorder, Hilbert,...)
!*
! 
! 
! 
!    ENTREES / INPUT
! bl      : liste des blocs a repartir / list of blocks to distribute
! nb_bloc : nombre de blocs / number of blocks
! nbdv    : nombre de domaines desires / number of domains required
! ndim    : dimension du maillage 1/1D, 2/2D , 3/3D  / mesh dimension 1/1D, 2/2D, 3/3D
!
!    SORTIES / OUTPUT
! bl      : liste des blocs avec un numero de domaine attribue / list of blocks with assigned domain number
! 
!    SOURCE
! Ce logiciel est regi par la licence [CeCILL-B]
! This software is governed by the [CeCILL-B] license
!=========================== DECLARATIONS ==============================
!.1-----  Implicit, Use
  use num
  !USE uti
  IMPLICIT NONE
!.2-----  Declaration

  integer, intent(in)                   :: nb_bloc !! Nombre de blocs / Number of blocks
  integer, intent(in)                   :: nbdv  !! Nombre de domaines desires / Number of domains required
  integer, intent(in)                   :: ndim !! Dimension du probleme / Problem dimension
  type(bloc),dimension(:),intent(inout) :: bl !! Liste des blocs / list of blocks
  
  integer,allocatable,dimension(:,:)      :: inum
  integer                               :: ib, nbcell_obj,nbd_obj,numdom,nbcell_deb
!====================== START OF THE EXECUTABLE CODE  ==================
IF (nbdv.gt.nb_bloc)  call print_err('SPLITDOM_Z', 'Oupsss ....')

  allocate(inum(nb_bloc,3))
  DO ib=1,nb_bloc
        inum(bl(ib)%morton,1)=ib ! position du bloc dans la liste z-order
        IF (ndim.eq.1) inum(bl(ib)%morton,2)=bl(ib)%nx*2**(bl(ib)%nrb) ! nbre de cellules du bloc
        IF (ndim.eq.2) inum(bl(ib)%morton,2)=bl(ib)%nx*2**(bl(ib)%nrb)*bl(ib)%ny*2**(bl(ib)%nrb)
        IF (ndim.eq.3) inum(bl(ib)%morton,2)=bl(ib)%nx*2**(bl(ib)%nrb)*bl(ib)%ny*2**(bl(ib)%nrb)*bl(ib)%nz*2**(bl(ib)%nrb)
  END DO
   inum(1,3)=inum(1,2)
  DO ib=2,nb_bloc
        inum(ib,3)=inum(ib,2)+inum(ib-1,3) ! nombre de cellules cumule  en suivant le z-order   
  END DO
  
  nbcell_obj=int(inum(nb_bloc,3)/nbdv) ! Objectif Nbre de cellule par domaine
  numdom=1
  nbd_obj=nbdv ! nbre de domaines restant a traiter
  nbcell_deb=0
  do ib=1,nb_bloc
      bl(inum(ib,1))%idom=numdom
      if(inum(ib,3)-nbcell_deb.ge.nbcell_obj)then
          numdom=numdom+1
          nbd_obj=nbd_obj-1
          nbcell_deb=inum(ib,3)
          if(nbd_obj.eq.1)nbcell_obj=inum(nb_bloc,3)-nbcell_deb+1
          !nbcell_obj=nbcell_obj+inum(ib,3) !int((inum(nb_bloc,3)-inum(ib,3))/nbd_obj)
      endif
  enddo
deallocate(inum)

!===========================   END OF THE SUBROUTINE    ====================
END SUBROUTINE splitdom_Z
!DOCFIN
