      !***********************************************************************!
      SUBROUTINE  communication(  u,  ip_xy,  ip_xz,  ip_yz,  voisin,  comm3d)
      !***********************************************************************!
!
      USE MPI
!
      USE numerics
!
      IMPLICIT  NONE
!
!--Declaration des arguments
!
!Matrice
      REAL(rp),  DIMENSION(sx-1:ex+1,sy-1:ey+1,sz-1:ez+1,0:1), INTENT(INOUT)  ::  u
!
!Types  type_plan
      INTEGER,  INTENT(IN)  ::  ip_xy,  ip_xz,  ip_yz
!
!Tableau  contenant  les  voisins  du  domaine  courant
      INTEGER,  PARAMETER  ::  NB_VOISINS  =  6
      INTEGER,  PARAMETER  ::  N=1,  E=2,  S=3,  W=4,  AV=5,  AR=6
      INTEGER,  DIMENSION(NB_VOISINS),  INTENT(IN)  ::  voisin
!
! communicateur
      INTEGER,  INTENT(IN)  ::  comm3d
!
!
!--Declaration des variales locales
!
!Constantes  MPI
      INTEGER,  PARAMETER  ::  tag1=100
      INTEGER,  PARAMETER  ::  tag2=200
      INTEGER,  DIMENSION(MPI_STATUS_SIZE)  ::  status
!
      !***********************************************************************!
!
!Envoi  au  voisin  N  et  reception  du  voisin  S
!en  utilisant  le  type  predefini  ip_xz,  plan  xOz
      CALL  MPI_SENDRECV( &
            u(sx,ey,  sz,iold),  1,  ip_xz,  voisin(N),  tag1, &
            u(sx,sy-1,sz,iold),  1,  ip_xz,  voisin(S),  tag1, &
            comm3d,  status,  ierr )
!
!====
!
!Envoi  au  voisin  S  et  reception  du  voisin  N
!en  utilisant  le  type  predefini  ip_xz,  plan  xOz
      CALL  MPI_SENDRECV( &
            u(sx,sy,  sz,iold),  1,  ip_xz,  voisin(S),  tag2, &
            u(sx,ey+1,sz,iold),  1,  ip_xz,  voisin(N),  tag2, &
            comm3d,  status,  ierr )
!
!=========
!=========
!
!Envoi  au  voisin  W  et  reception  du  voisin  E
!en  utilisant  le  type  predefini  ip_yz,  plan  yOz
!type_ligne
      CALL  MPI_SENDRECV( &
            u(sx,  sy,sz,iold),  1,  ip_yz,  voisin(W),  tag1, &
            u(ex+1,sy,sz,iold),  1,  ip_yz,  voisin(E),  tag1, &
            comm3d,  status,  ierr )
!
!====
!
!Envoi  au  voisin  E  et  reception  du  voisin  W
!en  utilisant  le  type  predefini  ip_yz,  plan  yOz
      CALL  MPI_SENDRECV( &
            u(ex,  sy,sz,iold),  1,  ip_yz,  voisin(E),  tag2, &
            u(sx-1,sy,sz,iold),  1,  ip_yz,  voisin(W),  tag2, &
            comm3d,  status,  ierr )
!
!=========
!=========
!
!Envoi  au  voisin  AV  et  reception  du  voisin  AR
!en  utilisant  le  type  predefini  ip_xy,  plan  xOy
      CALL  MPI_SENDRECV( &
            u(sx,sy,sz,  iold),  1,  ip_xy,  voisin(AV),  tag1, &
            u(sx,sy,ez+1,iold),  1,  ip_xy,  voisin(AR),  tag1, &
            comm3d,  status,  ierr )
!
!====
!
!Envoi  au  voisin  AR  et  reception  du  voisin  AV
!en  utilisant  le  type  predefini  ip_xy,  plan  xOy
      CALL  MPI_SENDRECV( &
            u(sx,sy,ez,  iold),  1,  ip_xy,  voisin(AR),  tag2, &
            u(sx,sy,sz-1,iold),  1,  ip_xy,  voisin(AV),  tag2, &
            comm3d,  status,  ierr )
!
      RETURN
      END  SUBROUTINE  communication

