      !***********************************************************************!
      SUBROUTINE  prodscal(  gnorm,  a,  b,  comm3d  )
      !***********************************************************************!
!
      USE MPI
!
      USE numerics
!
      IMPLICIT  NONE
!
!Valeur du produit scalaire
      REAL(rp),  INTENT(OUT)   ::  gnorm
!
!Solution  u  a  l'iteration  it  et  it+1
      REAL(rp),  DIMENSION(  sx-1:ex+1,  sy-1:ey+1,  sz-1:ez+1),  INTENT(IN)  ::  a
      REAL(rp),  DIMENSION(  sx-1:ex+1,  sy-1:ey+1,  sz-1:ez+1),  INTENT(IN)  ::  b
!
! communicateur
      INTEGER,  INTENT(IN)  ::  comm3d
!
!--Declaration des variales locales
!
!
!Norme partielle
      REAL(rp)  ::  lnorm = zero
!
!Compteurs
      INTEGER   ::  i,  j,  k
!
!norme partielle
      !***********************************************************************!
!
!$OMP MASTER
      IF ( myrank == 0 ) write (6,*) 'lnorm = ', lnorm
!$OMP END MASTER
!
!$OMP DO REDUCTION( +:lnorm )
      DO  k  =  sz,  ez
         DO  j  =  sy,  ey
            DO  i  =  sx,  ex
               lnorm = lnorm + a(i,j,k) * b(i,j,k)
            END  DO
         END  DO
      END  DO
!$OMP END DO
!
!$OMP MASTER
      gnorm = zero
      CALL  MPI_ALLREDUCE(  lnorm,  gnorm,  1,  ITYPE_REAL,  &
                            MPI_SUM,  comm3d,  ierr  )
      lnorm = zero
!$OMP END MASTER
!$OMP BARRIER
!
      RETURN
      END  SUBROUTINE  prodscal
