!C================================================================
!C       Converti les positions Zmat en coordonnes cartesiennes
!C This version deals with the third atoms in A B C
!C  Used in Mix to Cart.
!C================================================================

        SUBROUTINE ConvertZmat_cart_3(iat,ind_zmat,d,a_val,x,y,z)

        use Path_module, only : Nat, KINT, KREAL

        IMPLICIT NONE

        integer(KINT) :: iat,n1,n2,n3
        real(KREAL)    :: x(nat),y(nat),z(nat)
        real(KREAL) ::  d,a_val
        integer(KINT) :: ind_zmat(Nat,5)

        real(KREAL) ::  vx1,vy1,vz1,norm1
        real(KREAL) ::  vvx1,vvy1,vvz1,normv1
        real(KREAL) ::  vx2,vy2,vz2,norm2
        real(KREAL) ::  vvx2,vvy2,vvz2,normv2
        real(KREAL) ::  vx3,vy3,vz3,norm3
        real(KREAL) ::  vx4,vy4,vz4,norm4
        real(KREAL) ::  a11_z1,a12_z1
        real(KREAL) ::  a11_z2,a12_z2
        real(KREAL) ::  a11_y,a12_y



!C ind_zmat(1) contient le numero de l'atome, (2) celui par rapport auquel on definit la distance...

          n1=ind_zmat(iat,2)
          n2=ind_zmat(iat,3)

!          WRITE(*,*) iat,n1,n2

!          WRITE(*,*) "d,val,di",d,a_val,a_dih,a_val*180./3.141592654

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

          vvx1=vx1
          vvy1=vy1
          vvz1=vz1

!c rotation autour de z de v1 de phi (a11_z1=cos(phi) et a12_z1=sin(phi) ) tq
!C  v1 soit dans le plan xOz

          normv1=dsqrt(vvx1*vvx1+vvy1*vvy1)

          IF (normv1 .GE. 1.D-6) THEN
             a11_z1 = vvx1/normv1
             a12_z1 = vvy1/normv1
           ELSE
             a11_z1 = 1
             a12_z1 = 0
          END IF

             CALL rota_z(vx1,vy1,vz1,a11_z1,-a12_z1)

!c rotation autour de y de v1 de theta (a11_y=cos(theta) et a12_y=sin(theta) ) tq
!C  v1 soit sur l'axe Ox


          IF (norm1 .GE. 1.D-8) THEN
             a11_y = vz1/norm1
             a12_y = vx1/norm1
          ELSE
             a11_y = 1
             a12_y = 0
          END IF

             CALL rota_y(vx1,vy1,vz1,a11_y,a12_y)


!c calcul le vecteur de l atome dans la nouvelle orientation

          vx4=d*sin(a_val)
          vy4=0.
           vz4=d*cos(a_val)

!c calcul le vecteur de l atome
!c on tourne en sens invers
          CALL rota_y(vx4,vy4,vz4,a11_y ,-a12_y )
          CALL rota_z(vx4,vy4,vz4,a11_z1, a12_z1)

!c calcul l atome a partir de v4
          x(iat)=vx4+x(n1)
          y(iat)=vy4+y(n1)
          z(iat)=vz4+z(n1)

        END

