SUBROUTINE ConvXyzZmat(nb,x,y,z,ind_zmat,val_zmat)

  Use VarTypes

  IMPLICIT NONE

  integer(KINT) :: i,i1,i2

  integer(KINT) :: n1,n2,n3,n4,nb
  real(KREAL) ::  x(Nb),y(Nb),z(Nb)
  real(KREAL) ::  val_zmat(Nb,3)
  integer(KINT) :: ind_zmat(Nb,5)
  real(KREAL) ::  vx1,vy1,vz1,norm1
  real(KREAL) ::  vx2,vy2,vz2,norm2
  real(KREAL) ::  vx3,vy3,vz3,norm3
  real(KREAL) ::  vx4,vy4,vz4,norm4
  real(KREAL) ::  vx5,vy5,vz5,norm5
  real(KREAL) ::  val,val_d

  LOGICAL :: Debug


  INTERFACE
     function valid(string) result (isValid)
       CHARACTER(*), intent(in) :: string
       logical                  :: isValid
     END function VALID

     FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
       use Path_module, only :  Pi,KINT, KREAL
       real(KREAL) ::  v1x,v1y,v1z,norm1
       real(KREAL) ::  v2x,v2y,v2z,norm2
       real(KREAL) ::  angle
     END FUNCTION ANGLE


     FUNCTION angle_d(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2,v3x,v3y,v3z,norm3)
       use Path_module, only :  Pi,KINT, KREAL
       real(KREAL) ::  v1x,v1y,v1z,norm1
       real(KREAL) ::  v2x,v2y,v2z,norm2
       real(KREAL) ::  v3x,v3y,v3z,norm3
       real(KREAL) ::  angle_d,ca,sa
     END FUNCTION ANGLE_D

  END INTERFACE

  debug=valid("ConvXyzZmat")

 if (debug) THEN
     Call Header("ConvXyz Zmat")
     WRITe(*,*) Nb
     DO I=1,Nb
        WRITe(*,'(3(1X,F15.8))') x(I),y(i),z(i)
     END DO
  END IF
  IF (nb .GE. 1) THEN

     val_zmat(1,1)=0.0
     val_zmat(1,2)=0.0
     val_zmat(1,3)=0.0
     !        write(*,*) 'Debut procedure Xyz_Zmat'

     IF (nb .GE. 2) THEN
        !            write(*,*) 'Debut procedure Xyz_Zmat 2'
        i=2
        n1=ind_zmat(i,1)
        n2=ind_zmat(i,2)

        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
        !           write(*,11) n1,n2,norm1

        val_zmat(i,1)=norm1
        val_zmat(i,2)=0.0
        val_zmat(i,3)=0.0

        IF (nb .GE. 3) THEN
           !        write(*,*) 'Debut procedure Xyz_Zmat3'
           i=3
           n1=ind_zmat(i,1)
           n2=ind_zmat(i,2)
           n3=ind_zmat(i,3)

           CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)

           CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
           val=angle(vx1,vy1,vz1,norm1, &
                vx2,vy2,vz2,norm2)

           val_zmat(i,1)=norm1
           val_zmat(i,2)=val
           val_zmat(i,3)=0.0

           DO i=4,nb
              !        write(*,*) 'Debut procedure Xyz_Zmat4'
              n1=ind_zmat(i,1)
              n2=ind_zmat(i,2)
              n3=ind_zmat(i,3)
              n4=ind_zmat(i,4)

              CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)

              !        write(*,*) 'Debut procedure Xyz_Zmat42'
              CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
              val=angle(vx1,vy1,vz1,norm1, &
                   vx2,vy2,vz2,norm2)

              !        write(*,*) 'Debut procedure Xyz_Zmat43'
              CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
              CALL produit_vect(vx1,vy1,vz1,norm1, &
                   vx2,vy2,vz2,norm2, &
                   vx4,vy4,vz4,norm4)
              CALL produit_vect(vx3,vy3,vz3,norm3, &
                   vx2,vy2,vz2,norm2, &
                   vx5,vy5,vz5,norm5)
              val_d=angle_d(vx4,vy4,vz4,norm4, &
                   vx5,vy5,vz5,norm5, &
                   vx2,vy2,vz2,norm2)

              !               write(*,11) n1,n2,norm1,n3,val,n4,val_d
11            format (2(1x,i3),1x,f8.4,2(1x,i3,1x,f8.3))

              val_zmat(i,1)=norm1
              val_zmat(i,2)=val
              val_zmat(i,3)=val_d

           END DO
        END IF
     END IF
  ELSE
     RETURN
  END IF
  RETURN
END SUBROUTINE ConvXyzZmat
