      SUBROUTINE gm_dims_create ( nbdims,  jdims,  nbthd,  ierr )
!
! Calcul du nombre de processus par direction spatiale
!
      USE numerics
!
      IMPLICIT NONE
!
INTERFACE
!
      INCLUDE 'i_nprime.h'
!
      INCLUDE 'i_tri.h'
!
END INTERFACE
!
! Declaration des arguments
!
! Nombre de threads OpenMP
      INTEGER,                        INTENT(IN)     ::  nbthd
!
! Nombre de directions spatiales
      INTEGER,                        INTENT(IN)     ::  nbdims
!
! Nombre de processus par direction spatiale
      INTEGER,  DIMENSION(1:nbdims),  INTENT(INOUT)  ::  jdims
!
! Code d'erreur
      INTEGER,                        INTENT(OUT)    ::  ierr
!
! Declaration des variables locales
!
      INTEGER  ::  nbd2
      INTEGER  ::  nbp2
      INTEGER,  DIMENSION(1:nbdims)  ::  jd2
!
      INTEGER,  DIMENSION(1)  ::  ipos
      INTEGER  ::  k, l
      INTEGER  ::  n2
!
! Tableau des diviseurs premiers
      INTEGER,  DIMENSION(1:10)  ::  ifact
!
! Nombre de diviseurs premiers
      INTEGER                    ::  nfact
!
! Debut de la subroutine
!
      nbp2 = nbthd
      nbd2 = nbdims
      ierr = 0
!
! Decomposition en facteurs premiers
      CALL nprime( nbthd, ifact, nfact )
!
! Prise en compte des dimensions pre-initialisees
      DO k = 1, nbdims
!
         IF ( jdims(k) < 0 ) THEN
            ierr = -11
            RETURN
         END IF
!
         IF ( jdims(k) > 0 ) THEN
!
            IF ( MOD( nbp2, jdims(k) ) /= 0 )  THEN
               ierr = -12
               RETURN
            END IF
!
            nbd2 = nbd2 - 1
            nbp2 = nbp2 / jdims(k)
         END IF
!
      END DO
!
      IF ( nbd2 == 0 ) RETURN
!
! Repartition des processus restants
      jd2 (1:nbd2) = 1
!
      ipos(1) = 1
      DO k = nfact, 1, -1
         jd2(ipos(1)) = jd2(ipos(1)) * ifact(k)
         ipos = MINLOC( jd2(1:nbd2) )
      END DO
!
! Tri des dimensions
      CALL tri( nbd2, jd2 )
!
! Remise en place des dimensions calculees
      l = 0
      DO k = 1, nbdims
!
         IF (jdims(k) == 0 ) THEN
            l = l + 1
            jdims(k) = jd2(l)
         END IF
!
      END DO
!
! Fin   de la subroutine
!
      RETURN
      END SUBROUTINE gm_dims_create

