      !***********************************************************************!
      SUBROUTINE  p_comm(  p, ptabN, ptabE, ptabS, ptabW, ptabAV, ptabAR, voisin  )
      !***********************************************************************!
!
! Mise des interfaces du tableau p
!
      USE numerics
!
      IMPLICIT  NONE
!
      INCLUDE 'comthd.h'
!
      INCLUDE 'p_comptr.h'
!
!--Declaration des arguments
!
!Vecteur intermediaire
      REAL(rp),  DIMENSION(sx-1:ex+1,sy-1:ey+1,sz-1:ez+1),  INTENT(INOUT)  ::  p
!
!Buffers locaux de donnees
      REAL(rp),  DIMENSION(sy:ey,sz:ez),  INTENT(OUT)  ::  ptabE
      REAL(rp),  DIMENSION(sy:ey,sz:ez),  INTENT(OUT)  ::  ptabW
      REAL(rp),  DIMENSION(sx:ex,sz:ez),  INTENT(OUT)  ::  ptabS
      REAL(rp),  DIMENSION(sx:ex,sz:ez),  INTENT(OUT)  ::  ptabN
      REAL(rp),  DIMENSION(sx:ex,sy:ey),  INTENT(OUT)  ::  ptabAV
      REAL(rp),  DIMENSION(sx:ex,sy:ey),  INTENT(OUT)  ::  ptabAR
!
!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
!
!--Declaration des variales locales
!
!Compteurs
      INTEGER  ::  i, j, k
!
      !***********************************************************************!
!
!Preparation des buffers
!
      IF( voisin(N) /= -1 ) THEN
!
         DO k = sz, ez
            DO i = sx, ex
               ptabN(i,k) = p(i,ey,k)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin E
      IF( voisin(E) /= -1 ) THEN
!
         DO k = sz, ez
            DO j = sy, ey
               ptabE(j,k) = p(ex,j,k)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin S
      IF( voisin(S) /= -1 ) THEN
!
         DO k = sz, ez
            DO i = sx, ex
               ptabS(i,k) = p(i,sy,k)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin W
      IF( voisin(W) /= -1 ) THEN
!
         DO k = sz, ez
            DO j = sy, ey
               ptabW(j,k) = p(sx,j,k)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin AV
      IF( voisin(AV) /= -1 ) THEN
!
         DO j = sy, ey
            DO i = sx, ex
               ptabAV(i,j) = p(i,j,ez)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin AR
      IF( voisin(AR) /= -1 ) THEN
!
         DO j = sy, ey
            DO i = sx, ex
               ptabAR(i,j) = p(i,j,sz)
             END DO
         END DO
!
      END IF
!
!Barriere de synchronisation avant lecture chez les voisins
!
!$OMP BARRIER
!
!Recuperation du buffer voisin N
      IF( voisin(N) /= -1 ) THEN
!
         DO k = sz, ez
            DO i = sx, ex
               p(i,ey+1,k) = rptabN(i,k)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin E
      IF( voisin(E) /= -1 ) THEN
!
         DO k = sz, ez
            DO j = sy, ey
               p(ex+1,j,k) = rptabE(j,k)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin S
      IF( voisin(S) /= -1 ) THEN
!
         DO k = sz, ez
            DO i = sx, ex
               p(i,sy-1,k) = rptabS(i,k)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin W
      IF( voisin(W) /= -1 ) THEN
!
         DO k = sz, ez
            DO j = sy, ey
               p(sx-1,j,k) = rptabW(j,k)
               i = i + 1
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin AV
      IF( voisin(AV) /= -1 ) THEN
!
         DO j = sy, ey
            DO i = sx, ex
               p(i,j,ez+1) = rptabAV(i,j)
            END DO
         END DO
!
      END IF
!
!Recuperation du buffer voisin AR
      IF( voisin(AR) /= -1 ) THEN
!
         DO j = sy, ey
            DO i = sx, ex
               p(i,j,sz-1) = rptabAR(i,j)
             END DO
         END DO
!
      END IF
!
      RETURN
      END  SUBROUTINE  p_comm
